Excel VBA 按钮单元格地址错误



我有一个工具,我根据一些选择标准自动在多列中插入多个小按钮(假设列 C1:C90,E1:E90,G1:G90...)。我正在使用Worksheet类的.Buttons.Add方法来创建按钮。

单击按钮时,我找不到正确的单元格地址。 例如,如果我单击单元格 C2 中的按钮,它会给出 C70 单元格地址,如果我单击 E4,它仍然会给出其他单元格地址。我尝试使用以下代码。谁能帮我解决这个问题?

Sub Mainscoresheet() 
' Mainlineup Macro to add button
Dim b As Object, RowNumber,ColNumber As Integer 
Set b = ActiveSheet.Buttons(Application.Caller) 
With b.TopLeftCell 
RowNumber = .Row
ColNumber = .Col
End With 
MsgBox "Row Number " & RowNumber 
MsgBox "Row Number " & ColNumber
End Sub

我在按钮添加功能下方添加了按钮。

XRow = 7: xCol = 5
Do Until wks.Cells(XRow, 1) = ""
DoEvents
For i = 1 To M_Count
Set Bt = wks.Range(Cells(XRow, xCol), Cells(XRow, xCol))
Set btn = wks.Buttons.Add(Bt.Left + 1, Bt.Top + 1, Bt.Width - 2, Bt.Height - 2)
With btn
.OnAction = "BtnCopy"
.Caption = ">>"
.name = "Note" & Now
End With
xCol = xCol + 2
Next i
xCol = 5
XRow = XRow + 1
Loop

您正在尝试识别使用以下行单击的按钮:

Set b = ActiveSheet.Buttons(Application.Caller) 

以这种方式使用Application.Caller依赖于每个具有唯一名称的Button。但是,当您创建按钮时,您可以使用以下代码:

With btn
.OnAction = "BtnCopy"
.Caption = ">>"
.name = "Note" & Now
End With

但是您使用Now函数将"id"添加到Button。使用Now意味着您可以创建多个具有相同名称的按钮,因为代码的运行速度足够快,Now不会在代码中递增。此外,如果您运行代码几次,例如在 3 次不同的运行中创建 3 列中的按钮,那么每组按钮可能具有相同的名称。这会混淆Application.Caller,因为它只会返回"第一场比赛"Button

因此,您应该使用计数器为每个按钮创建一个唯一的名称。请参阅下面的代码示例,该示例对 10Buttons 的示例集执行此操作:

Option Explicit
Sub CallButton()
Dim btn As Object
Dim lngRow As Long, lngCol As Long
Set btn = ActiveSheet.Buttons(Application.Caller)
With btn.TopLeftCell
lngRow = .Row
lngCol = .Column
End With
MsgBox "Button name " & btn.Name
MsgBox "Row Number " & lngRow
MsgBox "Col Number " & lngCol
End Sub
Sub Make10Buttons()
Dim ws As Worksheet
Dim lng As Long
Dim rng As Range
Dim btn As Object
Set ws = ThisWorkbook.Worksheets("Sheet1")
For lng = 1 To 10
Set rng = ws.Cells(lng + 1, 2)
Set btn = ws.Buttons.Add(rng.Left, rng.Top, rng.Width, rng.Height)
With btn
.OnAction = "CallButton"
.Caption = ">>"
.Name = "Note" & lng '<--- need a unique ID for each button
End With
Next lng
End Sub

可以使用XRowxCol创建要追加到每个按钮的唯一后缀,从而使示例适应代码。

最新更新