Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Цикл for для checkbox'ов / 25 сообщений из 53, страница 1 из 3
29.06.2007, 11:24
    #34628163
Цикл for для checkbox'ов
Здрасти всем. Нужна помощь в след. вопросе: у меня в экселе 250 checkbox'ов и надо сделать цикл такого вида:
for i=1 to 250
checkbox i . visible=false
next i
Проблема заключается в том, что система не понимает, что такое checkbox i.
Помогите плиззз.
...
Рейтинг: 0 / 0
29.06.2007, 11:39
    #34628227
michael R
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл for для checkbox'ов
массив контролей
...
Рейтинг: 0 / 0
29.06.2007, 11:48
    #34628263
Цикл for для checkbox'ов
Дело в том, что мой ник не случайно Почти Лузер. Объясните по подробнее и желательно с примером пжалста
...
Рейтинг: 0 / 0
29.06.2007, 11:49
    #34628271
Цикл for для checkbox'ов
Дело в том, что мой ник не случайно Почти Лузер. Объясните по подробнее и желательно с примером пжалста
...
Рейтинг: 0 / 0
29.06.2007, 12:17
    #34628392
Ден Программёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл for для checkbox'ов
Почти ЛузерДело в том, что мой ник не случайно Почти Лузер. Объясните по подробнее и желательно с примером пжалста

Хоть один честный. Это похвально, но тогда фоту надо было выставить

Ладно, к делу.
Прежде чем помощи просить надо показать свой пример.
Я понял так, что ты умудрился вставить в книгу или лист 250 чекбоксов! эта работа похвальна... для почти лузера...но сделать можно было проще создать массив контролов:

помещаешь один чек и его свойство Индекс делаешь равным хотя бы 0
потом надо создать процедуру вывода 249 оставшихся чексов

и тогда общаться с ними в твоей проце, но немного её изменив

for i=1 to 250
let checkbox( i).visible=false
next i

Надеюсь понятно, а если нет, поищи "массивы контролов"
...
Рейтинг: 0 / 0
29.06.2007, 12:24
    #34628427
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл for для checkbox'ов
Ден ПрограммёрЭто похвально, но тогда фоту надо было выставитьАхтунг?

PS: По делу. Дело происходит в экселе, а он не поддерживает массивы контролов. Нужно юзать, если мне ни с кем не изменяет память, коллекцию Shapes. Поиск даст больше, эта тема не раз обсуждалась.
...
Рейтинг: 0 / 0
29.06.2007, 12:29
    #34628444
@TM@ROZчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл for для checkbox'ов
не знаю как в екселе, попробуй сам преобразовать.

в простом бейсике этоо делается так:

1. НЕ программный способ
создаётся первый чекбокс

в свойстве Index пишется первое значение ( у нас - 1)

создаётся второй чекбокс

в свойстве Index пишется второе значение ( у нас - 2)

и так оставшиеся 248 раз

код:
Код: plaintext
1.
2.
3.
For i =  1  to  250 
Сheckbox(i).Visible = False
Next i
2. Программный способ

создаётся ОДИН чекбокс

в свойстве Index пишется первое значение ( у нас - 1)

код для открытия формы
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Private Sub Form_Load()
For i =  2  to  250  ' первый элемент есть, начинаем со второго
Load checkbox(i)
checkbox(i).Visible = True
checkbox(i).Left = значение_положения_данного_чекбокса_от_левого_края_формы
checkbox(i).Top = значение_положения_данного_чекбокса_от_верхнего_края_формы
Next i
End Sub

Дальше - как обычно (пишешь где надо):
Код: plaintext
1.
2.
3.
For i =  1  to  250 
Сheckbox(i).Visible = False
Next i
...
Рейтинг: 0 / 0
29.06.2007, 12:31
    #34628455
@TM@ROZчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл for для checkbox'ов
пока я писакал выяснилось, что массивов то нетути в екселе :) сорри
...
Рейтинг: 0 / 0
29.06.2007, 12:31
    #34628456
AndreyMp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл for для checkbox'ов
Насколько я понял речь идет о VBA? Там нет массива чекбоксов, как и любого контрола кажется (точно за все не помню). А выход - коллекция контролов. Примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
Dim x As Object
For Each x In Me.Controls
If TypeName(x) = "CheckBox" Then
x.visible=false
End If
Next x
Не проверял, может и не работает. На ходу пишу.
...
Рейтинг: 0 / 0
29.06.2007, 12:34
    #34628466
@TM@ROZчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл for для checkbox'ов
да, если чёт непонятно, Лузер, тогда гугли "VB коллекция"
...
Рейтинг: 0 / 0
29.06.2007, 12:49
    #34628526
