счетчик vba l oop для колонн - PullRequest
1 голос
/ 30 апреля 2020

Цель моего кода - скопировать каждый столбец и вставить каждый столбец под другим в столбец А.

Я пытаюсь использовать счетчик от l oop до l oop через столбцы один на время, но я не могу понять, как ссылаться на каждый столбец, чтобы получить все использованные ячейки в столбце. Довольно просто для строк, но для столбцов мне нужно либо установить переменную в строку и изменить ее на счетчик букв, или я могу сослаться на столбец, используя число в формате диапазона?

При попытке выделить весь столбец приведенный ниже код не работает.

Sub testing()

Dim i As Integer
Dim lastrow As Integer
Const g As Byte = 2

lastrow = Range("b" & Rows.Count).End(xlUp).Row

For i = g To Cells(1, Columns.Count).End(xlLeft).Column

*Cells(1, i).EntireColumn.End(xlUp).Copy*
Range("a1").End(xlDown).Offset(1, 0).PasteSpecial xlPasteValues

Next i

End Sub

1 Ответ

1 голос
/ 30 апреля 2020

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...