VBA表单 - Vlookup单元格并为该单元格指定值

时间:2017-03-23 22:55:51

标签: excel vba excel-vba

在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

我不知道该怎么做,因为我觉得应该这么简单!

提前致谢。

编辑。进一步挖掘表明你不能选择你正在查看的单元格,因为这个命令只返回一个值,它实际上没有为我的意图和目的选择单元格。

2 个答案:

答案 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列。