2017-08-07 12 views
0

私は(より実際には、これら二つは、私は、現時点ではと働いているものです)2つのユーザーフォームを持っているときに、第2列の値を取得します。VBA複数列COMBOXは - 最初の列はリストのバインド列

最初のフォームは「ExistingOrNewWelder」と呼ばれます(フォームAと呼びます)。

2番目のフォームは「InitialInfo_Form」と呼ばれます(フォームBと呼びます)。ユーザは、Aが開かれたワークシートのフォーム上のボタンをクリックする

。最初は、それは次のようになります。

ユーザーは、「既存の溶接機用の新しいWQTRを追加」の横のラジオボタンをselcts

Initial view of Form A

コンボボックスが表示されます。

ComboBox shown in form with two lists

コンボボックスの項目の一つがリストにバインドされた列の値のみがボックスに表示され選択された場合。

Shows ComboBox with only bound column data visible

だから私は苦労してる私はコンボボックスに表示される名前やID番号の両方を使用できるようにしたいということです。ユーザーが[OK]をクリックしたときに表示される後続のフォームBに両方の情報が表示されるようにします。画像で

The next userform where I need the data to appear.

言葉はFooは、形態AからID番号を表し、私は以下を含めています私の現在のコードでその単語が表示されます。

コードのこの最初の部分は、形態Aの

Option Explicit 
Dim newWelder As Boolean 
Dim wqtr As Boolean 
Public newWelderBoolValue As Boolean 
Public welderIDSelected As String 

Private Sub UserForm_Initialize() 
    'varialbe fun 
    Dim lastRow As Long 
    Dim nameCell As range 
    Dim box As control 

    wqtr = False 
    newWelder = False 

    'Set Window size and position 
    With Application 
     .WindowState = xlMaximized 
     Me.Top = .Top * 0.5 
     Me.Left = .Left * 1.0015 
     Zoom = Int((.Width * 0.85)/(Width * 0.85) * 60) 
     Width = .Width * 0.28 
     Height = .Height * 0.5 
    End With 

    'Activate the worksheet 
    Worksheets("All Welders Data").range("A1").Activate 

    'sort the data in the active sheet by the welder's name then by welder's ID number 
    With ActiveSheet.Sort 
     .SortFields.Add Key:=range("E3"), Order:=xlAscending 
     .SortFields.Add Key:=range("B3"), Order:=xlAscending 
     .SetRange ActiveCell.CurrentRegion.Offset(1) 
     .Header = xlYes 
     .MatchCase = False 
     .Orientation = xlTopToBottom 
     .Apply 
    End With 

    'populate the combox from the active sheet (welder name in the 
    'first column, welder ID number in the second column. 
    With ActiveSheet 
     lastRow = .Cells(.Rows.count, "A").End(xlUp).row 
     For Each nameCell In .range("E3:E" & lastRow) 
      If nameCell.Value <> "" Then 
       With Me.chooseWelderNameComboBox 
        .ColumnCount = 2 
        .AddItem nameCell.Value 
        .list(.ListCount - 1, 1) = nameCell.Offset(, -1).Value 
        'ComboBox now shows the values in column "E" and the values 
        'in coulmn "D" - in that order, as in "Name" - "ID Number". 
        '(the reverse order of the columns in the worksheet.) 
       End With 
      End If 
     Next 
    End With 
End Sub 

Private Sub existingWelderOptionButton_Click() 
    'display the welderName Combox when this radio button 
    'is selected and set the switches(bools) for the Submit button. 
    wqtr = True 
    newWelder = False 
    Me.chooseWelderLabel.Visible = True 
    Me.chooseWelderNameComboBox.Visible = True 
    Me.chooseWelderNameComboBox.Enabled = True 
End Sub 

Private Sub AddNewWelderOptionButton_Click() 
    'When this radio button is selected set 
    'the switches(bools) for the Submit button. 
    wqtr = False 
    newWelder = True 
End Sub 

Private Sub chooseWelderNameComboBox_Change() 
    welderIDSelected = "Foo" 
