遍历列A并复制不同工作簿上匹配工作表中的值

时间:2017-12-05 10:24:38

标签: excel vba excel-vba

我有2个工作簿,其中工作簿1在A列中有一个名称列表,每个名称都有一行值。 工作簿2还包含标有名称的工作表。其中一些名称与工作簿1的A列中的名称列表相同。 我想要实现的是检查A列上的名称是否与工作表名称匹配。如果是,则复制该行中的值并粘贴到工作簿2上工作表上的特定单元格中。 如果列A上的每个名称在工作簿2上以相同的顺序具有相应的表单,则下面的代码可以正常工作。但是,我希望它能够跳过工作簿2上没有工作表的空格或名称。所以我添加了一个if语句来查看是否解决了它但是这不起作用我得到了错误:'应用程序定义或对象定义的错误',突出显示if语句。

原始工作代码没有IF语句。并且只要列A上没有空格并且每个名称具有相同顺序的匹配表单就可以工作。

我还尝试添加错误恢复下一行,但刚刚停止触发错误代码,它将第一行复制粘贴到正确的单元格中,然后其余部分都没有。

任何帮助将不胜感激,谢谢。

Sub Measures()

Dim wb1 As Workbook
Dim Sht As Worksheet
Dim Rng, Rng2 As Range
Dim wb2 As Workbook
Dim cell As Range
Dim ws As Worksheet

Set wb1 = ThisWorkbook
Set wb2 = Workbooks("November Stream 1 v2.xlsm")
Set Sht = wb1.Worksheets("Summary")
Set Rng = Sht.Range("A7:A" & Sht.Cells(Sht.Rows.Count, "A").End(xlUp).Row)

For Each cell In Rng
Set ws = wb2.Sheets(cell.Text)

If wb1.Sheets("Summary").Range("A" & i) = wb2.Sheet.Name Then

   Select Case ws.Range("A4").Value
        Case "green"  '
        ws.Range("B29").Value = cell.Offset(0, 1).Value
        ws.Range("B33").Value = cell.Offset(0, 2).Value
        ws.Range("B37").Value = cell.Offset(0, 3).Value
        ws.Range("B40").Value = cell.Offset(0, 4).Value
        ws.Range("B44").Value = cell.Offset(0, 5).Value

        Case "red"
        ws.Range("B47").Value = cell.Offset(0, 6).Value
        ws.Range("B51").Value = cell.Offset(0, 7).Value
        ws.Range("B54").Value = cell.Offset(0, 8).Value
        ws.Range("B60").Value = cell.Offset(0, 9).Value
        ws.Range("B65").Value = cell.Offset(0, 11).Value

        Case "blue"
        ws.Range("B68").Value = cell.Offset(0, 12).Value
        ws.Range("B74").Value = cell.Offset(0, 14).Value
        ws.Range("B76").Value = cell.Offset(0, 15).Value
      End Select
        End If

    Next cell

End Sub

2 个答案:

答案 0 :(得分:1)

我认为您要测试的是工作表存在而不是表格是否与您设置的名称相匹配。看看以下内容,我已经整理了一下并使用错误处理来“测试”如果你设置名称的表格存在

Sub Measures()
    Dim wb2 As Workbook
    Dim ws As Worksheet
    Dim Rng, Rng2 As Range
    Dim cell

    Set wb2 = Workbooks("November Stream 1 v2.xlsm")
    With ThisWorkbook.Worksheets("Summary")
        Set Rng = .Range("A7:A" & .cells(.Rows.Count, "A").End(xlUp).Row)
    End With

    For Each cell In Rng
        On Error Resume Next
        Set ws = Nothing
        Set ws = wb2.Sheets(cell.Value2)
        On Error GoTo 0

        If Not ws Is Nothing Then
            Select Case ws.Range("A4").Value2
                Case "green"
                    ws.Range("B29").Value = cell.Offset(0, 1).Value
                    ws.Range("B33").Value = cell.Offset(0, 2).Value
                    ws.Range("B37").Value = cell.Offset(0, 3).Value
                    ws.Range("B40").Value = cell.Offset(0, 4).Value
                    ws.Range("B44").Value = cell.Offset(0, 5).Value

                Case "red"
                    ws.Range("B47").Value = cell.Offset(0, 6).Value
                    ws.Range("B51").Value = cell.Offset(0, 7).Value
                    ws.Range("B54").Value = cell.Offset(0, 8).Value
                    ws.Range("B60").Value = cell.Offset(0, 9).Value
                    ws.Range("B65").Value = cell.Offset(0, 11).Value

                Case "blue"
                    ws.Range("B68").Value = cell.Offset(0, 12).Value
                    ws.Range("B74").Value = cell.Offset(0, 14).Value
                    ws.Range("B76").Value = cell.Offset(0, 15).Value
            End Select
        End If
    Next cell
End Sub

答案 1 :(得分:-2)

尝试循环浏览wb2中的每个工作表,并将它们的名称与wb1中的当前单元格进行比较

作为伪装(这是一个粗略的想法,我现在没有时间完全输入它,对不起)

for each cell. wb1.range("your range)
    wb2.activate
    for each worksheet in wb2
        if activesheet.name = cell.value then
            'do stuff
        else
            'do nothing
        end if
    next worksheet
next cell