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

时间:2015-01-06 15:08:42

标签: vba

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

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.DescriptionErr.Number管理案例,但第一个是依赖于操作系统语言的,第二个是我需要处理的其他类型的错误。

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

更一般地说,让我说我想知道如何进行比较,即使在这种特定情况下可以解决这个问题,以便将这种方法用于我已经计划进行的未来发展,无法通过默认的VBA错误处理程序进行管理。

3 个答案:

答案 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