【问题标题】:Vlookup type mismatchVlookup 类型不匹配
【发布时间】:2021-07-26 04:30:39
【问题描述】:

我正在尝试在 VBA 中执行 vlookup,但代码似乎没有正确获取单元格值。变量 rowrng 和 colrng 被返回为 #N/A

  Sub DosiDo()

'Declare Variables
Dim colnum As Long
Dim rownum As Long
Dim i As Integer
Dim rowrng As Variant
Dim colrng As Variant

'Set worksheets
Dim wb As Workbook
Dim ws As Worksheet
Dim newWs As Worksheet
Dim table1 As Range
Dim ws1 As String

Set wb = ActiveWorkbook
Set newWs = wb.Worksheets.Add
newWs.Name = "DosiDo"

    
    With Workbooks("210721-LeaveRecords.xlsm").Sheets("Sheet1")
            Set table1 = .Range(.Cells(2, 2), .Cells(7, 9))
    End With

    wsl = "AS Darwin"

    rowrng = Application.VLookup(ws1, table1, 7, False)
    colrng = Application.VLookup(ws1, table1, 8, False)
    
    newWs.Cells(i + 1, 4).Value = rowrng
    newWs.Cells(i + 1, 5).Value = colrng

End Sub

【问题讨论】:

    标签: vba vlookup variant mismatch


    【解决方案1】:

    你把ws1弄错了。

    ws1 更改为wsl

      Sub DosiDo()
    
    'Declare Variables
    Dim colnum As Long
    Dim rownum As Long
    Dim i As Integer
    Dim rowrng As Variant
    Dim colrng As Variant
    
    'Set worksheets
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim newWs As Worksheet
    Dim table1 As Range
    Dim wsl As String
    
    Set wb = ActiveWorkbook
    Set newWs = wb.Worksheets.Add
    newWs.Name = "DosiDo"
    
        
        With Workbooks("210721-LeaveRecords.xlsm").Sheets("Sheet1")
                Set table1 = .Range(.Cells(2, 2), .Cells(7, 9))
        End With
    
        wsl = "AS Darwin"
    
        rowrng = Application.VLookup(ws1, table1, 7, False)
        colrng = Application.VLookup(ws1, table1, 8, False)
        
        newWs.Cells(i + 1, 4).Value = rowrng
        newWs.Cells(i + 1, 5).Value = colrng
    
    End Sub
    

    【讨论】:

    • Option Explicit 将使您免于此类错误。
    • @TimWilliams:怎么样?
    • @Capt.Krusty 只需在顶部输入Option Explicit
    • @TimWilliams:好的,那么Option Explicit 是自动更改变量中“拼写错误”的函数?
    • @Capt.Krusty - 不,它不会“解决”此类问题:它只会阻止您在与声明的名称不匹配的变量中出现拼写错误(如果他们最终匹配了一些 other 声明的名称...)
    【解决方案2】:

    当 VLOOKUP 在最后一个参数为“FALSE”时提供的范围的第一列中找不到键值时,结果为 N/A。也许这就是问题所在??

    Table1 地址是 $B$2:$I$7。您的 VLOOKUP 函数分别从 $H$2:$H$7 和 $I$2:$I$7 中查找 $B$2:$B$7 中具有“AS Darwin”的行的值。这就是你所追求的吗?

    如果是这样,也许您可​​以尝试使用自动过滤器?

    With table1
        .AutoFilter Field:=1, Criteria1:=ws1, Operator:=xlAnd
        .SpecialCells(xlCellTypeVisible).Areas(2).Resize(1, 2).Offset(, 5).Copy NewWS.Cells(i + 1, 4)
        .AutoFilter 'turns autofilter off
    End With
    

    如果 table1 未格式化为 Excel 表格(VBA“ListObject”),并且匹配行不是标题之后的第一行(第 3 行),则需要 .Areas(2)。此外,.Resize(1, 2) 仅返回第一行匹配项的两列,并从表左侧的第 6 列开始(在本例中,.Offset(, 0) = 列 B)。

    您需要捕获过滤器后没有可见行的情况(例如,If .SpecialCells(xlCellTypeVisible).Rows.Count > 1 or .SpecialCells(xlCellTypeVisible).Areas.Count > 1 Then ...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多