在错误处理代码的上下文中,我想验证用户是否已将当前工作表中的另一个工作簿的相同名称提供给同一工作簿(当然,禁止操作)。因此,我直观地尝试验证这一点的方法只是循环遍历所有工作表并比较名称:
For Each sh In ThisWorkbook.Sheets
If sh.Name = ThisWorkbook.ActiveSheet.Name Then
'error handling here
End If
Next sh
然而,在以下情况下,这是一个巨大的逻辑下降:
1)用户正在编辑,比如纸张编号3; 2)同名表位于编号5;
在这种情况下,条件sh.Name = ThisWorkbook.ActiveSheet.Name
肯定会得到满足,因为工作表与自身进行比较。
所以,我想知道:如何了解sh
是不是ThisWorkbook.ActiveSheet
?
我曾经认为通过简单的对象比较可以简单地解决它的任务:
If (sh Is Not ThisWorkbook.ActiveSheet) And (sh.Name = ThisWorkbook.ActiveSheet.Name) Then
但这会引发编译错误,即 Object不支持此属性或方法。有谁能帮助我找到代码结构中缺乏逻辑的东西?
其他信息
我试图通过Err.Description
和Err.Number
管理案例,但第一个是依赖于操作系统语言的,第二个是我需要处理的其他类型的错误。
此外,工作表(名称和内容)包含在.xlam
加载项中,因此用户可以通过自定义用户表单更改内容,但不能通过Excel应用程序更改内容。
更一般地说,让我说我想知道如何进行比较,即使在这种特定情况下可以解决这个问题,以便将这种方法用于我已经计划进行的未来发展,无法通过默认的VBA错误处理程序进行管理。
答案 0 :(得分:4)
只需检查工作表的索引以及名称。 如果名称匹配,则只有错误(或其他),但索引不是。
Option Explicit
Public Sub test()
Dim wb As Workbook
Dim ws As Worksheet
Set wb = ThisWorkbook
Set ws = wb.ActiveSheet
Dim wsToCheck As Worksheet
For Each wsToCheck In wb.Worksheets
If ws.Name = wsToCheck.Name And ws.Index <> wsToCheck.Index Then
'do something
End If
Next
End Sub
当然,你也可能只是test for object equality using the Is
operator,或者你的具体情况不平等。
Public Sub test2()
Dim wb As Workbook
Dim ws As Worksheet
Set wb = ThisWorkbook
Set ws = wb.ActiveSheet
Dim wsToCheck As Worksheet
For Each wsToCheck In wb.Worksheets
If Not ws Is wsToCheck Then
'do something
Debug.Print ws.Name
End If
Next
End Sub
答案 1 :(得分:4)
“Not”的语法不正确;它应该是这样的:
If (Not sh Is ThisWorkbook.ActiveSheet) And (sh.Name = ThisWorkbook.ActiveSheet.Name) Then
答案 2 :(得分:-1)
没有理由循环收集工作表。使用此:
Function IsWshExists(ByVal wbk As Workbook, ByVal wshName As String) As Boolean
Dim wsh As Worksheet
On Error Resume Next
Set wsh = wbk.Worksheets(wshName)
IsWshExists = (Err.Number = 0)
Set wsh = Nothing
End Function
用法:
If Not IsWshExists(ThisWorkbook, "Sheet2") Then
'you can add worksheet ;)
'your logic here
End If