Cells(1, i).EntireColumn.End(xlUp).Copy
будет копировать только одну ячейку, так как метод End
выбирает только одну ячейку. Попробуйте использовать объект Range
, чтобы указать начальную (верхнюю левую) ячейку диапазона и конечную (нижнюю правую) ячейку:
For i = g To Cells(1, Columns.Count).End(xlLeft).Column
lastRow = cells(1000000, i).end(xlup).row
Range(Cells(1, i), Cells(lastRow, i)).copy
Range("a1").End(xlDown).Offset(1, 0).PasteSpecial xlPasteValues
Next i
Правка: безопаснее (и полезная привычка) указывать объект, с которым мы работаем
dim ws as worksheet
Set ws = Sheets("The name of the sheet I'm working on")
For i = g To ws.Cells(1, ws.Columns.Count).End(xlLeft).Column
lastRow = ws.cells(1000000, i).end(xlup).row
ws.Range(ws.Cells(1, i), ws.Cells(lastRow, i)).copy
ws.Range("a1").End(xlDown).Offset(1, 0).PasteSpecial xlPasteValues
Next i
Как отмечается в комментариях, может быть более эффективным использование символов With
block
dim ws as worksheet
Set ws = Sheets("The name of the sheet I'm working on")
With ws
For i = g To .Cells(1, ws.Columns.Count).End(xlLeft).Column
lastRow = .cells(1000000, i).end(xlup).row
.Range(ws.Cells(1, i), .Cells(lastRow, i)).copy
.Range("a1").End(xlDown).Offset(1, 0).PasteSpecial xlPasteValues
Next i
End With