Диапазон столбцов VBA Excel 2013 с выпадающим списком для создания кода VBA для выбора всех и отмены выбора всех флажков - PullRequest
0 голосов
/ 24 октября 2018

Я новичок в VBA и нуждаюсь в помощи.В настоящее время у меня есть раскрывающийся список в определенном столбце (E1: E519), где сотрудники могут выбрать флажок или оставить его пустым.Однако, если у кого-то есть 400 человек или около того, чтобы установить флажки, это может раздражать.Так что это побудило меня создать командную кнопку сбоку, используя vba, чтобы выбрать и отменить выбор всего в этом конкретном диапазоне столбцов.

Как создать код vba, который позволяет проверкам заполнять только пробелы в выбранномдиапазон ячеек, в которых есть параметр раскрывающегося списка (в раскрывающемся списке есть только 1 параметр, который является флажком).Раскрывающийся список должен остаться для пользователей, которые предпочитают отмечать каждый флажок отдельно и не использовать командную кнопку.Столбец E либо получает чек, либо остается пустым.Было бы намного проще, если бы он распознал, что если в столбце B есть данные, то в столбец E в той же строке следует добавить галочку.Если есть код для этого, я буду признателен за любую помощь, которую я могу получить.Точный флажок, который я использую, - это шрифт Arial Unicode MS с подмножеством символа Dingbat 2713.

Может кто-нибудь помочь мне и показать, как это сделать правильно?Я также был бы признателен за пояснения, чтобы я мог понять язык кода и продолжить изучение.Спасибо!

Текущий код, который я использую (показывает «?» Вместо проверки, которая находится в ячейке E14 (строка 14, столбец 5), которая является галочкой):

Private Sub CommandButton1_Click()

Dim c As Range
Dim check As Long

check = 0 'Define 0 for crossmark or 1 for checkmark

For Each c In Range("E17:E519") 'Define your range which should look value not equal to 1, then loop through that range.
If c <> 1 Then 'check if value in range is not equal to 1
With c 'Define what you want to do with variable c
    If check = 1 Then 'If check = 1, then
        .Font.Name = "Arial Unicode MS" 'Apply font "Arial Unicode MS"
        .Font.Size = 12 'Font size
        .FormulaR1C1 = "ü" 'special character for checkmark
    ElseIf check = 0 Then 'If cehck = 1, then
        .Font.Name = "Arial Unicode MS" 'Apply font "Arial Unicode MS"
        .Font.Size = 12 'Font size
        .Borders(xlEdgeTop).LineStyle = xlContinuous
        .Borders(xlEdgeBottom).LineStyle = xlContinuous
        .Borders(xlEdgeLeft).LineStyle = xlContinuous
        .Borders(xlEdgeRight).LineStyle = xlContinuous
        .FormulaR1C1 = "?"
End If
End With
End If
Next c
End Sub

Следующий код

Sub change_cells_ref2()
        Dim ws As Worksheet
        Dim c As Range
        Dim c_row_number As Long
        Dim rangeinput As Variant

    Set ws = Worksheets("NFLES ILT Form") 'Define the worksheet the code should be applied to
Application.ScreenUpdating = False 'Turn off screen update, makes the calculations more smooth and faster.

Set rangeinput = Range("E17:E519") 'Set Range where you want to check if the variable c is empty. If you have headers, set "B2:B519"

For Each c In rangeinput 'This line defines your range where you are looking for "", then loop through that range.
c_row_number = c.Row 'Gives us the current row number for the loop variable c which we are looping.
    If c <> "" Then 'Checks if the value in variable c is empty
        ws.Cells(14, "E").Copy 'Copy from cell(14,5) where cells(row number, column number). This will copy row 14, column 5, which is cell E14
        ws.Cells(c_row_number, "E").PasteSpecial xlPasteAll 'Paste into current row in loop and column 5 (column E)
    End If 'End the if statement where we check which value variable c has.
Next c 'Go to next c in the range

Application.CutCopyMode = False 'Cancel any copy selection
Application.ScreenUpdating = True 'Turn off screen update

