当单元格值匹配时,使用 vba 以正确的顺序将所有数据从一个工作表复制到另一个工作表

Copy all data from one worksheet to another worksheet in a right order when a cell value matches using vba

提问人:Laura 提问时间:8/24/2023 最后编辑:braXLaura 更新时间:8/24/2023 访问量:38

问:

参考这篇文章:如果键列中的值匹配,则将列数据从一个工作表复制到另一个工作表

你好 我有 2 个 excel 文件:“销售报告”和“原始数据”。我想根据产品 ID 将数据从“原始数据”复制到“销售报告”,例如,“原始数据”包含 10 个产品 ID,但是,我只想在“销售报告”中包含 4 个产品 ID 的信息。原来的“销售报告”只包含一个产品 ID 列,其他列只有标题,没有数据。

例: 原始数据(注意:第一行是 Excel 默认的 colume 名称,第二行由我的标题组成):

A             B       C          D          E                 F             G            H
Product ID    Store   StoreID    Quantity   Price per unit    Total price   CustomerID   Month 
AB001         NY      01         2          5                 10            A135324      04/2023
GHI001        SE      07         1          15                15            Z457246      07/2023
ACA001        CH      03         6          10                60            H293847      06/2023
JF001         OH      02         1          30                30            L293720      03/2023
SSF001        NY      01         8          20                160           B725183      06/2023
BI001         NY      01         2          25                50            J347346      04/2023
LA001         CO      09         3          4                 12            D346435      07/2023
OP001         SE      07         1          250               250           J959942      05/2023
RH001         OH      02         2          3                 6             A562450      04/2023
KQ001         NY      01         10         12                120           C662036      06/2023  

销售报告预计是这样的:

A             B        C            D       E          F                 G            H
Product ID    Month    CustomerID   Store   StoreID    Price per unit    Quantity     Total price
AB001         04/2023  A135324      NY      01         5                 2            10
OP001         05/2023  J959942      SE      07         250               1            250
ACA001        06/2023  H293847      CH      03         10                6            60
KQ001         06/2023  C662036      NY      01         12                10           120

2 个文件中的列顺序不一样,我想在“原始数据”中查找产品 ID,如果与“销售报告”中的产品 ID 匹配,则其他列中的数据将复制并粘贴到“销售报告”中并按正确的顺序粘贴。

以下是我的脚本:

Sub Main_content()
    
    Dim ws_copy As Worksheet
    Dim ws_paste As Worksheet
    Dim LastRow As Long
    Dim i As Long
    
    Workbooks.Open "C:\HP\Users\Downloads\Raw data.xlsx.xlsx"
    
    
    Set ws_copy = Workbooks("Raw data.xlsx").Sheets("sheet1")
    Set ws_paste = Workbooks("Sales report.xlsx").Sheets("sheet1")
    
    With ws_copy
      
      LastRow = .Cells(.Rows.Count, "H").End(xlUp).Row
   
    End With
    

   For i = 2 To LastRow
   
    With ws_copy
    On Error Resume Next
    
        If WorksheetFunction.Match(ws_copy.Range("A" & i), ws_paste.Range("A:A"), 0) <> 0 Then
            .Cells(i, "B").Copy Destination:=ws_paste.Range("D" & i)
            .Cells(i, "C").Copy Destination:=ws_paste.Range("E" & i)
            .Cells(i, "D").Copy Destination:=ws_paste.Range("G" & i)
            .Cells(i, "E").Copy Destination:=ws_paste.Range("F" & i)
            .Cells(i, "F").Copy Destination:=ws_paste.Range("H" & i)
            .Cells(i, "G").Copy Destination:=ws_paste.Range("C" & i)
            .Cells(i, "H").Copy Destination:=ws_paste.Range("B" & i)
        
        Else
            .Cells(i, "A").EntireRow.Delete
            
        End If

   End With

Next i

End Sub


我对VBA不是很熟悉,所以我的想法是遍历“原始数据”中A列中的所有单元格,如果它与“销售报告”中指定的产品ID匹配,则复制所有数据,如果不是,则删除“原始数据”中的行。(我知道这不是一个好主意,因为数据应该保留而不是删除) 但是,当我运行代码时,“原始数据”中的所有 10 行都粘贴在“销售报告”中,有些甚至是错误的产品 ID。

任何反馈都非常感谢! 非常感谢!

Excel VBA for 循环 if 语句

评论

0赞 niton 8/24/2023
显示您使用了问题中的代码,而不是答案 如果键列中的值匹配,则将列数据从一个工作表复制到另一个工作表
0赞 Laura 8/24/2023
我用了答案。答案是对问题的轻微修改,但在上面的循环中,我只使用了 1 个变量 i 而不是像参考帖子那样的 i,j。我还添加了.单元格(i,“A”)。EntireRow.Delete 添加到 Else 语句中。

答:

1赞 CDP1802 8/24/2023 #1

使用 not i 中的结果。Match()Destination:=ws_paste.Range("D" & i)

Sub Main_content()

    Const RAWDATA = "C:\HP\Users\Downloads\Raw data.xlsx.xlsx"
    Const SALES = "Sales report.xlsx"
    
    Dim wbCopy As Workbook, wbPaste As Workbook
    Dim wsCopy As Worksheet, wsPaste As Worksheet
    Dim rngPaste As Range, m As Variant
    Dim lastrow As Long, i As Long, n As Long
    
    Set wbCopy = Workbooks.Open(RAWDATA)
    Set wsCopy = wbCopy.Sheets("sheet1")
    
    Set wbPaste = Workbooks(SALES)
    Set wsPaste = wbPaste.Sheets("sheet1")
    
    With wsPaste
        lastrow = .Cells(.Rows.Count, "A").End(xlUp).Row
        Set rngPaste = .Range("A1:A" & lastrow)
    End With
    
    Application.ScreenUpdating = False
    With wsCopy
        lastrow = .Cells(.Rows.Count, "A").End(xlUp).Row
        For i = lastrow To 2 Step -1
             m = Application.Match(.Cells(i, "A"), rngPaste, 0)
             If Not IsError(m) Then
                .Cells(i, "B").Copy Destination:=wsPaste.Range("D" & m)
                .Cells(i, "C").Copy Destination:=wsPaste.Range("E" & m)
                .Cells(i, "D").Copy Destination:=wsPaste.Range("G" & m)
                .Cells(i, "E").Copy Destination:=wsPaste.Range("F" & m)
                .Cells(i, "F").Copy Destination:=wsPaste.Range("H" & m)
                .Cells(i, "G").Copy Destination:=wsPaste.Range("C" & m)
                .Cells(i, "H").Copy Destination:=wsPaste.Range("B" & m)
                n = n + 1
            Else
                .Cells(i, "A").Interior.Color = vbRed
                '.Cells(i, "A").EntireRow.Delete
            End If
        Next
    End With
    Application.ScreenUpdating = True
    MsgBox n & " rows matched", vbInformation

End Sub

评论

0赞 Laura 8/24/2023
谢谢你帮助我!我在执行您的错误时收到此错误:“对象可变或未设置块变量”
0赞 CDP1802 8/24/2023
@Laura 哪条线?C:\HP\Users\Downloads\Raw data.xlsx.xlsx 文件名是否正确?
0赞 Laura 8/24/2023
文件的名称正确 - 原始数据:.xlsx(我删除了多余的 .xlsx)
0赞 CDP1802 8/24/2023
@Laura 错误是在哪一行引发的?
0赞 Laura 8/24/2023
子Main_content()