VBA中的匹配函数给出编译错误

0 excel vba

我有一本带有两个工作表的工作簿。“2020-2021”工作表在其 D 列中有一些唯一编号。匹配结果应出现在“欠款”工作表中。“欠款”中的 C2 单元格有一个我想在 2020-2021 年在 D 列中匹配的数字。输入以下代码。

Range("C3").Value = WorksheetFunction.Match(Range("c2").value,Range('2020-2021'!d11:d206),0)
Run Code Online (Sandbox Code Playgroud)

给出编译错误

VBa*_*008 5

限定(使用变量)

  • 如果您想学习一些东西,请学习前两个版本。
  • 如果没有,请选择第三个版本中的解决方案之一。

合格;那有什么意思?

  • 与这种情况有关,例如Range("C3")不合格。我们不确定它指的是哪里(属于)。它的缩写ActiveSheet.Range("C3")意味着如果我们选择Sheet1它会引用C3on Sheet1,如果我们选择Sheet2它会引用C3onSheet2等等。

  • 但是,如果我们使用Worksheets("Sheet1").Range("C3")我们已经限定了范围和我们选择的任何工作表,它将始终引用C3工作表Sheet1(不是 100% 正确,因为......)。

  • 与范围案例类似,我们说工作表 inWorksheets("Sheet1").Range("C3")不合格。该表达式实际上是ActiveWorkbook.Worksheets("Sheet1").Range("C3").

  • 为了限定它,我们可以做到Workbooks("Test.xlsm").Worksheets("Sheet1").Range("C3")。现在我们说范围是完全限定的,工作表也是如此。这通常看起来不切实际,所以ThisWorkbook“来拯救”。

  • 如果您需要参考包含此代码的工作簿,只需使用ThisWorkbook. 你不在乎它是否被调用Test.xlsmLast Years Official Inventory Report whatever.xlsm......只需使用ThisWorkbook.

  • 与我们的案例相关,然后我们可以使用以下方法完全限定我们的范围:

    ThisWorkbook.Worksheets("Arrears").Range("C3")
    
    Run Code Online (Sandbox Code Playgroud)

Application.Match 与 WorksheetFunction.Match

Sub qualifyAP()
    
    ' Define workbook.
    Dim wb As Workbook
    Set wb = ThisWorkbook ' The workbook containing this code.
    
    ' Define worksheets.
    Dim src As Worksheet
    Set src = wb.Worksheets("2020-2021")
    Dim tgt As Worksheet
    Set tgt = wb.Worksheets("Arrears")
    
    ' Use the Application version of Match.
    Dim Result As Variant ' can hold any datatype incl. error value.
    Result = Application.Match(tgt.Range("C2").Value, src.Range("D11:D206"), 0)
    If Not IsError(Result) Then
        tgt.Range("C3").Value = Result
        'MsgBox "Data found and transferred."
    Else
        MsgBox "Data not found. Nothing done."
    End If

End Sub

Sub qualifyWF()
    
    ' Define workbook.
    Dim wb As Workbook
    Set wb = ThisWorkbook ' The workbook containing this code.
    
    ' Define worksheets.
    Dim src As Worksheet
    Set src = wb.Worksheets("2020-2021")
    Dim tgt As Worksheet
    Set tgt = wb.Worksheets("Arrears")
    
    ' Use the WorksheetFunction version of Match.
    On Error Resume Next
    tgt.Range("C3").Value = WorksheetFunction.Match(tgt.Range("C2").Value, _
                                                    src.Range("D11:D206"), _
                                                    0)
    If Err.Number = 0 Then
        'MsgBox "Data found and transferred."
    Else
        MsgBox "Data not found. Nothing done."
    End If
    On Error GoTo 0

End Sub

Sub qualifyQF()
    
    Worksheets("Arrears").Range("C3").Value = WorksheetFunction _
      .Match(Worksheets("Arrears").Range("C2").Value, _
             Worksheets("2020-2021").Range("D11:D206"), _
             0)
' or:
    With Worksheets("Arrears")
        .Range("C3").Value = WorksheetFunction _
          .Match(.Range("C2").Value, _
                 Worksheets("2020-2021").Range("D11:D206"), _
                 0)
    End With
' or even:
    With Worksheets("Arrears").Range("C3")
        .Value = WorksheetFunction _
          .Match(.Offset(-1).Value, _
                 Worksheets("2020-2021").Range("D11:D206"), _
                 0)
    End With

End Sub
Run Code Online (Sandbox Code Playgroud)