Макрос VBA — установите определенные флажки

#excel #vba

Вопрос:

доброе утро!

Я разрабатываю небольшой проект, и я столкнулся с этим макромиром, он же «Макрос VBA-скриптинг», о котором я никогда раньше не слышал.

Я думаю, это что-то довольно простое, но я все еще борюсь с этим.

Что я делал до сих пор? Много поисков в Google.

и я применил свой собственный метод:

 Sub Clickall()
With Selection
ActiveSheet.Shapes.Range("Check Box 2").Select
.Value = xlOn
.LinkedCell = ""
.Display3DShading = False
End With
End Sub
 

Но этот проверяет только 1 флажок за раз. И это часто терпит неудачу без всякой причины.

Затем я нашел это:

 Public Function Check(filePath As String, sheetName As String)
Dim xlWorkbook As Workbook
Dim xlWorksheet As Worksheet
Dim xlRange As Range
Set xlWorkbook = Workbooks.Open(filePath, UpdateLinks:=False)
Set xlWorksheet = xlWorkbook.Worksheets(sheetName)
For Each chkBox In xlWorksheet.CheckBoxes
chkBox.Value = xlOn
Next chkBox
xlWorkbook.Save
xlWorkbook.Close
End Function
 

Но в данном случае это проверка всех ящиков одновременно, и я хочу проверять только определенные ящики.

Список флажков

Итак, когда я получу этот файл Excel. Флажки 1,2,3,4 уже будут установлены. Моя работа состоит в том, чтобы проверить, флажки № 5,6,7,8,9, и оставить снятыми флажки № 10 и 11.

У кого — нибудь были какие-нибудь идеи, как этого добиться?

Спасибо

Комментарии:

1. Всегда ли есть 11 коробок? Тогда может помочь счетчик, который останавливается после 5 кругов

2. Привет, @капитан Красти, да, всегда 11 коробок 🙂

Ответ №1:

Пожалуйста, протестируйте следующий код. Ничего не возвращая, достаточно быть Sub :

 Sub CheckCB(filePath As String, sheetName As String)
 Dim xlWorkbook As Workbook, xlWorksheet As Worksheet, xlRange As Range, i As Long
 Set xlWorkbook = Workbooks.Open(filePath, UpdateLinks:=False)
 Set xlWorksheet = xlWorkbook.Worksheets(sheetName)
 For i = 1 To xlWorksheet.CheckBoxes.count
    Select Case i
        Case 5, 6, 7, 8, 9
              xlWorksheet.CheckBoxes("Check Box " amp; i).value = True
    End Select
 Next i
 xlWorkbook.Close , True
End Sub
 

Комментарии:

1. Что делает «Выбор случая»?

2. @Capt. Krusty Он делает именно то, что предполагает его название… Когда i =5, или 6, или перечисление там, он выполняет следующую строку кода.

3. Ах, круто, так что «петля с отверстиями» теперь для меня возможна, спасибо! Голосуйте! 🙂

4. @Capt. Krusty Решение, которое я попытался предложить, дает возможность легко адаптировать код, если будет использоваться больше флажков и будут использоваться даже прерывистые числа. Что-то вроде 2, 4, 6, 7, 8 … Когда вы не можете выполнять итерацию напрямую, без множества If Enf If условий.

5. @Capt. Красти Что интересно, так это то, что я вижу над голосованием «за», но в моем кошельке с дурной славой ничего не было подсчитано… Даже обновил страницу.

Ответ №2:

 Public Function Check(filePath As String, sheetName As String)
Dim xlWorkbook As Workbook
Dim xlWorksheet As Worksheet
Dim xlRange As Range
Dim i As Integer
Set xlWorkbook = Workbooks.Open(filePath, UpdateLinks:=False)
Set xlWorksheet = xlWorkbook.Worksheets(sheetName)

For i = 5 To 9
   xlWorksheet.OLEObjects("Checkbox" amp; i).Object.Value = True 'Give name as String as your checkboxes are named
Next i

xlWorkbook.Save
xlWorkbook.Close

End Function
 

Комментарии:

1. Разве ваш код не вызвал ошибку в строке a = "Checkbox" amp; i ? В вашем случае вы должны объявить его как String … Но более коротким вариантом было бы пропустить эту переменную и использовать конкатенацию напрямую, а a не .

2. Потрясающая работа @капитан Красти , этот небольшой фрагмент кода-настоящая инженерная работа. Большое вам спасибо за ваше время и усилия. Ты большой человек. Большое спасибо!!

Ответ №3:

вы можете работать с флажками, используя массив индексов или имен .CheckBoxes(Array(...))

 Sub SetCheckBoxes()
    ' set all the CheckBoxes to False
    ActiveSheet.CheckBoxes.Value = False
    
    ' option one: indexes of the checkboxes = checkboxes numbers
    ActiveSheet.CheckBoxes(Array(5, 6, 7, 8, 9)).Value = True
    
    ' option two: indexes of the checkboxes <> checkboxes numbers
    arr = Array(5, 6, 7, 8, 9)
    For i = 0 To UBound(arr)    'make array with the checkboxes names
        arr(i) = "Check Box " amp; arr(i)
    Next
    ActiveSheet.CheckBoxes(arr).Value = True    'apply
End Sub