End Sub

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Спасибо за помощь Wizhi.Я искал код, который позволяет только проверкам заполнять пробелы в выбранном диапазоне.Я не использую перекрестные проверки на своем листе.Он либо получает чек, либо остается пустым.Было бы намного проще, если бы он распознал, что если в столбце B есть данные, то в столбец E в той же строке следует добавить галочку.Если есть код для этого, я буду признателен за любую помощь, которую я могу получить.Точный флажок, который я использую, - это шрифт Arial Unicode MS с подмножеством кода Dingbat 2713.

0 голосов
/ 24 октября 2018

Сложность в том, какой тип символа вы использовали для перекрестной пометки / тикера.Поэтому я перечисляю два подхода, первый из которых я использовал ранее.
Поскольку я хочу, чтобы он был стандартизирован как в макросах, так и в раскрывающемся списке, я выбираю набор символов в ячейках B1 и B2 в качестве фиктивных переменных.

B1 = галочки (✓) = 1 и B2 = метки (✗) = 0.Большим преимуществом является то, что я могу использовать те же символы в раскрывающемся списке (см. Рисунок) и код VBA.Обратите внимание, что обе мои ячейки, B1 и B2, имеют раскрывающиеся списки.Когда мой код скопирует эти ячейки, выпадающий список будет следовать за новыми ячейками.

enter image description here

Когда я запускаю код, мне сначала нужно выбрать1 или 0.То, что вы выберете, зависит от того, скопирует ли код галочки (значение 1) или перекрестные метки (значение 0).

enter image description here

Следующее окногде вы определяете свой диапазон.Вы можете написать его так: E20:E50 или выбрать его, щелкнув мышью.

enter image description here

Затем код обрабатывается, и результат будетизменить ячейки:

enter image description here

Код VBA:

Sub change_cells_ref()
Dim c As Range
Dim check_or_cross As Variant
Dim c_row_number As Long
Dim rangeinput As Variant

check_or_cross = Application.InputBox("Enter ""1"" for checkmark or ""0"" for crossmark") 'Input box for checkmarks (enter: 1) or crossmarks (enter: 0)
On Error Resume Next 'If error occurs, this is not a good way to mask errors... but if you press cancel in the inputbox when you are setting a range, VBA automatically throws an error: 13 before we can catch it, so we mask any errors that can occurs.
Set rangeinput = Application.InputBox(prompt:="Select range or Enter range, i.e. E17:E150", Type:=8) ' Input box for Range, Type:=8 tells us that the value has to be in range format. You could either select or write range.

For Each c In rangeinput 'Range("E17:E150") - remove "rangeinput" to have a static range. This line defines your range where you are look for "zxyx", then loop through that range.
    c_row_number = c.Row 'Gives us the current row for the loop variable c which we are looping.
        If c <> "zxyz" Then 'Checks if the value is combination that is very unlikely to occur. It will overwrite all those values that are not "zxyz".
        'If you replace the above code line with [If c = "" Then] the code would only overwrite cells that has not checkmark or crossmark...i,e only empty cells, could be good if you have some workers who answered, and some that hasn't. And only want to fill in those who didn't answer quickly.
            With c 'Define what you want to do with the variable c
                If check_or_cross = 1 Then 'If the user wrote 1, then copy checkmarks
                    .Font.Name = "Times New Roman" 'Set font that you want to use, remember all fonts doesn't support special characters/crossmark/checkmarks
                    .Font.Size = 12 'Set the Font size
                    Cells(1, 2).Copy 'Copy from cell(1,2) where cells(row number, column number). This will copy row 1, column 2, which is cell B1
                    Cells(c_row_number, 5).PasteSpecial xlPasteAll 'Paste into current row in loop and column 5 (column E)
                ElseIf check_or_cross = 0 Then 'If the user wrote 0, then copy crossmarks
                    .Font.Name = "Times New Roman" 'Set font that you want to use, remember all fonts doesn't support special characters/crossmark/checkmarks
                    .Font.Size = 12 'Set the Font size
                    Cells(2, 2).Copy 'Copy from cell(2,2) where cells(row number, column number). This will copy row 2, column 2, which is cell B2
                    Cells(c_row_number, 5).PasteSpecial xlPasteAll 'Paste into current row in loop and column 5 (column E)
                End If 'End the if statement (if check_or_cross is 1 or 0)
            End With 'Close the With c part
        End If 'End the if statement where we check which value c has.
