如何在VBA评估中的VLOOKUP中使用变量作为范围?

时间:2017-11-11 01:55:38

标签: excel vba excel-vba

我不知道我是否解释得太清楚了。我是初学者,我试图在VBA中使用VLOOKUP从文件中获取值。但是,即使我显然可以使用字符串本身,我也不能将它用作变量。

因此,当我在下拉列表中选择某些内容时,我们的想法是自动填充两个文本框。 dropwdown本身确定具有数据的Worksheet。

Private Sub cbProductList1_Change()
    vCode1 = Application.WorksheetFunction.VLookup(cbProductList1.Value, 
    [Products!A:B], 2, False)
     Me.tbProdCode1 = vCode1
    vPrice1 = Evaluate("VLOOKUP(" & vCode1 & ", " & Me.labelCFValue & ", 2, False)")
     Me.tbPrice1 = vPrice1
End Sub

如果我在vCode1上运行MsgBox - 它给了我需要作为VLOOKUP的第一个参数的字符串。 如果我在Me.labelCFValue上运行一个MsgBox,它会给我CF_1!A25:B33(没有引号),就像我需要它一样。但是当我在vPrice1上运行MsgBox时,我收到错误。

稍后编辑:或者,如果您可以帮助我在Me.labelCFValue内使用Application.WorksheetFunction.VLookup(),那也可以。

请帮帮忙?

1 个答案:

答案 0 :(得分:2)

我无法测试代码,但相信这应该有效或帮助您找到自己的方式。

Option Explicit

Private Sub cbProductList1_Change()

    Dim Rl As Long                              ' last row
    Dim LookupRange As Range
    Dim Sp() As String                          ' splitting labelCFValue
    Dim vCode1 As String
    Dim vPrice1 As Double

    ' ActiveSheet is the default, but better to declare
    With ActiveSheet
        Rl = .Cells(.Rows.Count, "A").End(xlUp).Row
        Set LookupRange = .Range(.Cells(1, 1), Cells(Rl, 2))
    End With
    vCode1 = Application.VLookup(cbProductList1.Value, LookupRange, 2, False)
    Me.tbProdCode1 = vCode1

    ' If Me.labelCFValue is a Label, the string should be its Caption property.
    ' If it is a Textbox the string should be its Value or Text property.
    ' Either way, it is better to specify what you are addressing:-
    Sp = Split(Me.labelCFValue, "!")
    Set LookupRange = Worksheets(Sp(0)).Range(Sp(1))
    vPrice1 = Evaluate(Application.VLookup(vCode1, LookupRange, 2, False))
    Me.tbPrice1 = vPrice1
End Sub

考虑添加一些预防性代码来处理任何一个Vlookup返回错误的可能性。