2009-12-01 2 views
0

Следующий код вызывается каждый раз, когда форма открывается. Он отлично работает до 5-го открытия, а затем пропускает удаление одного из элементов управления. Кто-нибудь знает, почему это?Код VBA Останавливает работу

For Each cb In Forms(frmName).Controls 
    If cb.ControlType = acCheckBox Then 
     If Left(cb.Name, 3) = "clr" Then 
      DeleteControl frmName, cb.Name 
     End If 
    ElseIf cb.ControlType = acLabel Then 
     If Left(cb.Name, 3) = "clr" Then 
      DeleteControl frmName, cb.Name 
     End If 
    End If 
Next 
+0

Какова ваша общая цель? Необычно манипулировать элементами управления в дизайне программно. –

ответ

2

Когда вы удаляете элемент из коллекции в Access, следующий элемент перемещается в это место. Таким образом, когда дело доходит до удаления предметов из коллекции, вы должны начать в конце коллекции и вернуться назад.

Так замените строку

For Each cb In Forms(frmName).Controls 

с

For counter = Forms(frmName).Controls.Count - 1 To 0 Step -1 
set cb = Forms(frmName).Controls.Item(counter) 

Мой следующий вопрос, хотя это то, что ваша главная цель? Необычно манипулировать элементами управления в дизайне программно.

+0

Это обычная проблема с коллекциями в VBA, коллекции теряют порядок при удалении по имени или от 1 до счета, метод, предложенный Тони Тоусом, является обычным решением. – Fionnuala

+0

Роберт Харви, ваше решение работает, но вы не понимаете природу коллекций в Access и как они работают при удалении элементов. Так что да, я дерзкий. –

+0

В VB и VB.Net также часто используется Шаг 1 – Fionnuala