Next c 'Go to next c in the range
On Error GoTo 0
End Sub

Если вы всегда хотитестатический диапазон и пропустите поле ввода для части диапазона, вы можете удалить эти 3 строки:

On Error Resume Next
Set rangeinput = Application.InputBox(prompt:="Select range or Enter range, i.e. E17:E150", Type:=8) 
'...code....
On Error GoTo 0

и затем заменить эту часть For Each c In rangeinput -> For Each c In Range("E17:E517") - где E17:E517 - ваш диапазончто вы хотите изменить галочки / пометки



Альтернативный подход:

В этом коде используется размер шрифта "Wingding".

Недостаток в том, что вы не можете использовать этот стиль "хорошим" способом в раскрывающемся списке.У вас будут значения "ü" = ✓ и для û = ✗.Это означает, что в раскрывающемся списке у вас будут символы «u», но в макросе он покажет правильные значения при представлении результата.

Преимущество в том, что вам не нужны пустые ячейки, так как код не будет копировать никакие ячейки.Он записывает значения прямо из кода.Если у вас есть случай, когда вы хотите использовать только макрос, а не раскрывающийся список, это может быть идеальным подходом.

enter image description here

Sub change_cells()
Dim c As Range
Dim check As Long

check = 0 'Define 0 for crossmark or 1 for checkmark

For Each c In Range("E17:E150") 'Define your range which should look value not equal to 1, then loop through that range.
    If c <> 1 Then 'check if value in range is not equal to 1
    With c 'Define what you want to do with variable c
        If check = 1 Then 'If cehck = 1, then
            .Font.Name = "Wingdings" 'Apply font "Wingdings"
            .Font.Size = 12 'Font size
            .FormulaR1C1 = "ü" 'special character for checkmark
        ElseIf check = 0 Then 'If cehck = 1, then
            .Font.Name = "Wingdings" 'Apply font "Wingdings"
            .Font.Size = 12 'Font size
            .FormulaR1C1 = " û " 'special character for crossmark
        End If
    End With
End If
Next c
End Sub



Другой легкий подход показан в результате ниже:

enter image description here

Код будет выглядеть, еслиячейка в столбце B не пуста.Если ячейка не пустая (формулы, которые возвращаются: "" обрабатываются как пустые), она скопирует значение из фиктивной ячейки A1 и вставит в столбец E в той же строке.

Примечаниеустановить фиктивную ячейку с проверкой данных и галочкой ✓.Причина в том, что символ 2713 является специальным символом, и в VBA он будет иметь результат "?"персонаж.Поэтому мы копируем его в среду Excel, где он может обрабатываться правильно, включая раскрывающийся список

Переменные в наборе кодов:

  • Имя листа, предварительно определенное как: "Sheet1"

  • Диапазон, в котором нужно искать данные: "B1:B519"

  • ws.Cells(1, "A").Copy - ячейка, где находится пустышкапеременная расположена («А1»).

  • ws.Cells(c_row_number, "E").PasteSpecial xlPasteAll - Установить столбец, в который должна быть вставлена ​​галочка.

VBAКод:

Sub change_cells_ref2()
Dim ws As Worksheet
Dim c As Range
Dim c_row_number As Long
Dim rangeinput As Variant

Set ws = Worksheets("Sheet1") 'Define the worksheet the code should be applied to
Application.ScreenUpdating = False 'Turn off screen update, makes the calculations more smooth and faster.

Set rangeinput = Range("B1:B519") 'Set Range where you want to check if the variable c is empty. If you have headers, set "B2:B519"

For Each c In rangeinput 'This line defines your range where you are looking for "", then loop through that range.
    c_row_number = c.Row 'Gives us the current row number for the loop variable c which we are looping.
        If c <> "" Then 'Checks if the value in variable c is empty
            ws.Cells(1, "A").Copy 'Copy from cell(1,1) where cells(row number, column number). This will copy row 1, column 1, which is cell A1
            ws.Cells(c_row_number, "E").PasteSpecial xlPasteAll 'Paste into current row in loop and column 5 (column E)
        End If 'End the if statement where we check which value variable c has.
Next c 'Go to next c in the range

Application.CutCopyMode = False 'Cancel any copy selection
Application.ScreenUpdating = True 'Turn off screen update

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...