#excel #vba
#excel #vba
Вопрос:
У меня небольшая проблема. Собранный мной код берет данные из столбца A в sheet(1)
и копирует их (перенося в строку) в sheet(2)
. Хотя, прежде чем вставить это (вот момент, когда я начал записывать макрос), я нажимаю «control right», чтобы найти первую заполненную ячейку (в строке 2 (sheet(2)
), а затем выбираю вставить в данные, транспонируя их и заменяя данные, которые у меня там уже есть (в строку).
Проблема в том, что у меня есть 1000 столбцов, которые мне нужно перенести таким образом в строки (в каждом случае строка начинается в разных точках sheet(2)
) и заменить старые данные. Может кто-нибудь посоветовать, пожалуйста? Для этого потребуется какой-то цикл (я это знаю).
Sub test()
Dim ws1, ws2 As Worksheet, lr As Long
Set ws1 = ThisWorkbook.Sheets(1): Set ws2 = ThisWorkbook.Sheets(2)
lr = ws1.Range("A" amp; ws1.Rows.Count).End(xlUp).Row
ws1.Range("A2:A" amp; lr).Copy
With ws2
'I have recorded this part
ws2.Activate
Range("A2").Select
Selection.End(xlToRight).Select
Selection.End(xlToRight).Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=True
End With
End Sub
Несколько экранов для пояснения:
Здесь ws2, где данные начинаются в разных точках каждой строки (мне нужно, чтобы данные из ws1 были скопированы в ws2 и заменяли данные именно там, где они начинаются в каждой строке):
Комментарии:
1. Куда вы собираетесь вставить значения в `ws2′? В строке, равной номеру скопированного столбца? Тогда все ли столбцы на первом листе имеют одинаковое количество записей?
2. @FaneDuru таким образом, данные столбца A (ws1) отправляются в строку 2 (ws2), столбца B (ws1) — в строку 3 (ws2) и так далее. Столбцы в A содержат разное количество записей.
3. Затем, пожалуйста, попробуйте мой код ответа.
Ответ №1:
Попробуйте следующий код, пожалуйста:
Sub testCopyTranspose()
Dim ws1, ws2 As Worksheet, lr As Long, lastCol As Long, LastCol2 As Long, i As Long
Set ws1 = ThisWorkbook.Sheets(1): Set ws2 = ThisWorkbook.Sheets(2)
lastCol = ws1.cells(1 amp; Columns.count).End(xlToLeft).Column
For i = 1 To lastCol
lr = ws1.cells(Rows.count, i).End(xlUp).Row
LastCol2 = ws2.cells(i 1, 1).End(xlToRight).Column
ws1.Range(ws1.cells(2, i), ws1.cells(lr, i)).Copy
ws2.cells(i 1, LastCol2).PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=True
Next i
End Sub
Комментарии:
1. это замена строк, начинающихся в столбце A (в ws2), в то время как мне нужно определить первую точку данных в каждой строке (поскольку там есть данные) и вставить туда, где начинается каждая строка, например. строка 2 начинается в LB2, строка 3 в FX3, строка 4 в LI4, строка 5 в MF5 и так далее.
2. @West Ray: Что вы подразумеваете под «первой точкой данных»? Вы имеете в виду последний пустой столбец в этой конкретной строке, где выполняется вставка?
3. первая точка данных в строке 2 (ws2) начинается в LB2 (и именно туда мне нужно вставить данные из столбца A (ws1) — затем мне нужно вставить данные из столбца B (ws1) в FX3 на ws2). Проблема заключается в том, чтобы (автоматически) определить, где начинается временной ряд в ws2 для каждой строки (вот почему я записал часть своего макроса, чтобы найти первый экземпляр непустой ячейки в строке 2).
4. Итак, мое последнее предположение должно быть правильным. Это означает, что код найдет первый столбец, содержащий данные о вставляемой строке , и вставит туда. Правильно ли это понимание?
5. @West Ray: Я адаптировал код, исходя из вышеизложенного предположения. Но вы не можете подтвердить (или ослабить), что я предположил, что вы хотите? Я могу адаптировать код в любом направлении, но я хотел бы сделать это после того, как буду уверен, что понимаю, что вам нужно.