【问题标题】:VBA Code for Vlookup on different worksheets within the same workbook用于在同一工作簿中的不同工作表上进行 Vlookup 的 VBA 代码
【发布时间】:2018-07-02 05:39:47
【问题描述】:

我正在尝试编写一个 vba 脚本,它允许我将值从 Sheet(3) 查找到不同的 Sheet(i) - 并将其粘贴到 Sheet(i) 上的范围“R2”上 - 我也希望它转到 Sheet(i) 上 M 列中值的末尾[如果可能的话]。我基本上想浏览工作簿上所有不同的“i”表。工作表 (3) 包含需要复制到所有其他“i”工作表上的所有数据。

我在下面的代码中不断出现错误。

Sub CopyTableau1Data()

    Dim wka As Worksheet
    Dim wkb As Worksheet

    ShtCount = ActiveWorkbook.Sheets.Count

    For i = 9 To ShtCount

    With ThisWorkbook
        Set wka = .Sheets(i)
        Set wkb = .Sheets(3)
    End With

    Worksheets(i).Activate

    If IsError(Application.WorksheetFunction.VLookup(wka.Range("M2"), wkb.Range("E:T"), 14, 0)) Then
            wka.Range("R2").Value = ""
        Else
            wka.Range("R2").Value = Application.WorksheetFunction.VLookup(wka.Range("M2"), wks.Range("E:T"), 14, 0)
        End If

    Next i

End Sub

【问题讨论】:

  • 您会收到什么错误消息,以及代码中断发生在哪一行(如果有)?

标签: vba excel


【解决方案1】:

IsError 不适用于 Application.WorksheetFunction.VLookup 或 WorksheetFunction.VLookup,仅适用于 Application.VLookup。

将 Application.Match 一次返回到变体类型变量然后对其进行测试以供使用会更快更容易。

dim am as variant

'are you sure you want wkb and not wks here?
am = Application.match(wka.Range("M2"), wkb.Range("E:E"), 0)

If IsError(am) Then
    wka.Range("R2") = vbnullstring
Else
    'are you sure you want wks and not wkb here?
    wka.Range("R2") = wks.cells(am, "R").value
End If

注意 wkbwks 在两个地方的明显误用。我看不出在一个工作表中查找值、测试返回值然后使用测试结果在另一个工作表中查找相同值的意义。

【讨论】:

    【解决方案2】:

    您可以使用以下代码:

    Sub CopyTableau1Data()
    Dim wka As Worksheet
    Dim wkb As Worksheet, i As Integer
        ShtCount = ActiveWorkbook.Sheets.Count
    
        For i = 9 To ShtCount
    
        With ThisWorkbook
            Set wka = .Sheets(i)
            Set wkb = .Sheets(3)
        End With
    
        Worksheets(i).Activate
        wka.Range("R2") = aVL(i)
    Next i
    End Sub
    
    Function aVL(ByVal wsno As Integer) As String
    On Error GoTo errhandler:
        aVL =                 
    Application.WorksheetFunction.VLookup(ActiveWorkbook.Worksheets(wsno).Range("M2"), 
    ActiveWorkbook.Worksheets(3).Range("E:T"), 14, False)
    errhandler:
        aVL = ""
    End Function
    

    当您尝试通过 isError 检查错误时,程序流可以根据错误立即从子程序返回。您可以在您的 sub 中使用 on error 来防止这种情况,但这只会处理第一个错误。通过将错误处理委托给一个函数,您可以重复处理循环中的错误。

    我假设您想使用 wkb.Range("E:T") 而不是 wks.Range("E:T")。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多