End Sub 
Private Sub submitButton_Click() 
    'Based on the radio button selected, set 
    'the Public newWelderBoolValue to either true or false 
    'this is used by InitialInfo_Form.UserForm_Initialize 
    If wqtr = True Then 
     newWelderBoolValue = True 
     InitialInfo_Form.Show 
    Else 
     newWelderBoolValue = newWelder 
     InitialInfo_Form.Show 
    End If 
    Me.Hide 
End Sub 

され、その後、この次の部分は、この問題に関連するフォームBのコードの部分のみです。

Private Sub UserForm_Initialize() 
    Dim welderSelected As Boolean 
    Dim idSelected As String 
    welderSelected = ExistingOrNewWelder.newWelderBoolValue 
    idSelected = ExistingOrNewWelder.welderIDSelected 

    'Set Window size and position 
    With Application 
     .WindowState = xlMaximized 
     Me.Top = .Top * 0.5 
     Me.Left = .Left * 1.0015 
     Zoom = Int((.Width * 0.85)/(Width * 0.85) * 40) 
     Width = .Width * 0.995 
     Height = .Height * 0.992 
    End With 

    If welderSelected = True Then 
     Me.welderNameText.Text = ExistingOrNewWelder.chooseWelderNameComboBox.Text 
     Me.welderNameText.Enabled = False 
     Me.welderIDComboBox.Value = idSelected 
     Me.welderIDComboBox.Enabled = False 
    End If 

    welderIDComboBox.list = UserFormDropDownDataSheet.range("J2:J9000").Value 

    weldingProcessComboBox.list = UserFormDropDownDataSheet.range("M2:M13").Value 
    positionWeldedComboBox.list = UserFormDropDownDataSheet.range("O2:O14").Value 
    testNumberComboBox.list = UserFormDropDownDataSheet.range("Q2:Q100").Value 


End Sub 
+0

welderIdselectedをグローバル変数に設定する方法は、同じワークブックの別のサブ内から呼び出すことができます。または、サブをプライベートに設定せず、パブリックに設定します。 – Luuklag

+0

welderIDSelectedはすでに2番目のスクリプトでIDSelectedによって参照されるパブリック変数です。私が調べることに問題があるのは、welderIDSelected = "ComboBoxリストの溶接機ID番号 - ComboBoxのデータの2番目の列です。"ということです。 @Luuklag - すべてのWelderには、彼の名前と一意の一致するID番号が付いています。私はワークシートの列と列の比較を行っていますが、コンボボックスの2番目の列にアクセスする方法があるはずです。ジョー・ボブが選択されている場合は、彼のID番号がリストに表示されます。 – FatMunkey

答えて

1

これで、私の答えが見つかりました。ここで私は複数列コンボボックスのバインドされていない列のデータにアクセスするために何をしたかです。私は質問の一部として提出フォームAのための私のコードで

は、このサブです:どんなコードで「foo」を置き換えを中心に展開し

Private Sub chooseWelderNameComboBox_Change() 
    welderIDSelected = "Foo" 
End Sub 

私の質問は、私にバインドされていない列のデータを得るでしょう。私は「アラン・ベイリー」を選択した場合たとえば、彼の名前は、コンボボックスフィールドに表示されますが、そのID番号が別の列と名前だけの列であるので、彼の名前に関連付けられたID番号がバインドされていません。ここでは、これを解決するコードは次のとおりです。

Private Sub chooseWelderNameComboBox_Change() 
    welderNameSelected = Me.chooseWelderNameComboBox.column(0) 
    welderIDSelected = Me.chooseWelderNameComboBox.column(1) 
End Sub 

だから私はwelderNameSelected変数を追加したことを見ることができますが、トリックは、列がインデックス化されていることです。バインドされた列はインデックス(0)で、第2列はインデックス(1)です。これほど簡単です!両方の変数はPublicで、ユーザーが選択すると両方の変数に値が割り当てられます。両方ともForm Bの後続スクリプトでアクセスしました。

メモ:私はMeを使用しています。フォームAをアンロードする代わりに非表示にします。この方法では、それはアンロードされたままで、私はコンボボックスでユーザーが選択した値を失うことはありません。

関連する問題