VBA 按钮 Application.Caller 返回错误的行

VBA Button Application.Caller returning wrong row

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

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

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

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

这个问题很容易重现:

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

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

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

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

我从来没有想过复制一个同名的形状。只有它的标题保留了......但是,既然人们说这是可能的,请尝试将此代码分配给讨论中的所有形状。如果形状双名称是原因,代码将 return 两次:

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