2017-03-23 70 views
0

在VBA中遇到有关vlookup函数的问题。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

你错过了'Set'关键字:'设置MonthlyTable = ...' – tigeravatar

+0

即使已返回完全相同的错误命令集。 – Realitybites

+0

你最近的挖掘是正确的。您无法将范围分配给VLookUp的结果。你可能想要使用'Range.Find()'方法。 – PatricK

回答

2

真不明白你对我的实际目标,但只是跟随你的欲望通过规定的的ListIndex转换成MonthlyTable的列:

我想使用VLOOKUP(或指标,匹配(),匹配())来查找细胞 在数据表中并分配从文本框的值,以这些 细胞

你可能想采用followi NG技术:

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 
+0

我确信你可以做到这一行;) –

+0

@ShaiRado,虽然还有待验证,但我确实做到了,它花了我三条线...... – user3598756

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。如果在下拉列表中列出工作表列的标题(当您初始化表单时可能会自动执行此操作),则用户选择的标题(如“Joiners”)和ListIndex之间将存在直接关系。 MonthlyTable的第一列将具有的ListIndex 0,所以您可以通过添加1