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
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
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
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. :)