【问题标题】:excel vba - automatically add/delete buttons depending on cell valuesexcel vba - 根据单元格值自动添加/删除按钮
【发布时间】:2017-10-26 16:20:12
【问题描述】:

我正在尝试做什么......

如果单元格 A1 中有内容,则获取一个按钮以自动显示在单元格 H1 中。如果 A1 下方的单元格中有更多内容,则该列下的多个按钮会继续此操作。每个按钮在使用时会将 A 列到 G 列的单元格内容剪切到与使用的按钮相同的行中,并将它们粘贴到另一张工作表的第一个空白行中,然后删除使用的按钮。

第一个问题...

如果 A1 不为空,则在 H1 中添加一个按钮。如果 A1 为空白,则删除/删除 H1 中的按钮。

编辑 1:

Sub Macro1()
'
' Macro1 Macro
'

'
    ActiveSheet.Buttons.Add(423.75, 0, 48, 15).Select
    'ActiveSheet.Shapes("Button1").Name = "Button1"
    Selection.Name = "Button1"
    Selection.Characters.Text = "REMOVE"
    With Selection.Characters(Start:=1, Length:=6).Font
        .Name = "Calibri"
        .FontStyle = "Regular"
        .Size = 11
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ColorIndex = 1
    End With
End Sub

问题在于使用 if 语句放置多个按钮,每个按钮的名称为“Button”,后跟其所在行的编号(Button1、Button2 等)。

编辑 2:

标题更改。

旧 - excel vba - 添加/删除按钮和单元格范围

新增功能 - excel vba - 根据单元格值自动添加/删除按钮

【问题讨论】:

  • 你需要证明你试图自己解决这个问题。这个网站是针对特定问题的,不太可能有人会基于模糊的范围需求从头开始为您构建一些东西。
  • 此外,由于新人往往不会投票或标记答案,因此花时间回答此类问题往往不会得到回报。
  • 我会发布我尝试过的内容,但如果我更改单元格 A1 中的内容,它不会删除或添加按钮。如果空白则隐藏它,否则不隐藏按钮。 @n8.
  • 我是一个由于缺乏经验而不倾向于投票的人,并且宁愿不因我的意见而改变答案或问题的声誉。

标签: vba excel


【解决方案1】:

这将在 A1:A10 中有内容的任何行上添加一个按钮,如果没有内容,则删除任何现有按钮(由此代码添加)

Sub Macro1()

    Dim c As Range, sht As Worksheet, btn, btnName As String

    Set sht = ActiveSheet

    For Each c In sht.Range("A1:A10").Cells '<< cells to check for content

        btnName = "btnRow_" & c.Row 'name the button according to the row

        If Len(c.Value) > 0 Then
            With c.EntireRow.Cells(1, "H")
                Set btn = sht.Buttons.Add(.Left, .Top, .Width, .Height)
            End With
            btn.Name = btnName
            btn.Characters.Text = "REMOVE"
        Else
            'delete the button if it exists (ignore any error if not found)
            On Error Resume Next
            sht.Shapes(btnName).Delete
            On Error GoTo 0
        End If

    Next c

End Sub

【讨论】:

  • 我将代码添加到工作表中,但它不起作用。 @蒂姆威廉姆斯
  • 它什么也没做。 @蒂姆威廉姆斯
  • 所以你运行它并没有任何反应,即使 A1:A10 中有内容?
  • 它仅在我添加一个按钮并将该宏分配给它时才有效。我需要它来处理所有 A 列并自动添加或删除按钮
  • 此代码将自动隐藏或取消隐藏命令按钮,但我似乎无法对其进行修改以达到我想要的效果。我不明白。Private Sub Worksheet_Change(ByVal Target As Range) Application.ScreenUpdating = False If Cells(1, 1).Value &lt;&gt; "1" Then Me.CommandButton1.Visible = True Else Me.CommandButton1.Visible = False End If Application.ScreenUpdating = True End Sub@TimWilliams
【解决方案2】:

这是我一直在寻找的最终结果。感谢大家的帮助。

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim This As Worksheet, _
        RemoveButton, _
        ButtonName As String

    Set This = Sheets("SheetName1")
    ButtonName = "REMOVE" & Target.Row

    If Target.Column = 1 Then
        If This.Range("$A$" & Target.Row) <> "" Then
            On Error Resume Next
            This.Shapes(ButtonName).Delete
            On Error GoTo 0

            With Target.EntireRow.Cells(1, "H")
                Set RemoveButton = This.Buttons.Add(.Left, _
                                                    .Top, _
                                                    .Width, _
                                                    .Height)
            End With

            RemoveButton.Name = ButtonName
            RemoveButton.Characters.Text = "REMOVE"
            RemoveButton.OnAction = "REMOVE_BUTTON_ACTION"
        Else
            On Error Resume Next
            This.Shapes(ButtonName).Delete
            On Error GoTo 0
        End If
    End If
End Sub

有一些错误,但它们似乎不是什么大问题。例如,如果我在 A 列中粘贴多行,那么它只会在粘贴范围的第一行中创建一个按钮。

Sub REMOVE_BUTTON_ACTION()
    Dim RemoveButton As Object, _
        ButtonColumn As Integer, _
        ButtonRow As Integer, _
        RemovedSheetRow As Integer

    Set RemoveButton = ActiveSheet.Buttons(Application.Caller)
    With RemoveButton.TopLeftCell
        ButtonRow = .Row
    End With
    RemovedSheetRow = Worksheets("SheetName2").Range("$J$1").Value + 1

    Range("A" & ButtonRow & ":G" & ButtonRow).Cut _
        Destination:=Sheets("SheetName2").Range("A" & RemovedSheetRow)
End Sub

我在 J1 中存储了一个值,用于表示 A 列中包含某些内容的单元格数量。J1 实际上包含一个 COUNTIFS() 公式。

再次感谢您的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    相关资源
    最近更新 更多