AndreyMp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл for для checkbox'ов
Только вот непонятно. 250 чекбоксов!!! Я бы это принял за психическую атаку и немедленно бы удалил этот файл.
...
Рейтинг: 0 / 0
29.06.2007, 12:59
    #34628559
@TM@ROZчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл for для checkbox'ов
AndreyMp...Я бы это принял за психическую атаку...
;)
...
Рейтинг: 0 / 0
29.06.2007, 13:46
    #34628745
Цикл for для checkbox'ов
AndreyMpТолько вот непонятно. 250 чекбоксов!!! Я бы это принял за психическую атаку и немедленно бы удалил этот файл.

Да на самом деле это просто эл. тест.

Кроме этого обнаружил, что в свойсвах чекбоксов не индекса, поэтому ничего не получается, можа есть какие еще варианты?
...
Рейтинг: 0 / 0
29.06.2007, 13:55
    #34628785
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл for для checkbox'ов
Для особо одаренных и наблюдательных повторяю еще раз: AntonariyДело происходит в экселе, а он не поддерживает массивы контролов. Нужно юзать, если мне ни с кем не изменяет память, коллекцию Shapes (если они на листе) . Поиск даст больше, эта тема не раз обсуждалась.Если на форме, коллекцию Controls.
...
Рейтинг: 0 / 0
29.06.2007, 14:18
    #34628865
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл for для checkbox'ов
Почти Лузер,
если речь об элементах управления, внедрённых в рабочий лист, то код может выглядеть так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Sub HideEmbeddedCheckboxes()
 Dim oOLEObjs As Excel.OLEObjects
 Dim o As Excel.OLEObject
 Dim i As Long
 Set oOLEObjs = ActiveSheet.OLEObjects
 For i =  1  To  250 
    Set o = oOLEObjs("Checkbox" & i)
    o.Visible = False
 Next i
 Set o = Nothing
 Set oOLEObjs = Nothing
End Sub
...
Рейтинг: 0 / 0
29.06.2007, 14:45
    #34628991
AndreyMp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл for для checkbox'ов
Ну а если на форму, то я чуть ранее писал. Проверил, работает.
...
Рейтинг: 0 / 0
29.06.2007, 16:04
    #34629286
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл for для checkbox'ов
БенедиктПочти Лузер,
если речь об элементах управления, внедрённых в рабочий лист, то код может выглядеть так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Sub HideEmbeddedCheckboxes()
 Dim oOLEObjs As Excel.OLEObjects
 Dim o As Excel.OLEObject
 Dim i As Long
 Set oOLEObjs = ActiveSheet.OLEObjects
 For i =  1  To  250 
    Set o = oOLEObjs("Checkbox" & i)
    o.Visible = False
 Next i
 Set o = Nothing
 Set oOLEObjs = Nothing
End Sub


Я бы использовал цикл без жестко заданного количества чекбоксов. Я бы также убрал Set o = Nothing, Set oOLEObjs = Nothing, поскольку это излишне:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Sub HideEmbeddedCheckboxes()
    Dim oOLEObjs As Excel.OLEObjects
    Dim o As Excel.OLEObject
    Dim objWsht As Worksheet
    
    Set objWsht = ThisWorkbook.Worksheets( 1 )
    Set oOLEObjs = ActiveSheet.OLEObjects
    
    For Each o In objWsht.OLEObjects
        o.Visible = Not o.progID = "Forms.CheckBox.1"
    Next o
    
End Sub
...
Рейтинг: 0 / 0
29.06.2007, 16:15
    #34629317
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл for для checkbox'ов
Кстати, к сожалению, код Бенедикта не будет работать, если давать индивидуальные имена чекбоксам, что часто ожидается в обычной практике кодирования.

Как вариант для любых OLE objects на листе:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Private Sub CommandButton1_Click()
    HideUnhideEmbeddedCheckboxes "Forms.CheckBox.1"
End Sub

Sub HideUnhideEmbeddedCheckboxes(ByVal pstrProgID As String)
    Dim oOLEObjs As Excel.OLEObjects
    Dim o As Excel.OLEObject
    Dim objWsht As Worksheet
    
    Set objWsht = ThisWorkbook.Worksheets( 1 )
    Set oOLEObjs = ActiveSheet.OLEObjects
    
    For Each o In objWsht.OLEObjects
        If o.progID = pstrProgID Then
            o.Visible = Not o.Visible
        End If
    Next o
    
