首页 > 解决方案 > 创建大量命令按钮并更有效地编写

问题描述

我正在开发一个 Excel VBA 项目,该项目有 300 行,每天都会被外发订单填充。每行将有 4 个命令按钮和各种宏。第一个是“TIME IN”,这将记录订单何时开始,并将“IN PROGRESS”字样放在工作表1的列中。单击下一个按钮将是“TIME OUT”,这将记录完成时间,放置正确列中的单词“COMPLETE”并将整行移动到单独的工作簿。第三个按钮将是“HOLD”,这将记录加载时暂停的时间,将整行移动到同一工作簿的工作表 3,并将“PARTIAL HOLD”字样放在相应的列中。第四个按钮将在工作表 3 上,它将是“恢复”按钮。此按钮会将工作表 3 中的行发送回工作表 1,并在相应列中显示“IN PROGRESS”字样。我的问题是,是否可以批量制作这些按钮和相应的宏,还是我必须制作每个单独的按钮和与之配套的宏?如果可以批量做,请告诉我如何做。下面是命令按钮的代码示例以及到目前为止我单独创建的每个按钮的相关宏。它们都具有相同的基本代码和关联的宏。谢谢你帮助我写得更有效率。命令按钮 是否可以批量制作这些按钮和相应的宏,还是我必须制作每个单独的按钮和与之配套的宏?如果可以批量做,请告诉我如何做。下面是命令按钮的代码示例以及到目前为止我单独创建的每个按钮的相关宏。它们都具有相同的基本代码和关联的宏。谢谢你帮助我写得更有效率。命令按钮 是否可以批量制作这些按钮和相应的宏,还是我必须制作每个单独的按钮和与之配套的宏?如果可以批量做,请告诉我如何做。下面是命令按钮的代码示例以及到目前为止我单独创建的每个按钮的相关宏。它们都具有相同的基本代码和关联的宏。谢谢你帮助我写得更有效率。命令按钮

Private Sub HOLD1_Click()
Sheet1.Cells(5, 17).Value = Format$(Now, "hh:nn:ss")
HOLD_1
End Sub

Sub HOLD_1()
'
' HOLD_1 Macro
'

'
Range("M5").Select
ActiveCell.FormulaR1C1 = "PARTIAL HOLD"
Range("M6").Select
End Sub

标签: excelcommandbuttonmemory-efficientvba

解决方案


我的第一条评论中提到的“可点击单元格”示例

...如果 A 到 K 列包含数据,我会让 L 到 O 列可点击 (也可以使用不同的背景颜色),使用 SelectionChange() 事件 允许您确定每个单元格的坐标,并 根据具体情况构建特定操作当前行


把它Sub放在ThisWorkbook模块中

Option Explicit

'In ThisWorkbook module - Sh parameter contains the sheet being used (ActiveSheet)
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    With Target
        Select Case Sh.Name
            Case "Sheet1", "Sheet2", "Sheet3"   'Processing the first 3 sheets
                If .Row > 1 And .CountLarge = 1 Then 'Ignore Headers & multiple cells
                    Select Case .Column
                        Case 1 To 4         'Ignore col A to D
                            .Interior.Color = RGB(255, 204, 204)    'Revert to initial
                            .Font.ColorIndex = xlAutomatic  'Default Black
                        Case 5              'Mouse clicked in a cell in col E
                            With Sh.Cells(.Row, "A")    'Change cell in same row, col A
                                .Interior.Color = RGB(190, 0, 0)    'Dark Red
                                .Font.Color = vbYellow
                            End With
                            .Interior.Color = RGB(255, 255, 204)    'Light Yellow
                            .Font.Color = vbRed     'current cell (in column E)
                            .Font.Bold = True
                        Case 6              'Mouse clicked in a cell in col F
                            With Sh.Cells(.Row, "B")    'Change cell in same row, col B
                                .Interior.Color = RGB(0, 0, 190)    'Dark Blue
                                .Font.Color = vbYellow
                            End With
                            .Interior.Color = RGB(255, 255, 204)    'Light Yellow
                            .Font.Color = vbRed
                            .Font.Bold = True
                        Case 7              'Mouse clicked in a cell in col G
                            If Len(.Value2) > 0 Then
                                With Sh.Cells(.Row, "C")    'Cell in same row, col B
                                    .Interior.Color = RGB(255, 255, 0)  'vbYellow
                                    .Font.Color = RGB(190, 0, 0)        'Dark Red
                                End With
                            End If
                        Case 8
                            .Value = Format(Now, "ddd mm-dd-yyyy")
                            .Font.Bold = True
                            .Offset(, 1).Value2 = "In Progress"
                    End Select
                End If
            Case "Sheet4", "Sheet5"
                '...
        End Select
    End With
End Sub

.

结果,单击 E 到 H 列中的单个单元格后


Sheet1

表 1

Sheet2

表 2

Sheet3

表 3


.

检测当前选择的另一种方法


Option Explicit

'In Sheet1 module

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Not Intersect(Target, Me.UsedRange.Columns(1)) Is Nothing Then
        MsgBox "Clicked cell in Column 'A', Row: " & Target.Row
    End If
End Sub

单击时的消息框Sheet1.Cell(A5)

MsgBoxForA5


推荐阅读