【问题标题】:Excel VBA "Method 'VLookup' of object 'WorksheetFunction' failed"Excel VBA“对象'WorksheetFunction'的方法'VLookup'失败”
【发布时间】:2016-01-10 22:37:43
【问题描述】:

这是an earlier post 的后续帖子。由于提供了一些很好的建议,这个问题得到了解决。

我正在帮助当地的动物收容所开发一个脚本,将四个工作表中的数据组合成一份整体报告。所有四张表都包含一个公共变量,我将其命名为 AnimalID。 AnimalID 位于 Rabies Renewal 和 Rabies Jurisdiction 表的 A 列中,从 min 到 max 排序。我之前的问题需要在狂犬病更新表上找到 AnimalID,并使用 VLookup 在报告表上复制到期日期。作为参考,日期填充在报告开头的单元格 Q8 到底部。我正在尝试使用(或者我认为)相同的方法通过在狂犬病管辖区表上查找 AnimalID 来填充报告表上的所有者信息。所有者信息应该从单元格 A140 开始填充(之前的单元格已经填充),因此我包含两个变量来标记位置。当我尝试运行脚本时,当它到达任何带注释的 VLookup 行时,我会收到以下错误。

错误:“对象'WorksheetFunction'的方法'VLookup'失败”

我不确定 A## 值是否会正确填充,但我认为其他值应该可以正常工作。想法和建议将不胜感激。谢谢!

Dim Ct As Long, lMaxRows As Long
Dim AnimalID As Range, Jurisdiction As Range, Renewal As Range

Worksheets("Rabies Renewal").Activate
Range("A:A").NumberFormat = "@"
Set Renewal = Sheets("Rabies Renewal").Range("A:K")

Worksheets("Rabies Jurisdiction").Activate
Range("A:AI").NumberFormat = "@"
Set Jurisdiction = Sheets("Rabies Jurisdiction").Range("A:AI")