End Sub
...
Рейтинг: 0 / 0
29.06.2007, 16:17
    #34629321
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл for для checkbox'ов
Даже короче:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Sub HideUnhideEmbeddedCheckboxes(ByVal pstrProgID As String)
    Dim oOLEObjs As Excel.OLEObjects
    Dim o As Excel.OLEObject

    Set oOLEObjs = ActiveSheet.OLEObjects
    
    For Each o In oOLEObjs
        If o.progID = pstrProgID Then
            o.Visible = Not o.Visible
        End If
    Next o
    
End Sub
...
Рейтинг: 0 / 0
29.06.2007, 16:35
    #34629386
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл for для checkbox'ов
VladConn,
1) В общем случае надо либо список имён элементов управления хранить, либо как-то признаки принадлежности группе, требующей обработки, им навешивать. Но это [пока для меня] выглядит усложнением задачи (ещё не понятно, правильно ли понятой).
2) Я предпочитаю сравнивать тип через TypeOf ... Is ...: TypeOf o.Object Is MSForms.Checkbox.
3) Set ... = Nothing я бы не убирал. Из педагогических соображений :)
...
Рейтинг: 0 / 0
29.06.2007, 16:51
    #34629442
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл for для checkbox'ов
Да, конечно. Группы, тэги и т.п. - ясное дело. Для этого я и использовал ProgID, чтобы указать на такую проблему. Насчет педагогических соображений. Как раз я бы убирал, т.к. это демонстрирует понимание манипулирования памятью в VB6 и раз и навсегда ставит крест на мифах и легендах о Set ... Nothing.

Еще раз о последнем. Я хочу сказать, что использование в данном контексте Set ... Nothing на самом деле ни плохо, ни хорошо. Это чисто вопрос стиля. Тут на самом деле нет смысла спорить. Я сам много лет так делал. Стиль есть стиль. Важно только понимать, что делать это необязательно.

Успехов
...
Рейтинг: 0 / 0
29.06.2007, 17:06
    #34629480
Ден Программёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл for для checkbox'ов
VladConnДа, конечно. Группы, тэги и т.п. - ясное дело. Для этого я и использовал ProgID, чтобы указать на такую проблему. Насчет педагогических соображений. Как раз я бы убирал, т.к. это демонстрирует понимание манипулирования памятью в VB6 и раз и навсегда ставит крест на мифах и легендах о Set ... Nothing.

Еще раз о последнем. Я хочу сказать, что использование в данном контексте Set ... Nothing на самом деле ни плохо, ни хорошо. Это чисто вопрос стиля. Тут на самом деле нет смысла спорить. Я сам много лет так делал. Стиль есть стиль. Важно только понимать, что делать это необязательно.

Успехов

А мона вопрос, а если set ...=Nothing'ом я "обнуляю" ненужные в данный момент рекордсеты, это хорошо или плохо?
...
Рейтинг: 0 / 0
29.06.2007, 17:18
    #34629522
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл for для checkbox'ов
Если черeз несколько линий кода его исполнение перейдет в другой блок, где ваш рекордсет, видимый только в своем блоке, уже все равно невидим, то можно обойтись без Set ... Nothing. Он умрет и без вашей помощи. Вот в аварийном завершении процедуры я бы предусмотрел Set ... Nothing. Если возникла ошибка, то мне лично будет трудно сказать, что там произойдет с памятью. Т.е.:

On error goto MethodError

.....
....

MethodError:

If Err.Number <> 0 then
....
Set ... Nothing
end if
...
Рейтинг: 0 / 0
29.06.2007, 17:27
    #34629543
Ден Программёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл for для checkbox'ов
VladConnЕсли черeз несколько линий кода его исполнение перейдет в другой блок, где ваш рекордсет, видимый только в своем блоке, уже все равно невидим, то можно обойтись без Set ... Nothing. Он умрет и без вашей помощи. Вот в аварийном завершении процедуры я бы предусмотрел Set ... Nothing. Если возникла ошибка, то мне лично будет трудно сказать, что там произойдет с памятью. Т.е.:

On error goto MethodError

.....
....

MethodError:

If Err.Number <> 0 then
....
Set ... Nothing
end if


Мало что понял!!!
У меня несколько глобальных (на уровне формы) рекордсетов. И для экономии памяти и неуменьшения быстродействия операций, если данные из одного рекорда не нужны в данный момент я его обнуляю, и заполняю и работаю с другим, который нужен именно сейчас.
...
Рейтинг: 0 / 0
29.06.2007, 17:32
    #34629552
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл for для checkbox'ов
Мои объяснения не затрагивали глобально определенных объектов. Касательно именно рекордсетов: в своей практике мне не приходилось еще сталкиваться с оправданностью их декларирования глобально.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Цикл for для checkbox'ов / 25 сообщений из 53, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]