在VBA中遇到有关vlookup功能的问题。
我有2个组合框和6个文本框供用户输入。
我想使用vlookup(或索引,Match(),Match())来查找数据表中的单元格,并将文本框中的值分配给这些单元格。
当我运行我认为应该工作的代码时,它会返回对象错误。
Private Sub CommandButton2_Click()
Dim MonthlyTable As Range
Set MonthlyTable = Sheets("DATA Monthly").Range("A6:AE400")
Dim ColumnRef As Range
Set ColumnRef = Sheets("Drivers").Range("N11")
' Assign CB2 value to M11 cell reference so it can be converted to a column ref in N11.
Sheets("Drivers").Range("M11").Value = ComboBox2.Value
Dim CB1Value As String
CB1Value = "Joiners" & ComboBox1.Value
Dim CB2Value As String
CB2Value = ComboBox2.Value
MsgBox CB1Value & " " & CB2Value
Dim tb1value As Range
tb1value = Application.WorksheetFunction.VLookup(CB1Value, MonthlyTable, ColumnRef, False)
tb1value.Value = TextBox1.Value
Unload Me
End Sub
我不知道该怎么做,因为我觉得应该这么简单!
提前致谢。
编辑。进一步挖掘表明你不能选择你正在查看的单元格,因为这个命令只返回一个值,它实际上没有为我的意图和目的选择单元格。
答案 0 :(得分:2)
对我来说并不是很清楚你的实际目标,而是按照以下说明跟进你的欲望:
我想使用vlookup(或索引,Match(),Match())来查找单元格 在数据表中,并将文本框中的值分配给这些值 细胞
您可能希望采用以下技术:
Dim tb1value As Variant '<--| a variant can be assigned the result of Application.Match method and store an error to be properly cheeked for
tb1value = Application.Match(CB1Value, MonthlyTable.Column(1), 0) '<--| try finding an exact match for 'CB1Value' in the first column of your data range
If Not IsError(tblvalue) Then MonthlyTable(tb1value, columnRef.Value).Value = TextBox1.Value '<--| if successful then write 'TextBox1' value in data range cell in the same row of the found match and with `columnRef` range value as its column index
答案 1 :(得分:0)
Excel使用工作表函数来处理数据,VBA使用不同的工具,当您发现自己通过VBA在工作表上设置单元格值,以便某些工作表函数可以引用它们时,是时候寻找真正的VBA解决方案了。顺便提一下,我建议您继续使用Cbx2的Change事件而不是命令按钮。
Private Sub Solution_Click()
' 24 Mar 2017
Dim MonthlyTable As Range
Dim Rng As Range
Dim Lookup As String
Dim Done As Boolean
Set MonthlyTable = Sheets("DATA Monthly").Range("A2:AE400")
' take the lookup value from Cbx1
Lookup = ComboBox1.Value
Set Rng = MonthlyTable.Find(Lookup)
If Rng Is Nothing Then
MsgBox Chr(34) & Lookup & """ wasn't found.", vbInformation, "Invalid search"
Else
With ComboBox2
If .ListIndex < 0 Then
MsgBox "Please select a data type.", vbExclamation, "Missing specification"
Else
TextBox1.Value = MonthlyTable.Cells(Rng.Row, .ListIndex + 1)
Done = True
End If
End With
End If
If Done Then Unload Me
End Sub
有两点需要解释。首先,表格在被拒绝的条目之后不会关闭。你必须添加一个取消按钮,以避免不必要的循环,用户不能离开表单,直到他输入正确的内容。请注意,Done
仅在找到搜索条件时设置为True并且返回了一个值,并且表单在Done = True
之前不会关闭。
其次,观察Cbx2的ListIndex属性的使用。 Cbx下拉列表中的所有项目都从0开始编号。 ListIndex属性指示选择了哪个项目。没有选择时为-1。如果您在下拉列表中列出工作表列的标题(您可能在初始化表单时自动执行此操作),则用户选择的标题(例如&#34; Joiners&#34;)和ListIndex。 MonthlyTable的第一列将具有ListIndex 0.因此,您可以通过添加1将ListIndex转换为MonthlyTable列。