2017-02-21 38 views
0

У меня есть UserForm, который содержит 20 Comboboxes, а затем 3 соответствующих текстовых поля рядом с каждым Combobox (так всего 60 текстовых полей). Каждый Combobox отображает те же самые два варианта (выбор 1 и выбор 2). 3 текстовых поля рядом с Combobox предназначены для описания, количества элементов и цены за элемент соответственно.Почему цикл For повторяет процедуру?

Я использовал цикл For, чтобы зацикливать 20 Comboboxes. Код, находящийся в цикле, записывает входы в текстовые поля в лист Excel в формате таблицы. Назначение Combobox состоит в том, чтобы разделить входы в текстовые поля на два варианта (выбор 1 и 2) в таблице на листе Excel.

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

Это код:

Dim i as Integer 'row counter 
Dim j As Integer 
Dim h As Integer 
Dim ctrl As Control 
Dim num As Integer 
Dim txt As Control 


For Each ctrl In Me.custom_prices.Controls 
    If TypeName(ctrl) = "ComboBox" Then 
      If ctrl = "Choice 1" Then 
       j = i 
       For Each txt In Me.custom_prices.Controls 
       If TypeName(txt) = "TextBox" And txt.Tag = "DESCRIPTION" Then 
       For num = 1 To 20 
        If txt.Value = "" Then Exit For 
        If Controls("textbox" & num).Value = "" Then Exit For 
        If Controls("textboxprice" & num).Value = "" Then Exit For 
        If Controls("textboxno" & num).Value = "" Then Exit For 
        ActiveCell.Offset(rowOffset:=j, columnOffset:=0).Value = Controls("textbox" & num).Value 
        ActiveCell.Offset(rowOffset:=j, columnOffset:=1).Value = Controls("textboxprice" & num).Value 
        ActiveCell.Offset(rowOffset:=j, columnOffset:=2).Value = Controls("textboxno" & num).Value 
        ActiveCell.Offset(rowOffset:=j, columnOffset:=3).Value = Controls("textboxno" & num).Value * Controls("textboxprice" & num).Value 
        j = j + 1 
        sub_total = sub_total + (Controls("textboxno" & num).Value * Controls("textboxprice" & num).Value) 
       Next num 
       End If 
       Next txt 
       i = j 
       sub_total_3 = sub_total 
       sub_total = 0 


      ElseIf ctrl = "Choice 2" Then 
       h = i 
       For Each txt In Me.custom_prices.Controls 
       If TypeName(txt) = "TextBox" And txt.Tag = "DESCRIPTION" Then 
       For num = 1 To 20 
        If txt.Value = "" Then Exit For 
        If Controls("textbox" & num).Value = "" Then Exit For 
        If Controls("textboxprice" & num).Value = "" Then Exit For 
        If Controls("textboxno" & num).Value = "" Then Exit For 
        ActiveCell.Offset(rowOffset:=h, columnOffset:=0).Value = Controls("textbox" & num).Value 
        ActiveCell.Offset(rowOffset:=h, columnOffset:=1).Value = Controls("textboxprice" & num).Value 
        ActiveCell.Offset(rowOffset:=h, columnOffset:=2).Value = Controls("textboxno" & num).Value 
        ActiveCell.Offset(rowOffset:=h, columnOffset:=3).Value = Controls("textboxno" & num).Value * Controls("textboxprice" & num).Value 
       h = h + 1 
       sub_total = sub_total + (Controls("textboxno" & num).Value * Controls("textboxprice" & num).Value) 
       Next num 
       End If 
       Next txt 
       i = h 
       sub_total_4 = sub_total 
       sub_total = 0 

      Else: ctrl = "" 

       sub_total = sub_total 

     End If 
    End If 
Next ctrl 

Спасибо заранее.

+0

Я _guessing_, потому что каждый раз, когда вы перебираете «ComboBoxes», вы прокручиваете каждый «TextBox». Вам нужно как-то связать друг друга. – Bugs

+0

Точно, я тоже так думаю. Я просто не знаю, как это сделать. –

+0

Я привел пример кода, который может помочь вам сгруппировать элементы управления. Я не углубляюсь в код, но это может дать вам начало. Дайте мне знать ваши мысли, когда вы получите шанс. – Bugs

ответ

0

Может возникнуть проблема с условиями типа (textbox) & num). Текстовое поле - это строка, и вы пытаетесь объединить ее в Integer. Попробуйте преобразовать Num в строку, как это ->

("Textbox" & CStr (Num))

Тест как ("Textbox" & CStr (Num)) и ("текстовое поле" & Num) по используя Msgbox для каждого, чтобы видеть оба результата, как это ->

Msgbox "с ПРМ =" & ("текстовое поле" & ПРМ (NUM))

Msgbox "нет ПРМ =" & ("текстовое поле" & Num)

Если нежелательное пространство в результате при преобразовании Num в строку попробовать это ->

("текстовое поле" & уравновешивания (CStr (Num)))

+0

Я пробовал оба, и они оба работают. Я удалил текстовое поле для цикла, и процедура повторяется дважды вместо четырех раз. –

0

Вы могли бы использовать GroupBox к группу элементы управления:

enter image description here

Я хотел бы затем через каждый цикл GroupBox, а затем throu Gh каждый ComboBox и TextBox:

For Each grpb As GroupBox In Me.Controls().OfType(Of GroupBox)() 

    For Each cmb As ComboBox In grpb.Controls().OfType(Of ComboBox)() 

    Next 

    For Each txtb As TextBox In grpb.Controls().OfType(Of TextBox)() 

    Next 

Next 

Обратите внимание на использование OfType. Это пригодится, когда вы знаете, какие элементы управления вы хотите сосредоточить. Теперь вам не нужен код, например If TypeName(ctrl) = "ComboBox".

Теперь у вас больше контроля. Перейдя по элементам управления на GroupBox, вы теперь знаете, к какому TextBox связан с которыми ComboBox, и вы не будете перебирать то же самое TextBox снова и снова.