【问题标题】:Writing a VLOOKUP function in vba在 vba 中编写 VLOOKUP 函数
【发布时间】:2011-07-30 20:45:24
【问题描述】:

我正在尝试使用我的 vba 代码中的 VLOOKUP 函数在表格数组中的电子表格上查找一个值。我不知道怎么写正确。

这是包含所有引用的普通 VLOOKUP 公式:

=VLOOKUP(DATA!AN2,DATA!AA9:AF20,5,FALSE)

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    作为Tim Williams suggested,如果找不到查找值,使用Application.VLookup 不会引发错误(与Application.WorksheetFunction.VLookup 不同)。

    如果您希望查找在无法找到匹配项时返回默认值,并避免对列号进行硬编码——相当于公式中的IFERROR(VLOOKUP(what, where, COLUMNS(where), FALSE), default),您可以使用以下函数:

    Private Function VLookupVBA(what As Variant, lookupRng As Range, defaultValue As Variant) As Variant
        Dim rv As Variant: rv = Application.VLookup(what, lookupRng, lookupRng.Columns.Count, False)
        If IsError(rv) Then
            VLookupVBA = defaultValue
        Else
            VLookupVBA = rv
        End If
    End Function
    
    Public Sub UsageExample()
        MsgBox VLookupVBA("ValueToFind", ThisWorkbook.Sheets("ReferenceSheet").Range("A:D"), "Not found!")
    End Sub
    

    【讨论】:

      【解决方案2】:
      Dim found As Integer
          found = 0
      
          Dim vTest As Variant
      
          vTest = Application.VLookup(TextBox1.Value, _
          Worksheets("Sheet3").Range("A2:A55"), 1, False)
      
      If IsError(vTest) Then
          found = 0
          MsgBox ("Type Mismatch")
          TextBox1.SetFocus
          Cancel = True
          Exit Sub
      Else
      
          TextBox2.Value = Application.VLookup(TextBox1.Value, _
          Worksheets("Sheet3").Range("A2:B55"), 2, False)
          found = 1
          End If
      

      【讨论】:

        【解决方案3】:
                Public Function VLOOKUP1(ByVal lookup_value As String, ByVal table_array As Range, ByVal col_index_num As Integer) As String
                Dim i As Long
        
                For i = 1 To table_array.Rows.Count
                    If lookup_value = table_array.Cells(table_array.Row + i - 1, 1) Then
                        VLOOKUP1 = table_array.Cells(table_array.Row + i - 1, col_index_num)
                        Exit For
                    End If
                Next i
        
                End Function
        

        【讨论】:

          【解决方案4】:

          请在下面找到Vlookup的代码:

          Function vlookupVBA(lookupValue, rangeString, colOffset)
          vlookupVBA = "#N/A"
          On Error Resume Next
          Dim table_lookup As range
          Set table_lookup = range(rangeString)
          vlookupVBA = Application.WorksheetFunction.vlookup(lookupValue, table_lookup, colOffset, False)
          End Function
          

          【讨论】:

          • 这对我来说非常有效,因为 VLOOKUP 问题困扰了我几个小时。这也适用于在其他工作表上查找,感谢分享!
          【解决方案5】:

          如何使用:

          result = [VLOOKUP(DATA!AN2, DATA!AA9:AF20, 5, FALSE)]
          

          注意 []

          【讨论】:

          • 以上信息基于这个答案-> Hidden features of vba
          • 如果你需要这个语句的一部分是动态的怎么办?例如,AF20 可以是 AF99 或 AF10。通常使用字符串,您可以使用类似:“VLOOKUP(DATA!AN2, DATA!AA9:AF" & lastrow & ", 5, FALSE)"。使用方括号时这似乎不起作用。
          • @Noah 我认为如果你有一些动态的想法,那么接受的答案就是你所需要的。
          【解决方案6】:

          你试过了吗:

          Dim result As String 
          Dim sheet As Worksheet 
          Set sheet = ActiveWorkbook.Sheets("Data") 
          result = Application.WorksheetFunction.VLookup(sheet.Range("AN2"), sheet.Range("AA9:AF20"), 5, False)
          

          【讨论】:

          • 如果查找失败,它会抛出一个错误:但是如果你删除“WorksheetFunction”它不会,但是你可以使用 IsError(result) 来测试结果。不过,您需要将结果声明为变体。
          猜你喜欢
          • 2013-06-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多