【发布时间】:2015-01-06 23:38:28
【问题描述】:
在错误处理代码的上下文中,我想验证用户是否在同一工作簿中为当前工作表赋予了另一个工作表的相同名称(当然禁止操作)。因此,我直观地尝试验证这一点的方式是简单地遍历所有工作表并比较名称:
For Each sh In ThisWorkbook.Sheets
If sh.Name = ThisWorkbook.ActiveSheet.Name Then
'error handling here
End If
Next sh
但是,在以下情况下这是一个巨大的逻辑错误:
1) 用户正在编辑,比方说,工作表编号 3; 2)同名的sheet在位置5;
在这种情况下,肯定会满足条件sh.Name = ThisWorkbook.ActiveSheet.Name,因为工作表会与自身进行比较。
所以,我想知道:如何理解sh 不是ThisWorkbook.ActiveSheet?
我认为这个任务可以通过简单的对象比较来解决:
If (sh Is Not ThisWorkbook.ActiveSheet) And (sh.Name = ThisWorkbook.ActiveSheet.Name) Then
但这会引发编译错误,即对象不支持此属性或方法。谁能帮我找到我的代码结构中缺乏逻辑的地方?
其他信息
我尝试通过Err.Description 和Err.Number 来管理此案例,但第一个是依赖于操作系统语言的,第二个对于我需要以不同方式处理的其他类型的错误是相同的。
此外,工作表(名称和内容)包含在.xlam 加载项中,因此用户可以通过自定义用户表单而不是通过 Excel 应用程序更改内容。
更一般地说,假设我想知道如何进行比较,即使在这种特定情况下可以解决,以便将这种方法用于我已经计划做的未来开发和无法通过默认的 VBA 错误处理程序进行管理。
【问题讨论】:
-
用户是在 VBA 代码中还是通过手动输入给“另一个工作表相同的名称”?因为手动输入会给您一个错误:“该工作表名称已被使用。请输入另一个工作表未使用的工作表名称。”
-
@Christmas007,该名称是通过用户窗体上的文本框输入的,并将其自身更新为
TextBox_Change事件。我已经尝试通过Err.Description进行管理,但是该消息被提升为操作系统语言,这会导致跨语言问题。也通过错误代码进行了尝试,但它与必须以不同方式管理的其他情况相同。此外,我只想知道如何正确比较这两个对象,因为当没有引发特定错误时,我会进一步需要它。 -
@GeneSkuratovsky 请阅读我上面的评论,以便更好地理解上下文。工作表包含在加载项中,因此用户可以通过用户表单更改工作表的名称和内容,而不会在桌面上看到工作表。这就是(不幸的是)我需要构建自定义错误处理程序的原因:(
-
@GeneSkuratovsky 没问题,感谢您的反馈! :)
-
刚刚意识到您的逻辑中有一个错误:“用户正在编辑,比如说,工作表编号 3;2) 同名工作表 位于位置编号 5" 不可能创建两个或多个具有相同名称的工作表。
标签: vba