比较两个 Sheet 对象(不是内容)

Comparing two Sheet objects (not contents)

在错误处理代码的上下文中,我想验证用户是否已将当前 sheet 与另一个相同的名称输入同一工作簿(当然,禁止操作)。因此,我凭直觉尝试验证这一点的方法只是循环遍历所有 sheet 并比较名称:

For Each sh In ThisWorkbook.Sheets
    If sh.Name = ThisWorkbook.ActiveSheet.Name Then
        'error handling here
    End If
Next sh

但是,在以下情况下这是一个巨大的逻辑错误:

1) 用户正在编辑,比方说,sheet 数字 3; 2)同名的sheet在5号位置;

在这种情况下,肯定会满足条件 sh.Name = ThisWorkbook.ActiveSheet.Name,因为 sheet 与自身进行比较。

所以,我想知道:如何理解如果 sh 不是 ThisWorkbook.ActiveSheet

我原以为可以通过简单的对象比较简单地解决这个任务:

If (sh Is Not ThisWorkbook.ActiveSheet) And (sh.Name = ThisWorkbook.ActiveSheet.Name) Then

但这会引发编译错误,即对象不支持此属性或方法。任何人都可以帮我找到我的代码结构中缺乏逻辑的地方吗?

其他信息

我已经尝试通过 Err.DescriptionErr.Number 来管理案例,但第一个是操作系统语言相关的,第二个对于我需要处理的其他类型的错误也是一样的不同的。

此外,sheets(名称和内容)包含在 .xlam 加载项中,因此用户可以通过自定义用户表单更改内容,但不能通过 Excel 申请。

更笼统地说,我想知道如何进行比较,即使在这种特定情况下可能有变通方法,为了将这种方法用于未来的开发,我已经计划做并且不能通过默认的 VBA 错误处理程序进行管理。

只需检查工作表的索引和名称。 如果名称匹配,则只有错误(或其他),但索引不匹配。

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

你的 "Not" 语法不正确;应该是这样的:

If (Not sh Is ThisWorkbook.ActiveSheet) And (sh.Name = ThisWorkbook.ActiveSheet.Name) Then

没有理由遍历工作表集合。使用这个:

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