【问题标题】:VBA Button Application.Caller returning wrong rowVBA按钮Application.Caller返回错误的行
【发布时间】:2020-08-31 07:31:59
【问题描述】:

我尝试在 myexcel 工作簿的不同工作表中的几个按钮上使用以下命令。

MsgBox (ActiveSheet.Shapes(Application.Caller).TopLeftCell.row)

将这些按钮复制到工作簿的另一个区域时,有时我会遇到仍然显示原始按钮位置的行号的问题。如下面屏幕截图中的示例,我单击底部的按钮,但它返回第 705 行而不是第 739 行。谁能解释这种行为?

【问题讨论】:

  • 在该行之前添加一行Msgbox ActiveSheet.Name。你总是得到正确的工作表名称吗?
  • 尝试使用 'MsgBox ActiveSheet.Shapes(Application.Caller).TopLeftCell.Address(external:=True)` 是否正确返回工作表?

标签: excel vba button shapes


【解决方案1】:

确保所有您的按钮具有唯一的名称。有时可能会发生复制的按钮具有相同的名称(由于 Excel 中的错误)。然后 VBA 无法区分它们并使用它找到的第一个。检查所有按钮名称并确保它们是唯一的。

这个问题很容易重现:

  1. 打开一个新工作簿
  2. 添加按钮 (FormControl)
  3. 将其命名为MyButton
  4. 复制该按钮
  5. 将其粘贴到同一张表的其他位置
  6. 对两个按钮使用问题中的代码

该按钮现在将始终显示第一个按钮所在的行,因为它们的名称完全相同。

图 1:说明此问题是如何发生的。最后两个按钮显示相同的行值。因为同名VBA只能找到第一个。

解决方案是,当您复制按钮时,请立即确保将其重命名为唯一名称。

【讨论】:

  • 确认这在我的Windows 64bit Office 2019 32bit 设置中是正确的,但是一旦保存工作簿,第二个按钮就会重命名为下一个“可用”通用名称,至少是Button 3
  • @VBasic2008 奇怪,从未尝试保存该文件。但是是的,你是对的,保存后它被重命名。所以显然是一个奇怪的 Excel 错误。
【解决方案2】:

我从来没有复制同名的形状。只剩下它的标题...但是,由于人们说这是可能的,请尝试将此代码分配给讨论中的所有形状。如果形状双名是原因,代码将返回两次:

Sub callButName()
Dim sh As Shape
 For Each sh In ActiveSheet.Shapes
   If sh.Name = Application.Caller Then MsgBox sh.TopLeftCell.Address
 Next
End Sub

【讨论】:

    猜你喜欢
    • 2014-08-30
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    相关资源
    最近更新 更多