Vba 比较两个图纸对象(不是内容)
在错误处理代码的上下文中,我想验证用户是否在同一工作簿中为当前工作表提供了另一工作表的相同名称(当然,禁止操作)。因此,我直观地尝试验证这一点的方法只是循环浏览所有的表单并比较名称:Vba 比较两个图纸对象(不是内容),vba,Vba,在错误处理代码的上下文中,我想验证用户是否在同一工作簿中为当前工作表提供了另一工作表的相同名称(当然,禁止操作)。因此,我直观地尝试验证这一点的方法只是循环浏览所有的表单并比较名称: For Each sh In ThisWorkbook.Sheets If sh.Name = ThisWorkbook.ActiveSheet.Name Then 'error handling here End If Next sh 然而,在以下情况下,这是一个巨大的逻辑落差:
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
是否不是这个工作簿
我原以为这项任务可以通过简单的对象比较来解决:
If (sh Is Not ThisWorkbook.ActiveSheet) And (sh.Name = ThisWorkbook.ActiveSheet.Name) Then
但这会引发编译错误,即对象不支持此属性或方法。有谁能帮我找到代码结构中缺乏逻辑的地方吗
其他信息
我试图通过错误描述
和错误编号
来管理该案例,但第一种错误与操作系统语言有关,第二种错误与我需要以不同方式处理的其他类型错误相同
此外,工作表(名称和内容)包含在.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
“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
用户是否以VBA代码或通过手动输入方式为“另一张图纸提供相同的名称”?因为手动输入会给您一个错误:“该工作表名称已被使用。请输入另一个工作表未使用的工作表名称。”@Christmas007,该名称通过UserForm上的文本框输入,并更新到textbox\u Change
事件中。我已经尝试过通过Err.Description
进行管理,但是该消息被提升到操作系统语言中,这将导致跨语言问题。还尝试了错误代码,但与其他情况相同,必须以不同方式进行管理。此外,我只想知道如何正确地比较这两个对象,因为当没有出现具体错误时,我将需要它。@GeneSkuratovsky请阅读我上面的评论,以便更好地理解上下文。工作表包含在外接程序中,因此用户可以通过用户表单更改工作表的名称和内容,而不会在桌面上看到工作表。这就是(不幸的)我需要构建自定义错误处理程序的原因:(@GeneSkuratovsky一点问题都没有,谢谢您的反馈!:)刚刚意识到您的逻辑中有一个错误:“用户正在编辑,比方说,工作表编号3;2)同名工作表位于位置5”不可能创建两张或两张以上同名的表格。这是一个非常明智的举动,不能否认一次投票。但是,我仍然想知道是否可以执行实例比较。我的意思是,sh
和thiswoolk.ActiveSheet
可能会变成同一个对象实例。如果我们不知道如何进行我所要求的比较,我会接受这个答案。非常感谢您的时间:)嗯,这只是一个愚蠢的语法错误,我在写sh Is Not
而不是Not sh Is
。我建议进行编辑并接受你的回答,因为它完全回答了我的问题!我把你的答案投给第二个(优秀的)答案。但是,如果我们有两个相同的工作簿,并且查询的工作表是这两个工作簿中各自的工作表(它们将具有相同的名称和索引,但后面的工作簿不同),则第一部分可能会失败。再次,我迟到了几秒钟:(谢谢你,Gene,刚刚意识到了这一点!为了公平起见,我一直接受Ruberduck的回答,但非常感谢你的帮助,+1!!!@GeneSkuratovsky它赢得了我的支持,但我发现很高兴对你认为值得花时间回答的问题进行支持。我的意思是,如果值得回答的话,不值得支持吗?@Ruberduck,完全同意ree,这是我们奖励用户为我们所花时间的方式;)@GeneSkuratovsky,我想给你打个电话:鹰眼!它很管用,但是依赖错误处理程序然后继续下一步是非常危险的。嗯,这实际上有点欠缺。如果我传递一个空字符串作为名称,函数会告诉我工作表存在,而这不是真的,不是吗?一般的错误处理方法Maceej Los是可以的,但你应该这样做测试如果不是wsh什么都不是
等等,Matteo NNZ会根据您的运行方式提出一个公平的观点this@Chrismas007在这种情况下,他实际上不需要这样做,但是是的。你所说的是一般的最佳实践。@MaciejLos,我真的很感谢你的时间,你的时间实际上是解决许多问题的一种很酷的方法。我的意思是,在m在y上下文中,我需要知道是否存在另一个同名的工作表。在这种情况下,您的函数可以正常工作,但即使我传递了无效的名称(如空字符串或包含特殊字符的字符串,如*,:等),它也会产生相同的结果(即存在)。您明白我的观点吗?:)
If Not IsWshExists(ThisWorkbook, "Sheet2") Then
'you can add worksheet ;)
'your logic here
End If