【问题标题】:Breaking WorksheetFunction after using worksheet index?使用工作表索引后破坏 WorksheetFunction?
【发布时间】:2016-06-08 02:08:37
【问题描述】:

我构建了一堆 VBA 代码(经过全面测试,似乎可以正常工作),其中包括诸如

之类的行
worker = WorksheetFunction.Match(Sheets("workerlist").Range("A1"), Sheets("master").Range("A1:A20"), 0)

我正在尝试通过按索引号引用工作表来改进我的代码,因此我将 Sheets("workerlist") 替换为 Sheets(1),然后线路中断并返回运行时错误,指出无法获取 WorksheetFunction 的 Match 属性类。

两者不能一起工作吗?还有其他方法可以改善我的参考吗?当我尝试查找问题时,我总是以使用WorksheetFunction.Index 的页面结束。

【问题讨论】:

  • 为什么你认为使用索引号比工作表名称更好?
  • 我正在将工作簿发布给一群相当文盲的人,因此我正在努力减少可能出现的问题的数量。如果他们重命名我的工作表,索引号至少可以让这本书继续工作
  • 但是如果他们移动它们就会损坏。使用代号会更安全。错误的最可能原因是 Sheets(1) 与 Sheets("workerlist") 不同,这就是现在匹配失败的原因。
  • 那个...这实际上是我打算做的。为什么 Match 会完全失败而不是返回 null 呢?从错误来看,VBA 似乎找不到 Match 函数本身。

标签: excel excel-formula vba


【解决方案1】:

您正在制造潜在问题,而不是消除它们。

如果有人将 workerlist 工作表从第一个位置移开,则您的代码已损坏。这类似于如果有人重命名 workerlist 工作表,您当前代码中会发生的情况。

如果您想减少潜在问题,请使用工作表.CodeName property。虽然有人可能会重命名代号,但他们甚至不太可能找到在哪里改名。这肯定比双击工作表的.Name 选项卡并重新键入或将工作表拖到队列中的新位置更复杂。更改工作表的 .CodeName 是一种非常慎重的行为。

Addendum:

我更喜欢使用Excel Application objectMATCH function 版本。这与WorksheetFunction object 调用的不同。使用 Application.Match(..., ..., 0) 可以让您捕获变体的错误。

dim worker as variant
worker = application.Match(Sheets("workerlist").Range("A1"), Sheets("master").Range("A1:A20"), 0)
if IsError(worker) then
    'no match found; worker is Error 2042
else
    'match found; worker is a row number
end if

【讨论】:

  • 是的,这就是我的意图。我试图找出问题所在,我没有意识到我一开始就使用了错误的东西。在罗里指出之后,它就开始工作了!感谢你们俩的帮助。
  • 替代方案请参见附录。
  • 哦错误处理!这是我第一次尝试为其他人编写代码,所以所有这些错误预防对我来说都是新的。这肯定会很方便,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
  • 1970-01-01
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
  • 2014-06-11
相关资源
最近更新 更多