Страницы: 1
RSS
Порядок перебора checkBox в цикле
 
Я за помощью. Не откажите :)  
На форме более 20 CheckBox. Порядок (ТabIndex) установлен.  
Пытаюсь перебрать в цикле - если установлена "галочка", в массив занести Caption:  
 
   j = 1  
   For Each x In Me.Controls  
       If TypeOf x Is MSForms.CheckBox Then  
           If x.Value Then  
               ArrHeader(1, j) = x.Caption  
               j = j + 1  
           End If  
       End If  
   Next x  
 
Массив формируется, потом выгружается на лист.  
Проблема: в цикле CheckBox перебираются, но как? На лист надписи выгружаются не по порядку ТabIndex. Обнаружить алгоритм не удалось: не по ТabIndex, не по именам, не по алфавиту Caption, не по расположению на Frame'ах...  
Возможно, порядок создания CheckBox на форме (не знаю этого порядка, создавал не я)? Но они же переименованы и теперь имеют свои имена, а не CheckBox1, CheckBox2...  
 
Что еще может служить указателем для последовательности перебора в массиве?  
Если прямого ответа нет, буду рисовать новую форму для экспериментов.
 
обычно циклы For Each используются там, где порядок элементов неважен.  
т.е. нужно перебрать либо все элементы, либо найти любой, удовлетворяющий условию, либо есть уверенность, что то, что ищем в коллекции - находится там в одном экземпляре...  
 
пока не понял - почему порядок важен в данном примере?
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Примерчик бы (лениво делать...)  
Может перебать их от i до конца и брать в таблицу по значению tabindex (нет примера...)
 
Значит ли это, что данный цикл работает неведомо как и нет метода заставить его перебирать правильно?  
Вот анархист... А я больше часа читаю-пробую...  
Пока не проверил - обычный For/Next будет послушным?  
 
Порядок важен - нужно формировать шапку таблицы.  
 
Примера нет, так как - нет :)  
Важно было понять причину, дальше сам... Если не справлюсь,  пример будет :)
 
Вить, как раз по имени и стоит в твоем случае перебирать. for ... next. А для for each порядок не важен:)
Я сам - дурнее всякого примера! ...
 
примерно так:  
 
j = 1  
For Each x In Me.Controls  
If TypeOf x Is MSForms.CheckBox Then  
If x.Value Then  
ArrHeader(1, j) = x.Caption  
ArrHeader(2, j) = x.TabIndex  
j = j + 1  
End If  
End If  
Next x  
 
with [a1].resize(2,j)
 .value=ArrHeader  
 .sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess, _  
       OrderCustom:=1, MatchCase:=False, Orientation:=xlLeftToRight, _  
       DataOption1:=xlSortNormal  
 .rows(2).clearcontents  
end with  
 
конечно, если вторая строка под шапкой хотя бы временно свободна.  
иначе - сортировать массив в коде.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Спасибо всем, пока достаточно.  
Понравилась идея: для сортировки занести в массив TabIndex. Важно разместить надписи в шапке по порядку следования "галочек".  
Буду пробовать.
 
Я что-то такое сообразил - для 20 штук можно и так:  
 
Private Sub CommandButton1_Click()  
   For i = 0 To Me.Controls.Count - 1  
       For Each x In Me.Controls  
           If x.TabIndex = i Then  
               If TypeOf Me.Controls(i) Is MSForms.CheckBox Then  
                   MsgBox x.Caption  
               End If  
           End If  
       Next  
   Next  
End Sub
 
Забыл строчку назад скорректировать, нужно лучше  
If TypeOf x Is MSForms.CheckBox Then  
хотя почему-то работает и    
Me.Controls(i)    
С нуля что-ли считаются... :)  
 
-=5555=-
 
в общем случае нет гарантии, что на форме есть только чекбоксы, поэтому диапазон значений TabIndex может не совпадать с кол-вом чекбоксов. :)
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
ikki, мой вариант другие пропускает.  
Т.е. если индекс 2 и это чекбокс - то выводит. Если нет, то идём дальше.  
У меня ведь в моём примере ещё и кнопка запуска всего безобразия есть :)
 
Все-все-все, спасибо-спасибо-спасибо :)  
Главное понял - то, что цикл For Each сам себе на уме.  
 
Игорь, последний макрос работает, нужно только подрихтовать или код, или форму(CheckBox на нескольких рамках). Наверное, второе.  
Может, по совету Сергея, сработаю на For/Next.  
Саша, разберусь, чекбоксы можно по порядку выставить.  
Дима, за OptionButton не знал (на форме их нет), в копилку знаний положил.
 
Игорь, для 20-30 элементов - нормально.  
но вообще-то цикл в цикле - расточительно :)
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
{quote}{login=vikttur}{date=03.11.2012 04:33}{thema=}{post}Все-все-все{/post}{/quote}  
 
эх... :(
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Ну так я написал, что на 20 можно. :)  
Если больше - сложить все одним циклом в массив с названиями и табами (отобрать естественно только что нужно), по табам отсортировать, вывести куда нужно.
 
я в подобных случаях использую обычный листбокс с мультиселектом и галочками.  
может, и в Вашем случае подойдёт?
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
{quote}{login=ikki}{date=03.11.2012 04:51}{thema=пс.}{post}...обычный листбокс с мультиселектом и галочками...{/post}{/quote}  
Тоже вариант.
 
>502 Bad Gateway  
нет слов, одни эмоции  
 
>Проблема: в цикле CheckBox перебираются, но как?  
в порядке создания (насколько помню)  
 
>Чисто для инфо: под тип MSForms.CheckBox так же попадает и OptionButton  
варианты:  
If TypeName(x) = "CheckBox" Then  
If TypeOf x Is MSForms.CheckBox And Not TypeOf x Is MSForms.OptionButton Then
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
ikki, спасибо за пинок в нужную сторону.  
Обычный листбокс с мультиселектом и даже без галочек - и места меньше, и писанины.
 
если что - я не виноватый - я не сам это придумал.    
подсмотрел где-то :)
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
Страницы: 1
Читают тему
Наверх