Excel 使用VBA在Userform上生成下拉组合框和文本框
基本上,我有一个对话框,我想做 如果你能看到上面,我想让组合框应用于BDI工业集团和CIF的搜索 然后,每当我单击“按行业组搜索”组合框并选择一个时,CIF字段将提供另一个下拉列表供您选择,然后,其他字段将根据下面的数据自动填充 上面的截图只是我数据库的一小部分。总共有7504行,标题从A2开始 假设我选择交通工具 然后我希望CIF字段显示我的下拉列表,选择CIF 13039099和12901262 接下来,例如,当我选择CIF 13039099时,其他字段将根据数据库直接自动显示信息,即:Excel 使用VBA在Userform上生成下拉组合框和文本框,excel,vba,textbox,dropdown,userform,Excel,Vba,Textbox,Dropdown,Userform,基本上,我有一个对话框,我想做 如果你能看到上面,我想让组合框应用于BDI工业集团和CIF的搜索 然后,每当我单击“按行业组搜索”组合框并选择一个时,CIF字段将提供另一个下拉列表供您选择,然后,其他字段将根据下面的数据自动填充 上面的截图只是我数据库的一小部分。总共有7504行,标题从A2开始 假设我选择交通工具 然后我希望CIF字段显示我的下拉列表,选择CIF 13039099和12901262 接下来,例如,当我选择CIF 13039099时,其他字段将根据数据库直接自动显示信息,即:
- 客户名称:Adit Jaya Mandiri'CV
- RM名称:Irawan Noor
- 分部:商业
'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”错误,必须转义这些行:
在ComboBox1Change
事件中,我建议您使用:
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
评论不适用于扩展讨论或调试会话;这段对话已经结束。请确保答案包含所有相关信息。