Excel 使用VBA在Userform上生成下拉组合框和文本框

Excel 使用VBA在Userform上生成下拉组合框和文本框,excel,vba,textbox,dropdown,userform,Excel,Vba,Textbox,Dropdown,Userform,基本上,我有一个对话框,我想做 如果你能看到上面,我想让组合框应用于BDI工业集团和CIF的搜索 然后,每当我单击“按行业组搜索”组合框并选择一个时,CIF字段将提供另一个下拉列表供您选择,然后,其他字段将根据下面的数据自动填充 上面的截图只是我数据库的一小部分。总共有7504行,标题从A2开始 假设我选择交通工具 然后我希望CIF字段显示我的下拉列表,选择CIF 13039099和12901262 接下来,例如,当我选择CIF 13039099时,其他字段将根据数据库直接自动显示信息,即:

基本上,我有一个对话框,我想做

如果你能看到上面,我想让组合框应用于BDI工业集团和CIF的搜索

然后,每当我单击“按行业组搜索”组合框并选择一个时,CIF字段将提供另一个下拉列表供您选择,然后,其他字段将根据下面的数据自动填充

上面的截图只是我数据库的一小部分。总共有7504行,标题从A2开始

假设我选择交通工具

然后我希望CIF字段显示我的下拉列表,选择CIF 13039099和12901262

接下来,例如,当我选择CIF 13039099时,其他字段将根据数据库直接自动显示信息,即:

  • 客户名称:Adit Jaya Mandiri'CV
  • RM名称:Irawan Noor
  • 分部:商业
我希望客户名称RM名称都是可编辑的

之后,当我单击“保存”时,它将根据最新的更改自动更新。这是否可以执行?下面是VBA代码,我根据别人在另一篇文章中的评论修改了它

'Codes to form
Option Explicit
Private matchRow As Long

Private Sub Combobox1_Change()
Dim rng As Range, cel As Range
Dim lstrow As Long
Dim strBDI As String

    strBDI = Me.ComboBox1

    lstrow = Cells(ActiveSheet.Rows.Count, "N").End(xlUp).Row 'Change column N with BDI column in case of you.
    Set rng = ActiveSheet.Range("N3:N" & lstrow)


    Me.ComboBox2.Clear
    For Each cel In rng
        If cel = strBDI Then
            Me.ComboBox2.AddItem cel.Offset(0, -13) '-13 need to adjust with CIF column left from BDI column
        End If
    Next

End Sub

Private Sub Combobox2_Change()
Dim rng As Range, cel As Range
Dim lstrow As Long
Dim strBDI As String
Dim strCIF As String

    strBDI = Me.ComboBox1
    strCIF = Me.ComboBox2

    lstrow = Cells(ActiveSheet.Rows.Count, "N").End(xlUp).Row 'Change column N with BDI column in case of you.
    Set rng = ActiveSheet.Range("N3:N" & lstrow)

    For Each cel In rng
        If cel = strBDI And cel.Offset(0, -13) = strCIF Then
            matchRow = cel.Row
            Exit For
        End If
    Next

    Me.TextBox1 = ActiveSheet.Cells(matchRow, 2)
    Me.TextBox2 = ActiveSheet.Cells(matchRow, 6)
    Me.TextBox3 = ActiveSheet.Cells(matchRow, 13)


End Sub

Private Sub cmdSave_Click()

    ActiveSheet.Cells(matchRow, 2) = Me.TextBox1
    ActiveSheet.Cells(matchRow, 6) = Me.TextBox2
    ActiveSheet.Cells(matchRow, 13) = Me.TextBox3

    MsgBox "Data Saved Successfully!", vbInformation, "Save"

End Sub

    
Private Sub UserForm_Initialize()

