【问题标题】:Creating a generic Checkbox_Click VBA Code创建通用 Checkbox_Click VBA 代码
【发布时间】:2014-08-03 00:16:38
【问题描述】:

我正在创建一个作为清单的 excel 文件,目前我在 D 列中有 73 个复选框,在 E 列中,它将根据选项字段中的用户名填充用户名。

目前我有如下代码:

Sub CheckBox1_Click()
 If ActiveSheet.CheckBoxes("Check Box 1").Value = 1 Then
   Range("E3").Value = Application.UserName
   Else: Range("E3").Value = ""
 End If
End Sub
Sub CheckBox2_Click() 
If ActiveSheet.CheckBoxes("Check Box 2").Value = 1 Then
   Range("E4").Value = Application.UserName
   Else: Range("E4").Value = ""
 End If
End Sub

对于 D 列中的每个复选框。它确实有效,但我现在需要在一周的其他日子将 D 列复制到 F、H、J、L 列中,我很好奇是否有更快的方法来做到这一点,并且一种更简洁的方法来执行此操作,而不是列出一长串。

【问题讨论】:

    标签: vba excel checkbox spreadsheet


    【解决方案1】:

    试试这样的。您必须格式化每个复选框并将此宏分配给每个复选框,从格式 |分配宏选项。

    Sub Generic_ChkBox()
    Dim cbName As String
    Dim cbCell As Range
    Dim printValue as String
    
    cbName = Application.Caller
    
    Set cbCell = ActiveSheet.CheckBoxes(cbName).TopLeftCell
    
    Select Case cbCell.Column
        Case 4
            'prints the username in column E
            printValue = Application.UserName
        Case 6
            'prints "Something else" in column G
            printValue = "Something else"
        Case 8
            'prints "etc..." in column I, etc.
            printValue = "etc..."
        Case 10
            printValue = "etc..."
        Case 12
            printValue = "etc..."
    End Select
    
    If ActiveSheet.CheckBoxes(cbName).Value = 1 Then
        cbCell.Offset(0, 1).Value = printValue
    Else
        cbCell.Offset(0, 1).Value = vbNullString
    End If
    
    End Sub
    

    【讨论】:

    • 为了清楚起见,您可以选中所有复选框,然后在一个操作中将宏分配给所有复选框。
    • Application.Caller 对于多个重复动作确实很有用。救了我很多次。
    • @DavidZemens 这不是一个问题,而是一个观察。
    • 我的错误 - 对不起,我以为你在问后续问题。
    • 这行得通,只是它将名称放在 E2 而不是 E3 中。我通过将偏移量更改为 (1,1) 来解决这个问题,以防有人好奇
    【解决方案2】:

    我假设您要将用户名值分配给 CheckBox 的下一个单元格。 对于 D4 有复选框,那么值将是 E4。

    Sub ProcessAllCheckBox()
     Dim ws As Worksheet, s As Shape
     Sheets("Sheet1").Columns("A:Z").ClearContents
      Set ws = ActiveSheet
      For Each chk In ActiveSheet.CheckBoxes
       If chk.Value = 1 Then
         Set s = ws.Shapes(chk.Caption)
         Sheets("Sheet1").Range(Cells(s.TopLeftCell.Row, s.TopLeftCell.Column + 1),  Cells(s.TopLeftCell.Row, s.TopLeftCell.Column + 1)).Value = Application.UserName
      End If
     Next
    

    结束子

    请在 WorkShee Active 中更新以下代码

    Private Sub Worksheet_Activate()
    For Each chk In ActiveSheet.CheckBoxes
      chk.OnAction = "ProcessAllCheckBox"
    Next
    ProcessAllCheckBox
    End Sub
    

    【讨论】:

    • 正确,对于 D3,它将更新 E3 等。我正在运行这个但收到 400 错误我所做的唯一更改是在各个位置将 sheet1 更改为 sheet5。
    猜你喜欢
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    相关资源
    最近更新 更多