#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