Copy data from one excel sheet to another (complex) using VBA based on column name

前端 未结 3 427
北恋
北恋 2021-01-07 11:24

I\'m very new to VBA and after 5 hours of watching videos and Googling, I think this is just too over my head... any help is very much appreciated.

So I have 2 excel

相关标签:
3条回答
  • 2021-01-07 12:08

    You can try this also, provided that the columns are as you mentioned above (A to F in sheet1 and A to D in sheet2).

    Sub copies()
        Dim i, j, row As Integer
        j = Worksheets("sheet1").Range("A1").End(xlDown).row
        For i = 1 To j
            If Cells(i, 6) = "Y" Then _
            row = Worksheets("sheet2").Range("A1").End(xlDown).row + 1
            Worksheets("sheet2").Cells(row, 1) = Worksheets("sheet1").Cells(i, 2)
            Worksheets("sheet2").Cells(row, 2) = Worksheets("sheet1").Cells(i, 1)
            Worksheets("sheet2").Cells(row, 3) = Worksheets("sheet1").Cells(i, 4)
            Worksheets("sheet2").Cells(row, 4) = Worksheets("sheet1").Cells(i, 3)
        Next
        Worksheets("sheet1").Range("F:F").ClearContents
    End Sub
    
    0 讨论(0)
  • 2021-01-07 12:11

    Alright, now it works also if you have columns in Sheet2 that do not exist in Sheet1.

    Sub CopySheet() Dim i As Integer Dim LastRow As Integer Dim Search As String Dim Column As Integer

    Sheets("Sheet1").Activate
    Sheets("Sheet1").Range("A1").Select
    'Sets an Autofilter to sort out only your Yes rows.
    Selection.Autofilter
    'Change Field:=5 to the number of the column with your Y/N.
    Sheets("Sheet1").Range("$A$1:$G$3").Autofilter Field:=7, Criteria1:="Y"
    
    'Finds the last row
    LastRow = Sheets("Sheet1").Cells(Sheets("Sheet1").Rows.Count, "A").End(xlUp).Row
    
    i = 1
    'Change the 3 to the number of columns you got in Sheet2
    Do While i <= 3
        Search = Sheets("Sheet2").Cells(1, i).Value
        Sheets("Sheet1").Activate
        'Update the Range to cover all your Columns in Sheet1.
        If IsError(Application.Match(Search, Sheets("sheet1").Range("A1:G1"), 0)) Then
            'nothing
        Else
            Column = Application.Match(Search, Sheets("sheet1").Range("A1:G1"), 0)
            Sheets("Sheet1").Cells(2, Column).Resize(LastRow, 1).Select
            Selection.Copy
            Sheets("Sheet2").Activate
            Sheets("Sheet2").Cells(2, i).Select
            ActiveSheet.Paste
        End If
        i = i + 1
    Loop
    
    'Clear all Y/N = Y
    'Update the Range to cover all your Columns in Sheet1.
    Sheets("Sheet1").Activate
    Column = Application.Match("Y/N", Sheets("sheet1").Range("A1:G1"), 0)
    Sheets("Sheet1").Cells(2, Column).Resize(LastRow, 1).Select
    Selection.ClearContents
    End Sub
    
    0 讨论(0)
  • 2021-01-07 12:12

    When researching this further I was looking into creating a static array for the headers... then user3561813 provided this gem (I altered it slightly for my if statement and to loop through the sheet:

    Sub validatetickets()
    
    Do Until ActiveCell.Value = ""
    If Cells(ActiveCell.Row, 43) = "Y" Then
    
    Dim wsOrigin As Worksheet
    Dim wsDest As Worksheet
    Dim nCopyRow As Long
    Dim nPasteRow As Long
    Dim rngFnd As Range
    Dim rngDestSearch As Range
    Dim cel As Range
    
    Const ORIGIN_ROW_HEADERS = 1
    Const DEST_ROW_HEADERS = 1
    
    
    Set wsOrigin = Sheets("Case")
    Set wsDest = Sheets("Sheet1")
    
    nCopyRow = ActiveCell.Row
    nPasteRow = wsDest.Cells(Rows.Count, 1).End(xlUp).Row + 1
    
    Set rngDestSearch = Intersect(wsDest.UsedRange, wsDest.Rows(DEST_ROW_HEADERS))
    
    For Each cel In Intersect(wsOrigin.UsedRange, wsOrigin.Rows(ORIGIN_ROW_HEADERS))
    On Error Resume Next
        Set rngFnd = rngDestSearch.Find(cel.Value)
    
        If rngFnd Is Nothing Then
            'Do Nothing as Header Does not Exist
        Else
            wsDest.Cells(nPasteRow, rngFnd.Column).Value = wsOrigin.Cells(nCopyRow, cel.Column).Value
        End If
    On Error GoTo 0
    
    Set rngFnd = Nothing
    Next cel
    ActiveCell.Offset(1, 0).Select
    Else: ActiveCell.Offset(1, 0).Select
    End If
    
    Loop
    End Sub
    

    This is pretty slick the way it works and is very scalable. Doesn't depend on both sheets having identical columns etc... I can see this being very useful in the future. :)

    0 讨论(0)
提交回复
热议问题