Создание большого количества командных кнопок и более эффективное написание - PullRequest
0 голосов
/ 08 мая 2018

Я работаю над проектом Excel VBA с 300 строками, которые будут ежедневно заполняться исходящими заказами. В каждой строке будет 4 кнопки управления и различные макросы. Во-первых, «ВРЕМЯ ВХОДА», это будет регистрировать, когда заказ начался, а также помещать слова «В ПРОЦЕССЕ» в столбце на листе 1. Следующая кнопка будет «ВРЕМЯ ВЫХОДА» при нажатии, это будет регистрировать время завершения размещения Слово «ЗАВЕРШИТЕ» в соответствующем столбце и переместите всю строку в отдельную книгу. Третья кнопка будет «HOLD», она будет регистрировать время удержания при загрузке, переместить всю строку на лист 3 той же рабочей книги и поместить слова «PARTIAL HOLD» в соответствующий столбец. Четвертая кнопка будет на листе 3, это будет кнопка «ВОЗОБНОВИТЬ». Эта кнопка отправит строку из листа 3 обратно на лист 1 со словами «В ПРОЦЕССЕ» в соответствующем столбце. У меня вопрос, возможно ли сделать эти кнопки и соответствующие макросы в большом количестве или я должен сделать каждую отдельную кнопку и макрос, которые идут вместе с ней? Если это возможно сделать оптом, расскажите, пожалуйста, как. Ниже приведен пример кода для командных кнопок и соответствующих макросов для каждой кнопки, которую я создал до сих пор индивидуально. Все они имеют одинаковый базовый код и связанный макрос. Спасибо, что помогаете мне писать более эффективно. Командная кнопка

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

Macro

Sub HOLD_1()
'
' HOLD_1 Macro
'

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

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Большое спасибо, Пол. Я закончил с этим:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Application.EnableEvents = False On Error GoTo Xit If Target.Column = 11 Then Cancel = True Target.Offset(, 2).Value = "IN PROGRESS" Target.Offset(, 4).Value = Time ElseIf Target.Column = 12 Then Cancel = True Target.Offset(, 1).Value = "COMPLETE" Target.Offset(, 4).Value = Time ElseIf Target.Column = 14 Then Cancel = True Target.Offset(, -1).Value = "PARTIAL HOLD" Target.Offset(, 3).Value = Time End If Xit: Application.EnableEvents = True End Sub

0 голосов
/ 10 мая 2018

Пример "кликабельных ячеек", упомянутых в моем первом комментарии

... Если столбцы от 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

Sheet1

Sheet2

Sheet2

Sheet3

Sheet3


.

Другой способ определения текущего выбора


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

...