Worksheets("Report").Activate
    Range("Q:Q").NumberFormat = "@"

    'Backfill owner information based on animal ID
        lMaxRows = Cells(Rows.Count, "I").End(xlUp).Row
        Range("L" & lMaxRows + 1).Select
        Range(ActiveCell, ActiveCell.End(xlDown)).Select
        Ct = Selection.Count

        For Ct = 1 To Ct
            Set AnimalID = Range("Q" & Ct + lMaxRows)

            'Range("A" & Ct + lMaxRows).Select
            'ActiveCell.Value = WorksheetFunction.VLookup(AnimalID, Jurisdiction, 19 & ", " & 18, False)
            'Range("C" & Ct + lMaxRows).Select
            'ActiveCell.Value = WorksheetFunction.VLookup(AnimalID, Jurisdiction, 27, False)
            'Range("E" & Ct + lMaxRows).Select
            'ActiveCell.Value = WorksheetFunction.VLookup(AnimalID, Jurisdiction, 32, False)
            'Range("F" & Ct + lMaxRows).Select
            'ActiveCell.Value = WorksheetFunction.VLookup(AnimalID, Jurisdiction, 33, False)
            'Range("G" & Ct + lMaxRows).Select
            'ActiveCell.Value = WorksheetFunction.VLookup(AnimalID, Jurisdiction, 34, False)
            'Range("I" & Ct + lMaxRows).Select
            'ActiveCell.Value = WorksheetFunction.VLookup(AnimalID, Jurisdiction, 16, False)
            'Range("J" & Ct + lMaxRows).Select
            'ActiveCell.Value = WorksheetFunction.VLookup(AnimalID, Jurisdiction, 8, False)
            'Range("K" & Ct + lMaxRows).Select
            'ActiveCell.Value = WorksheetFunction.VLookup(AnimalID, Jurisdiction, 11, False)

            On Error Resume Next
        Next Ct

    'Backfill rabies due dates based on animal ID
        Range("Q8").Select
        Range(ActiveCell, ActiveCell.End(xlDown)).Select
        Ct = Selection.Count

        For Ct = 1 To Ct
            Set AnimalID = Range("Q" & Ct + 7)

            Range("P" & Ct + 7).Select
            ActiveCell.Value = WorksheetFunction.VLookup(AnimalID, Renewal, 11, False)

            On Error Resume Next
        Next Ct

    MsgBox "Completed"

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    如果没有样本数据(可以理解,很难包含 140 多行),我不得不做出一些假设,但我相信我已经正确涵盖了报告范围。通过重复点击 F8 键逐步完成此操作。您可以暂停点击并查看工作表,以查看公式是否正确传递 a) 和 b) 到正确的范围。

        Dim AnimalID As Range, Jurisdiction As Range, Renewal As Range
    
        With Worksheets("Rabies Renewal")
            .Range("A:A").NumberFormat = "@"
            Set Renewal = .Range("A:K")
        End With
    
        With Worksheets("Rabies Jurisdiction")
            .Range("A:AI").NumberFormat = "@"
            Set Jurisdiction = .Range("A:AI")
        End With
    
        With Worksheets("Report")
            .Range("Q:Q").NumberFormat = "@"
    
            'Backfill owner information based on animal ID
            With .Range(.Cells(.Cells(Rows.Count, "I").End(xlUp).Row + 1, "L"), _
                        .Cells(.Cells(Rows.Count, "I").End(xlUp).Row + 1, "L").End(xlDown)).Offset(0, -11)
                'should be at A:A parallel to the desired L:L range here
                'A:A - column 19
                .Offset(0, 0).Formula = _
                  "=IFERROR(VLOOKUP($Q" & .Rows(1).Row & ", " & Jurisdiction.Address(0, 0, external:=True) & ", 19, FALSE), """")"
                .Cells = .Value
                'C:C - column 27
                .Offset(0, 2).Formula = _
                  "=IFERROR(VLOOKUP($Q" & .Rows(1).Row & ", " & Jurisdiction.Address(0, 0, external:=True) & ", 27, FALSE), """")"
                .Cells = .Value
                'E:E - column 32
                .Offset(0, 4).Formula = _
                  "=IFERROR(VLOOKUP($Q" & .Rows(1).Row & ", " & Jurisdiction.Address(0, 0, external:=True) & ", 32, FALSE), """")"
                .Cells = .Value
                'F:F - column 33
                .Offset(0, 5).Formula = _
                  "=IFERROR(VLOOKUP($Q" & .Rows(1).Row & ", " & Jurisdiction.Address(0, 0, external:=True) & ", 33, FALSE), """")"
                .Cells = .Value
                'G:G - column 34
                .Offset(0, 6).Formula = _
                  "=IFERROR(VLOOKUP($Q" & .Rows(1).Row & ", " & Jurisdiction.Address(0, 0, external:=True) & ", 34, FALSE), """")"
                .Cells = .Value
                'I:I - column 16
                .Offset(0, 6).Formula = _
                  "=IFERROR(VLOOKUP($Q" & .Rows(1).Row & ", " & Jurisdiction.Address(0, 0, external:=True) & ", 16, FALSE), """")"
                .Cells = .Value
                'J:J - column 8
                .Offset(0, 6).Formula = _
                  "=IFERROR(VLOOKUP($Q" & .Rows(1).Row & ", " & Jurisdiction.Address(0, 0, external:=True) & ", 8, FALSE), """")"
                .Cells = .Value
                'K:K - column 11
                .Offset(0, 6).Formula = _
                  "=IFERROR(VLOOKUP($Q" & .Rows(1).Row & ", " & Jurisdiction.Address(0, 0, external:=True) & ", 11, FALSE), """")"
                .Cells = .Value
            End With
    
            'Backfill rabies due dates based on animal ID
            .Range("Q8").Select
            With .Range("P8", .Range("Q8").End(xlDown).Offset(0, -1))
                .Formula = "=IFERROR(VLOOKUP(Q8, " & Renewal.Address(0, 0, external:=True) & ", 11, FALSE), """")"
                .Cells = .Value
            End With
        End With
    
        MsgBox "Completed"
    

    此方法通过一次将单元格批量加载到整个目标范围来避免循环遍历单元格。它们将适应新行,就像您循环它们一样。提供计算值后,公式将恢复为其值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-13
      • 2015-07-17
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多