2017-02-21 21 views
0

私は、20のコンボボックスとそれぞれのコンボボックスの隣に3つのそれぞれのテキストボックス(したがって、合計60のテキストボックス)を含むユーザーフォームを持っています。各コンボボックスは同じ2つのオプション(選択肢1と選択肢2)を表示します。コンボボックスに隣接する3つのテキストボックスは、説明、項目数、項目ごとの価格です。Forループがプロシージャを複製するのはなぜですか?

私はForループを使用して20個のComboboxをループしました。ループ内のコードは、テキストボックスの入力をExcelシートにテーブル形式で書き込みます。コンボボックスの目的は、テキストボックスの入力をExcelシートの表の2つのオプション(選択肢1と2)に分割することです。

コードは最初のコンボボックスでは機能しているようですが、2番目のコンボボックスとそれぞれのテキストボックスのデータを入力すると、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

私はあなたが 'ComboBoxes'をループするたびに、それぞれの' TextBox'をループしているからです。あなたは何とか2人を結びつけて見る必要があります。 – Bugs

+0

まさに、私もそうだと思います。私はそれを行う方法がわかりません。 –

+0

あなたのコントロールをグループ化するのに役立ついくつかのサンプルコードを提供しました。私はコードに深くはいないが、それはあなたにスタートを与えるかもしれない。あなたがチャンスを取ったときにあなたの考えを知らせてください。 – Bugs

答えて

0

( "textbox" &)タイプの用語に問題がある可能性があります。 Textboxは文字列であり、これをIntegerに連結しようとしています。 このような文字列にNUMを変換してみてください - >

( "テキストボックス" & CStr関数(NUM))

テストの両方( "テキストボックス" & CStr関数(NUM))と、( "テキストボックス" & NUM)によって>

MSGBOX &( "テキストボックス" & CStr関数(NUM))

MSGBOX "NO CStr関数=" &( "テキストボックス" "CStr関数=と"- ごとにメッセージボックスを使用して、このような両方の結果を表示します210 NUM)

文字列これを試してNUMを変換する際に、不要なスペースは結果であった場合 - >

( "テキストボックス" &トリム(CSTR(NUM)))

+0

私は両方を試してみました。私はTextbox For Loopを削除し、この手順を4回ではなく2回繰り返しました。 –

0

あなたは可能性がありGroupBoxにグループコントロールを使用:

enter image description here

をIだろう次いで各GroupBoxとthrouをループ各ComboBoxTextBoxをGH:

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のコントロールをループすると、ComboBoxにリンクされているTextBoxがわかります。もう一度同じように繰り返すことはありません。TextBox

関連する問題