2015-03-24 5 views
0

Я немного работал с пользовательскими формами в VBA и знаю некоторые из трюков для циклического перехода через все элементы управления. Тем не менее, я сталкиваюсь с проблемами с этим, и мне нужен способ считывать значения строк строки и причины в массивы на основе значений «Площадь» и «Сдвиг». Возможные значения для этих двух столбцов приведены на рисунке.

В основном то, что мне нужно что-то вродеПетля через один столбец Userform

For Each ctl In Me.Controls 
    If somectl.Value = "Kitting" And otherctl.Value = "1" Then 
     ReDim Preserve somearray(i) 
     somearray(i) = ctl.Value 
    End If 
Next ctl 

enter image description here

+0

Проблема в том, что эта форма (надеюсь) фактически представляет собой «Непрерывную форму», и каждая запись содержит элементы управления с тем же именем. Я говорю «надеюсь», потому что, если ваша таблица настроена так, что каждое управляющее имя на этом снимке уникально, вам нужно взять класс дизайна базы данных. Можете ли вы сделать это с помощью запроса или даже VBA, если это абсолютно необходимо? –

+0

@JohnnyBones Каждый столбец имеет уникальное имя. Как и в столбце «area», имена: ** areadd1, areaadd2 ** и т. Д. И нет, я не могу использовать запрос. – AggieIE

+0

Когда вы говорите: «Нужен способ прочитать значения столбцов строки и причины в массивах, основанных на значениях« Площадь »и« Сдвиг », можете ли вы немного расшириться? Я не уверен, что происходит в массиве. Вы только хотите поместить поля Line и Reason в массив, когда Area = «Kitting» и Shift = «1»? –

ответ

2

Если вы смогли стандартизировать свое именование, вы можете сделать это следующим образом:

Private Sub CommandButton1_Click() 
    Dim i As Integer 
    Dim areaCB As MSForms.ComboBox 
    Dim shiftCB As MSForms.ComboBox 
    Dim reasonCB As MSForms.ComboBox 
    Dim somearray 

    For i = 1 To 3 ' 3 or more depending on how may you have in your form 
     Set areaCB = Me.Controls("areadd" & i) 
     Set shiftCB = Me.Controls("shiftdd" & i) 
     Set reasonCB = Me.Controls("reasondd" & i) 

     If areaCB.Value = "Kitting" _ 
     And shiftCB.Value = "1" Then 
      If IsArray(somearray) Then 
       ReDim Preserve somearray(UBound(somearray) + 1) 
       somearray(UBound(somearray)) = reasonCB.Value 
      Else 
       somearray = Array(reasonCB.Value) 
      End If 
     End If 
    Next 
End Sub 

Так например, в areadd1, - номер строки.
Соответственно, ComboBox рядом с ним справа находится shiftdd1 и так далее.
Это только для того, чтобы дать вам представление. Измените его в соответствии с вашими потребностями.

+0

Большое спасибо, работал как шарм – AggieIE

Смежные вопросы