ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
123
返回列表 发新帖
楼主: 风雪霓华

[求助] 如何判断一个名称为“sheet1”的工作表是否存在?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2017-5-1 04:29 | 显示全部楼层
本帖最后由 抬头苦干 于 2017-5-1 09:58 编辑

学习了,涨知识啊。顺便对各位的跟帖做个小结。
【问题】判定某工作表(如工作表“SheetX”)是否存在。
【尝试】用 Is Nothing 判定,报运行时错误,提示下标越界:
  1. Sub IsNothingFail()
  2. Rem 不可用 Is Nothing 直接判定,否则报下标越界错误
  3.     If Worksheets("SheetX") Is Nothing Then
  4.        MsgBox "工作表 'SheetX' 不存在", vbCritical
  5.     Else
  6.        MsgBox "工作表 'SheetX' 已存在", vbInformation
  7.     End If
  8. End Sub
复制代码


【报错截图】
溢出.png


【四种解法】
根据讨论情况,目前该问题至少有四种解法:
【解法一】For-Each 遍历
  1. Sub ForEach_Traverse()
  2. Rem 这是最基本的思路,遍历各表名称,逐一判定
  3.     Dim ws As Worksheet, existed As Boolean
  4.     existed = False
  5.     For Each ws In Worksheets
  6.         If ws.Name = "SheetX" Then existed = True: Exit For
  7.     Next
  8.     If existed Then
  9.         MsgBox "工作表 'SheetX' 已存在", vbInformation
  10.     Else
  11.         MsgBox "工作表 'SheetX' 不存在", vbCritical
  12.     End If
  13. End Sub
复制代码


【解法二】On Error 捕获错误
  1. Sub OnError()
  2. Rem 根据 livewire、livewire、静静心、indexlee 代码整理
  3.     On Error Resume Next
  4.     If Worksheets("SheetX") Is Nothing Then:
  5.     If Err Then
  6.         MsgBox "工作表 'SheetX' 不存在", vbCritical
  7.         Err.Clear
  8.     Else
  9.         MsgBox "工作表 'SheetX' 已存在", vbInformation
  10.     End If
  11.     On Error GoTo 0
  12. End Sub
复制代码

【解法三】自定义函数辅助判定
  1. Sub DIY_Function()
  2. Rem 根据 白色GG 代码整理
  3.     If ExistSheet("SheetX") Then
  4.         MsgBox "工作表 'SheetX' 已存在", vbInformation
  5.     Else
  6.         MsgBox "工作表 'SheetX' 不存在", vbCritical
  7.     End If
  8. End Sub

  9. Function ExistSheet(Optional ByVal sheetName As String = "SheetX") As Boolean
  10.     Dim sh As Worksheet
  11.     On Error GoTo Err_Handle
  12.     Set sh = Worksheets(sheetName)
  13.     ExistSheet = IIf(sh Is Nothing, False, True)
  14.     Set sh = Nothing
  15.     Exit Function
  16. Err_Handle:
  17.     ExistSheet = False
  18. End Function
复制代码

【解法四】TypeName + Evaluate 判定(强烈推荐)
  1. Sub TypeName_Evaluate()
  2. Rem 根据 yaozong 代码整理(强烈推荐)
  3.     If TypeName([SheetX]) = "Worksheet" Then
  4.         MsgBox "工作表 'SheetX' 已存在", vbInformation
  5.     Else
  6.         MsgBox "工作表 'SheetX' 不存在", vbCritical
  7.     End If
  8. End Sub
复制代码





评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2017-7-11 16:01 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 greatlazy 于 2017-7-11 16:33 编辑
抬头苦干 发表于 2017-5-1 04:29
学习了,涨知识啊。顺便对各位的跟帖做个小结。
【问题】判定某工作表(如工作表“SheetX”)是否存在。
...

感谢辛苦总结.
但是根据我实际操作,发现第四中方法虽然好,但是不适用与中文命名的表单.
所以如果你的sheet里面有中的话,最好还是用【解法二】On Error 捕获错误

TA的精华主题

TA的得分主题

发表于 2017-7-11 16:06 | 显示全部楼层
关于第四种解法的方括号,可以看下面的帖子.
http://www.exceltip.net/thread-25207-1-1.html

TA的精华主题

TA的得分主题

发表于 2017-7-11 16:52 | 显示全部楼层
本帖最后由 greatlazy 于 2017-7-11 17:06 编辑

  • Sub OnError()
  • Rem 根据 livewire、livewire、静静心、indexlee 代码整理
  •     On Error Resume Next
  •     If Worksheets("SheetX") Is Nothing Then:          想请问这里的这个冒号是什么作用,而且代码后面应该也少了一个end if.
  •     If Err Then
  •         MsgBox "工作表 'SheetX' 不存在", vbCritical
  •         Err.Clear
  •     Else
  •         MsgBox "工作表 'SheetX' 已存在", vbInformation
  •     End If
  •     On Error GoTo 0
  • End Sub



我去除冒号,并再尾部添加了end if 后,发现代码没有任何反应.
求助.

TA的精华主题

TA的得分主题

发表于 2017-7-14 10:05 | 显示全部楼层
greatlazy 发表于 2017-7-11 16:52
  • Sub OnError()
  • Rem 根据 livewire、livewire、静静心、indexlee 代码整理
  •     On Error Resum ...

  • 这里的冒号相当于一个空语句,表示【:】的左边与【Then】右边的某个单语句的结束(实际上没有任何语句执行),它也等效于在下一行写上End If:
    1.     If Worksheets("SheetX") Is Nothing Then
    2.     End If
    复制代码

    TA的精华主题

    TA的得分主题

    发表于 2017-7-17 10:37 | 显示全部楼层
    抬头苦干 发表于 2017-7-14 10:05
    这里的冒号相当于一个空语句,表示【:】的左边与【Then】右边的某个单语句的结束(实际上没有任何语句执 ...

    非常感谢,真是非常详细.

    TA的精华主题

    TA的得分主题

    发表于 2017-12-4 09:45 | 显示全部楼层

    TA的精华主题

    TA的得分主题

    发表于 2018-3-23 09:20 | 显示全部楼层
    [广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
    on error resume next
    配合if X is nothing。当初也是用遍历,感觉好累,谢谢各位大神

    TA的精华主题

    TA的得分主题

    发表于 2019-1-20 15:55 | 显示全部楼层
    [广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
    总结的好, 如果用的地方多,直接用function

    TA的精华主题

    TA的得分主题

    发表于 2020-6-17 21:56 | 显示全部楼层
    抬头苦干 发表于 2017-5-1 04:29
    学习了,涨知识啊。顺便对各位的跟帖做个小结。
    【问题】判定某工作表(如工作表“SheetX”)是否存在。
    ...

    很好,很棒。
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

    关闭

    最新热点上一条 /1 下一条

    手机版|关于我们|联系我们|ExcelHome

    GMT+8, 2024-4-20 01:10 , Processed in 0.034593 second(s), 9 queries , Gzip On, MemCache On.

    Powered by Discuz! X3.4

    © 1999-2023 Wooffice Inc.

    沪公网安备 31011702000001号 沪ICP备11019229号-2

    本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

    快速回复 返回顶部 返回列表