'Add items manually or use sub to add unique items from BDI Column

    Me.ComboBox1.AddItem "AUTOMOTIVE ATPM & DEALER"

    Me.ComboBox1.AddItem "AUTOMOTIVE COMPONENT"

    Me.ComboBox1.AddItem "CABLE"

    Me.ComboBox1.AddItem "CEMENT"

    Me.ComboBox1.AddItem "CHEMICAL"

    Me.ComboBox1.AddItem "chemical & PLASTICS"

    Me.ComboBox1.AddItem "COAL INDUSTRY"

    Me.ComboBox1.AddItem "COMPUTER & RELATED"

    Me.ComboBox1.AddItem "CONSTRUCTION"

    Me.ComboBox1.AddItem "COSMETICS & TOILETRIES"

    Me.ComboBox1.AddItem "CPO INDUSTRY"

    Me.ComboBox1.AddItem "ELECTRICITY & POWER PLANT"

    Me.ComboBox1.AddItem "ENGINE MACHINERIES & TOOLS"

    Me.ComboBox1.AddItem "FARMING & ANIMAL FEED"

    Me.ComboBox1.AddItem "FINANCIAL SERVICES"

    Me.ComboBox1.AddItem "FISHERIES"

    Me.ComboBox1.AddItem "FOOD & BEVERAGE"

    Me.ComboBox1.AddItem "FORESTRY & WOOD PRODUCT"

    Me.ComboBox1.AddItem "FURNITURE"

    Me.ComboBox1.AddItem "GARMENT"

    Me.ComboBox1.AddItem "HOME APPLIANCES"

    Me.ComboBox1.AddItem "HOSPITAL & HEALTHCARE"

    Me.ComboBox1.AddItem "HOTEL & ACCOMMODATION SERVICE"

    Me.ComboBox1.AddItem "INFRASTRUCTURE"

    Me.ComboBox1.AddItem "MEDICAL EQUIPMENT"

    Me.ComboBox1.AddItem "METAL NON STEEL"

    Me.ComboBox1.AddItem "MINING & QUARRING"

    Me.ComboBox1.AddItem "OIL & GAS - DOWNSTREAM"

    Me.ComboBox1.AddItem "OIL & GAS - UPSTREAM"

    Me.ComboBox1.AddItem "OTHERS"

    Me.ComboBox1.AddItem "PACKAGING & CORRUGATED"

    Me.ComboBox1.AddItem "PETROCHEMICAL & PLASTICS"

    Me.ComboBox1.AddItem "PHARMACEUTICAL"

    Me.ComboBox1.AddItem "PRINTING"

    Me.ComboBox1.AddItem "PROPERTIES & REAL ESTATE"

    Me.ComboBox1.AddItem "PULP & PAPER"

    Me.ComboBox1.AddItem "RENTAL SERVICES"

    Me.ComboBox1.AddItem "RETAILER"

    Me.ComboBox1.AddItem "RUBBER INDUSTRY"

    Me.ComboBox1.AddItem "SERVICE INDUSTRY"

    Me.ComboBox1.AddItem "SHIPPING"

    Me.ComboBox1.AddItem "STEEL"

    Me.ComboBox1.AddItem "SUGAR INDUSTRY"

    Me.ComboBox1.AddItem "TELECOMMUNICATION"

    Me.ComboBox1.AddItem "TEXTILE"

    Me.ComboBox1.AddItem "TOBACCO & CIGARETTE"

    Me.ComboBox1.AddItem "TRANSPORTATION"

    Me.ComboBox1.AddItem "WHOLESALES TRADING"
    
End Sub
但它仍然不能像我想要的那样工作。每当我选择BDI产业集团中的一个,到岸价都不会出来

任何帮助都将不胜感激

谢谢。

看来您的(主要)问题是,分析列中存在“#NA”错误,必须转义这些行:

在ComboBox1
Change
事件中,我建议您使用:

Private Sub Combobox1_Change()
 Dim rng As Range, cel As Range, lstrow As Long, strBDI As String

    strBDI = Me.ComboBox1.Value

    lstrow = Worksheets("Lending & Funding").Cells(Worksheets("Lending & Funding") _
                 .Rows.Count, "N").End(xlUp).Row
    Set rng = Worksheets("Lending & Funding").Range("N3:N" & lstrow)
    Me.ComboBox2.Clear
    
    For Each cel In rng.Cells
        If Not IsError(cel.Value) Then
            If cel.Value = strBDI Then
                Me.ComboBox2.AddItem cel.Offset(0, -13) '-13 need to adjust with CIF column left from BDI column
            End If
        End If
    Next
