vikttur Пользователь Сообщений: 47199 |
Я за помощью. Не откажите j = 1 Массив формируется, потом выгружается на лист. Что еще может служить указателем для последовательности перебора в массиве? |
ikki Пользователь Сообщений: 9709 |
обычно циклы For Each используются там, где порядок элементов неважен. пока не понял — почему порядок важен в данном примере? фрилансер Excel, VBA — контакты в профиле |
Hugo Пользователь Сообщений: 23249 |
Примерчик бы (лениво делать…) |
vikttur Пользователь Сообщений: 47199 |
Значит ли это, что данный цикл работает неведомо как и нет метода заставить его перебирать правильно? Порядок важен — нужно формировать шапку таблицы. Примера нет, так как — нет |
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
Вить, как раз по имени и стоит в твоем случае перебирать. for … next. А для for each порядок не важен:) Я сам — дурнее всякого примера! … |
ikki Пользователь Сообщений: 9709 |
примерно так: j = 1 with [a1].resize(2,j) конечно, если вторая строка под шапкой хотя бы временно свободна. фрилансер Excel, VBA — контакты в профиле |
vikttur Пользователь Сообщений: 47199 |
Спасибо всем, пока достаточно. |
Hugo Пользователь Сообщений: 23249 |
Я что-то такое сообразил — для 20 штук можно и так: Private Sub CommandButton1_Click() |
Hugo Пользователь Сообщений: 23249 |
Забыл строчку назад скорректировать, нужно лучше -=5555=- |
ikki Пользователь Сообщений: 9709 |
в общем случае нет гарантии, что на форме есть только чекбоксы, поэтому диапазон значений TabIndex может не совпадать с кол-вом чекбоксов. фрилансер Excel, VBA — контакты в профиле |
Hugo Пользователь Сообщений: 23249 |
ikki, мой вариант другие пропускает. |
vikttur Пользователь Сообщений: 47199 |
Все-все-все, спасибо-спасибо-спасибо Игорь, последний макрос работает, нужно только подрихтовать или код, или форму(CheckBox на нескольких рамках). Наверное, второе. |
ikki Пользователь Сообщений: 9709 |
Игорь, для 20-30 элементов — нормально. фрилансер Excel, VBA — контакты в профиле |
ikki Пользователь Сообщений: 9709 |
{quote}{login=vikttur}{date=03.11.2012 04:33}{thema=}{post}Все-все-все{/post}{/quote} эх… фрилансер Excel, VBA — контакты в профиле |
Hugo Пользователь Сообщений: 23249 |
Ну так я написал, что на 20 можно. |
ikki Пользователь Сообщений: 9709 |
я в подобных случаях использую обычный листбокс с мультиселектом и галочками. фрилансер Excel, VBA — контакты в профиле |
vikttur Пользователь Сообщений: 47199 |
{quote}{login=ikki}{date=03.11.2012 04:51}{thema=пс.}{post}…обычный листбокс с мультиселектом и галочками…{/post}{/quote} |
nerv Пользователь Сообщений: 3071 |
>502 Bad Gateway >Проблема: в цикле CheckBox перебираются, но как? >Чисто для инфо: под тип MSForms.CheckBox так же попадает и OptionButton |
vikttur Пользователь Сообщений: 47199 |
ikki, спасибо за пинок в нужную сторону. |
ikki Пользователь Сообщений: 9709 |
#20 06.11.2012 00:10:39 если что — я не виноватый — я не сам это придумал. фрилансер Excel, VBA — контакты в профиле |
ValentynaK 3 / 3 / 1 Регистрация: 21.11.2012 Сообщений: 31 |
||||
1 |
||||
Перебор чекбоксов30.05.2013, 17:45. Показов 5722. Ответов 3 Метки нет (Все метки)
Здравствуйте! Подскажите, кто знает. Есть ли возможность в цикле перебирать CheckBox-ы (17 штук)? Я попробовала следующий код, но он не проходит.
Спасибо.
0 |
5468 / 1148 / 50 Регистрация: 15.09.2012 Сообщений: 3,514 |
|
30.05.2013, 18:09 |
2 |
ValentynaK, у вас флажки находятся на Excel-листе или на VBA-форме?
0 |
toiai 3217 / 966 / 223 Регистрация: 29.05.2010 Сообщений: 2,085 |
||||
30.05.2013, 20:16 |
3 |
|||
Замени 11 строку кода на:
2 |
3 / 3 / 1 Регистрация: 21.11.2012 Сообщений: 31 |
|
31.05.2013, 09:42 [ТС] |
4 |
Спасибо за помощь. Воспользовалась подсказкой toiai.
0 |
I have a user form in Excel VBA with a check box for each month.
Selecting one or more cause the required month to be shown on the sheet, I copy-pasted the code 12 times and it works but I’m sure there is a better way doing it with a For
loop.
This is a part of my code (it goes on 12 times):
If CheckBox1.Value = True Then
ActiveSheet.PivotTables("PivotTable1").PivotFields("month").PivotItems("1").Visible = True
Else
ActiveSheet.PivotTables("PivotTable1").PivotFields("month").PivotItems("1").Visible = False
End If
If CheckBox2.Value = True Then
ActiveSheet.PivotTables("PivotTable1").PivotFields("month").PivotItems("2").Visible = True
Else
ActiveSheet.PivotTables("PivotTable1").PivotFields("month").PivotItems("2").Visible = False
End If
I tried writing:
for i in range 1 to 12
and then writing my code but there seem to be a problem when I put «i» instead of the numbers.
asked Aug 1, 2013 at 7:22
Assuming you aren’t using Tristate checkboxes, then the .Value
can only be True
or False
, so we should be able to get away with something like this:
(Assumes your code runs inside the UserForm, so that Controls
is directly accessible)
Dim mthIdx as Long
Dim nm as String
Dim c As Control
With ActiveSheet.PivotTables("PivotTable1").PivotFields("month")
For mthIdx = 1 To 12
nm = "CheckBox" & mthIdx
Set c = Controls(nm)
.PivotItems(mthIdx).Visible = c.Value
Next
End With
(The With
clause isn’t strictly necessary, but it’s usually a good idea to resolve nested COM references as infrequently as possible)
answered Aug 1, 2013 at 8:25
Mike WoodhouseMike Woodhouse
51.5k12 gold badges88 silver badges127 bronze badges
Try this ..
Dim i As Integer
Dim sN As String
Dim chx As MSForms.CheckBox
Dim obj As OLEObject
For i = 1 to 12
sN = format(i)
Set obj = OLEObjects("CheckBox" & sN)
Set chx = obj.Object
If chx.Value = True Then
ActiveSheet.PivotTables("PivotTable" & sN).PivotFields("month").PivotItems(sN).Visible = True
Else
ActiveSheet.PivotTables("PivotTable" & sN).PivotFields("month").PivotItems(sN).Visible = False
End If
Next
answered Aug 1, 2013 at 7:30
matzonematzone
5,6933 gold badges17 silver badges20 bronze badges
2
I’ve not checked the code but this should put you along thr right path if it’s not spot on though…
For i = 1 to 12
If CheckBox(i).Value = True Then
ActiveSheet.PivotTables("PivotTable1").PivotFields("month").PivotItems(i).Visible = True
Else
ActiveSheet.PivotTables("PivotTable1").PivotFields("month").PivotItems(i).Visible = False
End If
Next i
answered Aug 1, 2013 at 7:30
PalendronePalendrone
3541 gold badge2 silver badges13 bronze badges
1
|
|
|
Популярные разделы FAQ: Общие вопросы Особенности VBA-кода Оптимизация VBA-кода Полезные ссылки
1. Старайтесь при создании темы указывать в заголовке или теле сообщения название офисного приложения и (желательно при работе с Office 95/97/2000) его версию. Это значительно сократит количество промежуточных вопросов.
2. Формулируйте вопросы как можно конкретнее, вспоминая (хотя бы иногда) о правилах ВЕЛИКОГО И МОГУЧЕГО РУССКОГО ЯЗЫКА, и не забывая, что краткость — сестра таланта.
3. Не забывайте использовать теги [сode=vba] …текст программы… [/code] для выделения текста программы подсветкой!
4. Темы с просьбой выполнить какую-либо работу полностью за автора здесь не обсуждаются и переносятся в раздел ПОМОЩЬ СТУДЕНТАМ.
Как перебрать все CheckBox’ы на листе??
, ???
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Суть проблемы такова: На листе имеется порядка 70 записей, напротив каждой стоит CheckBox1, CheckBox2,…. и т.д. Требуется создать Кнопку «Отметить все» то есть Все CheckBox.Value = True CheckBox1.Value = True Так все дело работает. А можно ли сделать это грубо говоря так ??? for i=1 to 70 |
Akina |
|
for i=1 to 70 Controls(«CheckBox» & CStr(i)).Value = true Next |
calam4uk |
|
Цитата Akina @ 27.01.10, 05:52
for i=1 to 70 Controls(«CheckBox» & CStr(i)).Value = true Next
ругается на Controls «Sub or Function not defined» |
Akina |
|
Ну напиши Me.Controls |
calam4uk |
|
Цитата Akina @ 27.01.10, 06:06 Ну напиши Me.Controls Все равно ругается «Method or data member not found» |
Akina |
|
Зазипуй файл и приложи к сообщению |
calam4uk |
|
Цитата Akina @ 27.01.10, 06:47 Зазипуй файл и приложи к сообщению
Вот! |
Akina |
|
Dim CheckBoxName As String Dim CheckBoxObject As Variant For i = 1 To 70 CheckBoxName = «CheckBox» & CStr(i) Set CheckBoxObject = Me.Evaluate(CheckBoxName) CheckBoxObject.Object.Value = True Next |
calam4uk |
|
Респект и уважуха )))) Все получилось )) Сообщение отредактировано: calam4uk — 27.01.10, 07:44 |
Akina |
|
Цитата calam4uk @ 27.01.10, 07:44 Синтаксис ё-маё Я расписАл в три строки, чтобы было понятно, как всё происходит. Но можно собрать всё это в одну строку и не использовать промежуточных переменных. |
calam4uk |
|
Цитата Akina @ 27.01.10, 08:00 Цитата calam4uk @ 27.01.10, 07:44 Синтаксис ё-маё Я расписАл в три строки, чтобы было понятно, как всё происходит. Но можно собрать всё это в одну строку и не использовать промежуточных переменных.
Да это я понял!!! |
Dmitrii |
|
calam4uk, вот Вам ещё один вариант:
Option Compare Text … Dim objControl As Control For Each objControl In Me.Controls If TypeName(objControl) = «CheckBox» Then objControl.Value = False End If Next Кстати, учтите, что при установке значения «коробочки» произойдёт вызов соответствующего обработчика события Click. Сообщение отредактировано: Dmitrii — 28.01.10, 07:17 |
Akina |
|
Dmitrii, посмотри его файл. Контролы — не на форме, так что не сработает. |
Dmitrii |
|
Цитата Akina @ 28.01.10, 07:38 Контролы — не на форме… Тогда так:
Option Compare Text … Dim objControl As OLEObject For Each objControl In Me.OLEObjects If Left(objControl.Name, = «CheckBox» Then Me.Shapes(objControl.Name).OLEFormat.Object.Object.Value = False End If Next Код надо разместить в модуле листа, «контролы» которого обрабатываются. calam4uk, если вдруг захотите использовать «коробочки» из панели «Формы», а не из панели «Элементы управления», то обращение к ним можно организовать так:
Sub Example() For i = 1 To ActiveSheet.CheckBoxes.Count ActiveSheet.CheckBoxes(i).Value = False Next End Sub Сообщение отредактировано: Dmitrii — 28.01.10, 13:17 |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- VB for Application
- Следующая тема
[ Script execution time: 0,0364 ] [ 16 queries used ] [ Generated: 13.04.23, 21:13 GMT ]
- SaleXuS
- Начинающий
- Сообщения: 2
- Зарегистрирован: 21.03.2007 (Ср) 15:23
-
- ICQ
Помогите создать цикл с проверкой CheckBox
Здравствуйте товарищи программисты!
Помогите,пожалуйста, создать цикл в Excel:
Есть объекты Checkbox1…Checkbox11 и процедуры Procedure1…Procedure11
Мне нужно, чтоб цикл проверял Checkbox’ы и, при выполнении условия, вызывал процедуру:
For …
If Checkbox1= True then call Procedure1
Next
Как сделать так, чтоб при каждом шаге проверялся следующий объект и при выполнении условия вызывалась процедура? Должны меняться только номера объектов и процедур [/b]
- Krasnaja Shapka
- Обычный пользователь
- Сообщения: 87
- Зарегистрирован: 26.10.2006 (Чт) 12:13
- Откуда: Киев
Krasnaja Shapka » 21.03.2007 (Ср) 16:37
чекбоксы можно обойти с помощью Me.Controls(«Checkbox» & i).Value
а что делать с процедурами я не знаю… если они одинаковые, есть вариант сделать из них одну с переменной «index»
или мутить
select case true
case Checkbox1.value
procedure1
case Checkbox2.value
procedure2
….
end select
Если ясность вашего объяснения исключает ложное толкование, все равно кто-то поймет вас неправильно.
- SaleXuS
- Начинающий
- Сообщения: 2
- Зарегистрирован: 21.03.2007 (Ср) 15:23
-
- ICQ
SaleXuS » 22.03.2007 (Чт) 6:05
Дело в том, что я хочу сделать код как можно меньше. Делать без цикла нереально, проверяться будут аж 18 чекбоксов, для этого лучше цикл.
Вчера кода не было у меня под рукой, сегодня принес. Выглядит так:
Sub Восст_формул01_Click() ‘ Кнопка
Dim Confirm1 As String
Dim i As Integer
Dim name
Confirm1 = MsgBox(«Вы отметили галочками строки, в зеленых ячейках которых» & _
«будут восстановлены исходные формулы. Продолжить?», vbYesNo, «Внимание!»)
If Confirm1 = vbYes Then
With Assistant.NewBalloon
For i = 1 To 18
name = «Восстан_формулы» + i
‘Вызов процедуры
If .CheckBoxes(i).Checked = True Then Call name
Next i
End With
End If
End Sub
При выполнении выходит ошибка на «Call name»:
Compile error: Expected Sub, Function or Property
Что я делаю неправильно?
- RayShade
- Scarmarked
- Сообщения: 5511
- Зарегистрирован: 02.12.2002 (Пн) 17:11
- Откуда: Russia, Saint-Petersburg
-
- Сайт
- ICQ
RayShade » 22.03.2007 (Чт) 10:21
select case true — это пять, в цитаты однозначно
А не прощ ли сделать 1 прцедуру для обработки, передавать ей параметр — номер выбранного checkbox, и в ней самой уже делать select case?
- alibek
- Большой Человек
- Сообщения: 14205
- Зарегистрирован: 19.04.2002 (Пт) 11:40
- Откуда: Russia
alibek » 22.03.2007 (Чт) 10:45
RayShade писал(а):select case true — это пять, в цитаты однозначно
Вообще-то иногда select case true бывает довольно удобен
Lasciate ogni speranza, voi ch’entrate.
- RayShade
- Scarmarked
- Сообщения: 5511
- Зарегистрирован: 02.12.2002 (Пн) 17:11
- Откуда: Russia, Saint-Petersburg
-
- Сайт
- ICQ
RayShade » 22.03.2007 (Чт) 11:51
alibek
Ага. Примерно в таких же случаях как и do while 1=1
- GSerg
- Шаман
- Сообщения: 14286
- Зарегистрирован: 14.12.2002 (Сб) 5:25
- Откуда: Магадан
GSerg » 22.03.2007 (Чт) 12:07
Да нет, совершено в иных
Часто юзаю; очень полезная конструкция.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас
- Krasnaja Shapka
- Обычный пользователь
- Сообщения: 87
- Зарегистрирован: 26.10.2006 (Чт) 12:13
- Откуда: Киев
Krasnaja Shapka » 22.03.2007 (Чт) 13:38
RayShade писал(а):select case true — это пять, в цитаты однозначно
а можно более конструктивно, что вам не нравится в такой конструкции?
Если ясность вашего объяснения исключает ложное толкование, все равно кто-то поймет вас неправильно.
- Andrey Fedorov
- Член-корреспондент академии VBStreets
- Сообщения: 3287
- Зарегистрирован: 21.05.2004 (Пт) 9:28
- Откуда: Москва
Andrey Fedorov » 22.03.2007 (Чт) 15:47
RayShade писал(а):alibek
Ага. Примерно в таких же случаях как и do while 1=1
Ну, если быть точным, то иногда действительно бывает удобно сделать что-то вроде:
- Код: Выделить всё
Do
...
Select Case ...
Case ...
Case ...
Case Else: Exit Do
End Select
...
Loop
Фиг Вам! — Сказал Чебурашка, обгладывая Крокодила Гену…
- KL
- Microsoft MVP
- Сообщения: 483
- Зарегистрирован: 30.10.2005 (Вс) 0:31
- Откуда: Madrid
KL » 23.03.2007 (Пт) 23:36
RayShade писал(а):alibek
Ага. Примерно в таких же случаях как и do while 1=1
пример:
- Код: Выделить всё
Function TestFunction(a As Variant)
Select Case True
Case IsArray(a): MsgBox "Array"
Case a Like "*test*": MsgBox "Contains ""text"""
Case Else: MsgBox "Other"
End Select
End FunctionSub test()
TestFunction Array(1, 3, 4)
TestFunction "contest"
TestFunction True
End Sub
Привет,
KL
- KL
- Microsoft MVP
- Сообщения: 483
- Зарегистрирован: 30.10.2005 (Вс) 0:31
- Откуда: Madrid
KL » 23.03.2007 (Пт) 23:47
SaleXuS писал(а):Дело в том, что я хочу сделать код как можно меньше. Делать без цикла нереально, проверяться будут аж 18 чекбоксов, для этого лучше цикл.
Вчера кода не было у меня под рукой, сегодня принес. Выглядит так:Sub Восст_формул01_Click() ‘ Кнопка
Dim Confirm1 As String
Dim i As Integer
Dim nameConfirm1 = MsgBox(«Вы отметили галочками строки, в зеленых ячейках которых» & _
«будут восстановлены исходные формулы. Продолжить?», vbYesNo, «Внимание!»)If Confirm1 = vbYes Then
With Assistant.NewBalloon
For i = 1 To 18
name = «Восстан_формулы» + i‘Вызов процедуры
If .CheckBoxes(i).Checked = True Then Call name
Next i
End With
End IfEnd Sub
При выполнении выходит ошибка на «Call name»:
Compile error: Expected Sub, Function or PropertyЧто я делаю неправильно?
Call на Run пробовал заменить?
Привет,
KL
Вернуться в VBA
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1