Reputation: 21
I am trying to copy multiple columns with the same header name into a new worksheet.
The problem I am having is it only copies one column and leaves the other blank.
In this example I want the date to be in column 1 and in column 5 but it only places the column in Target Column 5.
Sub MoveColumns()
' MoveColumns Macro
' Description: Rearrange columns in Excel based on column header
Dim iRow As Long
Dim iCol As Long
'Constant values
data_sheet1 = InputBox("Specify the name of the Sheet that needs to be reorganized:") 'Create Input Box to ask the user which sheet needs to be reorganised
target_sheet = "Final Report" 'Specify the sheet to store the results
iRow = Sheets(data_sheet1).UsedRange.Rows.Count 'Determine how many rows are in use
'Create a new sheet to store the results
Worksheets.Add.Name = "Final Report"
'Start organizing columns
For iCol = 1 To Sheets(data_sheet1).UsedRange.Columns.Count
'Sets the TargetCol to zero in order to prevent overwriting existing targetcolumns
TargetCol = 0
'Read the header of the original sheet to determine the column order
If Sheets(data_sheet1).Cells(1, iCol).value = "DATE" Then TargetCol = 1
If Sheets(data_sheet1).Cells(1, iCol).value = "SYSTEM NAME" Then TargetCol = 2
If Sheets(data_sheet1).Cells(1, iCol).value = "CH" Then TargetCol = 3
If Sheets(data_sheet1).Cells(1, iCol).value = "CARR KEY" Then TargetCol = 3
If Sheets(data_sheet1).Cells(1, iCol).value = "FLAG" Then TargetCol = 4
If Sheets(data_sheet1).Cells(1, iCol).value = "DATE" Then TargetCol = 5
'If a TargetColumn was determined (based upon the header information) then copy the column to the right spot
If TargetCol <> 0 Then
'Select the column and copy it
Sheets(data_sheet1).Range(Sheets(data_sheet1).Cells(1, iCol), Sheets(data_sheet1).Cells(iRow, iCol)).Copy Destination:=Sheets(target_sheet).Cells(1, TargetCol)
End If
Next iCol 'Move to the next column until all columns are read
End Sub
Upvotes: 2
Views: 763
Reputation: 9976
Change your second date column header to something else like Date2 which I have used in the code below. Otherwise your first condition will always be evaluated as True and it will pick the first column always.
You may try it like thie...
Sub MoveColumns()
' MoveColumns Macro
' Description: Rearrange columns in Excel based on column header
Dim iRow As Long
Dim iCol As Long
Dim TargetCol As Long
Dim FirstDate As Boolean
'Constant values
data_sheet1 = InputBox("Specify the name of the Sheet that needs to be reorganized:") 'Create Input Box to ask the user which sheet needs to be reorganised
target_sheet = "Final Report" 'Specify the sheet to store the results
iRow = Sheets(data_sheet1).UsedRange.Rows.Count 'Determine how many rows are in use
'Create a new sheet to store the results
Worksheets.Add.Name = "Final Report"
'Start organizing columns
For iCol = 1 To Sheets(data_sheet1).UsedRange.Columns.Count
'Sets the TargetCol to zero in order to prevent overwriting existing targetcolumns
TargetCol = 0
'Read the header of the original sheet to determine the column order
If LCase(Sheets(data_sheet1).Cells(1, iCol).Value) = "date" Then
If Not FirstDate Then
TargetCol = 1
FirstDate = True
Else
TargetCol = 6
End If
ElseIf LCase(Sheets(data_sheet1).Cells(1, iCol).Value) = "system name" Then
TargetCol = 2
ElseIf LCase(Sheets(data_sheet1).Cells(1, iCol).Value) = "ch" Then
TargetCol = 3
ElseIf LCase(Sheets(data_sheet1).Cells(1, iCol).Value) = "carr key" Then
TargetCol = 4
ElseIf LCase(Sheets(data_sheet1).Cells(1, iCol).Value) = "flag" Then
TargetCol = 5
ElseIf LCase(Sheets(data_sheet1).Cells(1, iCol).Value) = "date" Then
TargetCol = 6
End If
'If a TargetColumn was determined (based upon the header information) then copy the column to the right spot
If TargetCol <> 0 Then
'Select the column and copy it
Sheets(data_sheet1).Range(Sheets(data_sheet1).Cells(1, iCol), Sheets(data_sheet1).Cells(iRow, iCol)).Copy Destination:=Sheets(target_sheet).Cells(1, TargetCol)
End If
Next iCol 'Move to the next column until all columns are read
End Sub
Upvotes: 1