程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了VBA - 如果行不存在,则根据 A 列和 C 列将行从工作表 X 复制到工作表 Y大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决VBA - 如果行不存在,则根据 A 列和 C 列将行从工作表 X 复制到工作表 Y?

开发过程中遇到VBA - 如果行不存在,则根据 A 列和 C 列将行从工作表 X 复制到工作表 Y的问题如何解决?下面主要结合日常开发的经验,给出你关于VBA - 如果行不存在,则根据 A 列和 C 列将行从工作表 X 复制到工作表 Y的解决方法建议,希望对你解决VBA - 如果行不存在,则根据 A 列和 C 列将行从工作表 X 复制到工作表 Y有所启发或帮助;

我现在正在尝试执行此代码一段时间,但到目前为止还没有成功。根据 A 列和 C 列中数据的比较,如果工作表 Y 中尚不存在行,我想将工作表 X 中的行复制到另一工作表 Y 的末尾。

当我只需要与一列进行比较时,我已经完成了代码,并且它运行良好。我把它放在那里,所以你可以看到:

sourceLastRow = ws_src.Cells(ws_src.Rows.Count,"A").End(xlUp).offset(1).Row
destLastRow = ws_dest.Cells(ws_dest.Rows.Count,"A").End(xlUp).offset(1).Row

    For Each rng In ws_src.Range("A2:A" & sourceLastRow)
        Set foundVal = ws_dest.Range("A2:A" & destLastRow).Find(rng,LookIn:=xlValues,lookat:=xlWholE)
        
        If foundVal Is nothing Then

            rng.EntireRow.copy
            ws_dest.Cells(Rows.Count,"A").End(xlUp).offset(1,0).PasteSpecial xlPasteValues
              
        End If
    Next rng

不幸的是,当我尝试比较两列时,我没有得到我需要的结果。我尝试了下面的代码,但它没有停止就复制了我第一张纸的第一行:

Dim ws_src As Worksheet
Dim ws_dest As Worksheet

Dim rw_src As Range
Dim rw_dest As Range

Set ws_src = Worksheets(1)
Set ws_dest = Worksheets(2)

For Each rw_src In ws_src.Rows

    For Each rw_dest In ws_dest.Rows
        If ws_src.Cells(rw_src.row,1).Value = ws_dest.Cells(rw_dest.row,1).Value And ws_src.Cells(rw_src.row,3).Value = ws_dest.Cells(rw_dest.row,3).Value Then
        Else: rw_src.EntireRow.copy
            ws_dest.Cells(Rows.Count,0).PasteSpecial xlPasteValues
        End If
    Next rw_dest
Next rw_src

感谢您的时间!

莉亚

解决方法

这是您正在尝试的吗(未经测试)?

Option Explicit

Sub Sample()
    Dim ws_src As Worksheet
    Dim ws_dest As Worksheet
    
    '~~> Change as applicable
    Set ws_src = Sheet1
    Set ws_dest = Sheet2
    
    Dim lRow As Long
    Dim i As Long
    
    '~~> Find Last row in ws_src
    With ws_src
        .AutoFilterMode = false
        lRow = .Range("A" & .Rows.Count).End(xlUp).Row
    End With
    
    Dim rngToCopy As Range,FilteredRange As Range
    Dim NewRow As Long
    
    With ws_dest
        '~~> Find Last row in ws_dest
        NewRow = .Range("A" & .Rows.Count).End(xlUp).Row
        For i = 2 To lRow
            .AutoFilterMode = false
            
            '~~> Put the filters
            .Range("A1:C" & NewRow).AutoFilter Field:=1,Criteria1:="=" & ws_src.Cells(i,1).Value2
            .Range("A1:C" & NewRow).AutoFilter Field:=3,3).Value2

            Set FilteredRange = .Range("A1:C" & NewRow).offset(1,0).SpecialCells(xlCellTypeVisiblE).EntireRow
            
            '~~> If no match found then store the row in an object
            If Application.CountA(FilteredRangE) = 0 Then
                If rngToCopy Is Nothing Then
                    Set rngToCopy = ws_src.Rows(i)
                Else
                    Set rngToCopy = Union(rngToCopy,ws_src.Rows(i))
                End If
            Else
                Set FilteredRange = Nothing
            End If
        Next i
        .AutoFilterMode = false
    End With
    
    '~~> Do the copy in one go
    If Not rngToCopy Is Nothing Then rngToCopy.Copy ws_dest.Rows(NewRow + 1)
End Sub

重要提示:无论您采用哪种方法,无论是 .Find 还是 .Autofilter 或其他任何方法,都不要在循环中复制和粘贴。会很慢。最后复制如上图

,

这是您正在寻找的简单示例。修改代码以满足您的需求并尝试:

Option Explicit

Sub test()
    
    Dim wssource As Worksheet,wsDesTination As Worksheet
    Dim LastRowsource As Long,LastRowDesTination As Long
    Dim i As Long,y As Long
    Dim Value_1 As String,Value_2 As String
    Dim ValueExists As Boolean
    
    With ThisWorkbook
        Set wssource = .Worksheets("Sheet1")
        Set wsDesTination = .Worksheets("Sheet2")
    End With
    
    With wssource
    
        'Find the last row of column A,wssource
        LastRowsource = .Cells(.Rows.Count,"A").End(xlUp).Row
        
        'Loop column A,wssource
        For i = 1 To LastRowsource
        
            'Let's say we are tesTing columns A & B
            Value_1 = .Range("A" & i).Value
            Value_2 = .Range("B" & i).Value
            
            ValueExists = false
            
            With wsDesTination
            
                'Find the last row of column A,wsDesTination
                LastRowDesTination = .Cells(.Rows.Count,"A").End(xlUp).Row
                
                'Loop column A,wsDesTination
                For y = 1 To LastRowDesTination
                
                    If .Range("A" & y).Value = Value_1 And .Range("B" & y).Value = Value_2 Then
                        ValueExists = True
                        Exit For
                    End If
                    
                Next y
                
                'if value does not exist copy
                If ValueExists = false Then
                    .Range("A" & LastRowDesTination + 1).Value = Value_1
                    .Range("B" & LastRowDesTination + 1).Value = Value_2
                End If
                
            End With
            
        Next i
        
    End With
    
End Sub

大佬总结

以上是大佬教程为你收集整理的VBA - 如果行不存在,则根据 A 列和 C 列将行从工作表 X 复制到工作表 Y全部内容,希望文章能够帮你解决VBA - 如果行不存在,则根据 A 列和 C 列将行从工作表 X 复制到工作表 Y所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。