Excel VBA按钮单元格地址错误

标签 excel button 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

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

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 创建一个唯一的后缀来附加到每个按钮,从而使示例适应您的代码。

关于Excel VBA按钮单元格地址错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43861856/

相关文章:

c# - 在 WPF 中重新调整按钮用途的最佳实践?

c# - 如何在WPF中 move 按钮

jquery - 如何替换 jQueryUI 按钮文本?

Excel 未检测到三列中的交替重复项

excel - 如何在当前单元格上使用 HYPERLINK 和 VLOOKUP?

excel - 选择所有有数据的单元格

vba - 使用 VBA 将 Excel 工作表保存在当前目录中

vba - 删除不需要的数据行

java - 由于使用 apache-poi 库创建下拉列表而导致 Excel 损坏

java - 使用 Apache POI 在 Java 中导出到 Excel