End Sub
对ComboBox2
事件使用相同的方法:

Private Sub Combobox2_Change()
 Dim rng As Range, cel As Range, lstrow As Long
 Dim strBDI As String, strCIF As String

    strBDI = Me.ComboBox1.Value: strCIF = Me.ComboBox2.Value
    
    lstrow = Worksheets("Lending & Funding").Cells(Worksheets("Lending & Funding") _
       .Rows.Count, "N").End(xlUp).Row 'Change column N with BDI column in case of you.
    Set rng = Worksheets("Lending & Funding").Range("N3:N" & lstrow)

    For Each cel In rng
        If Not IsError(cel.Value) Then
            If cel = strBDI And cel.Offset(0, -13) = strCIF Then
                matchRow = cel.Row
                Exit For
            End If
        End If
    Next

    If matchRow > 0 Then 'sometimes, the above conditions may not return any match...
        Me.TextBox1 = Worksheets("Lending & Funding").Cells(matchRow, 2)
        Me.TextBox2 = Worksheets("Lending & Funding").Cells(matchRow, 6)
        Me.TextBox3 = Worksheets("Lending & Funding").Cells(matchRow, 13)
    Else
        MsgBox "There is no mathch for the chosen criteria..."
    End If
End Sub
然后,加载ComboBox1(手动设置唯一值)的方式不是最有效/最合适的

请尝试这种方法:

Private Sub UserForm_Initialize()
 Dim shLF As Worksheet, dict As New Scripting.Dictionary, lastRow As Long
 Dim I As Long, lastCol As Long, arr As Variant
 
 Set shLF = Worksheets("Lending & Funding")
 lastRow = shLF.Range("N" & Rows.Count).End(xlUp).Row
 lastCol = shLF.Cells(2, Columns.Count).End(xlToLeft).Column + 2
 
 For I = 3 To lastRow
    If Not dict.Exists(shLF.Range("N" & I).Value) Then
        dict.Add shLF.Range("N" & I).Value, 1
    End If
 Next I
 'sort the dictionary, load the sorted column in an array, clear the temporary range and load combo:
 shLF.Cells(1, lastCol).Resize(dict.Count, 1).Value = WorksheetFunction.Transpose(dict.Keys)
 With shLF.Range(shLF.Cells(1, lastCol), shLF.Cells(1, lastCol).Resize(dict.Count, lastCol))
    .Sort shLF.Cells(1, lastCol), xlAscending
    arr = .Value
    .Clear
 End With
 Me.ComboBox1.List = arr
 'clear zero BDI (if necessary):
 For I = 0 To Me.ComboBox1.ListCount - 1
    If Me.ComboBox1.List(I) = "0" Then Me.ComboBox1.RemoveItem (I): Exit For
 Next I
End Sub
最好(我认为)以能够单击、滚动、编辑页面单元格的方式显示表单:

Private Sub CommandButton2_Click()
    BDIIndustryGroup.Show vbModeless
End Sub
编辑:

“保存”按钮的代码,可以填充您在文本框中更改的值。它现在选择保存的行,以便允许您检查结果

Private Sub CommandButton1_Click()
  Dim sh As Worksheet
  
  Set sh = Worksheets("Lending & Funding")

  sh.Cells(matchRow, 2) = Me.TextBox1
  sh.Cells(matchRow, 6) = Me.TextBox2
  sh.Cells(matchRow, 13) = Me.TextBox3

  sh.Cells(matchRow, 2).EntireRow.Select
  
  MsgBox "Data Saved Successfully!", vbInformation, "Save"
End Sub

评论不适用于扩展讨论或调试会话;这段对话已经结束。请确保答案包含所有相关信息。