Excel 2010 VBA. Соедините 2 столбца с листа и вставьте их в другой

Используя Excel 2010, я пытаюсь создать скрипт, который объединяет два текстовых столбца (A и B) из Sheet1 и вставляет результат в столбец A Sheet2.

В книге используется внешний источник данных для загрузки обоих столбцов, поэтому количество строк не фиксировано.

Я пробовал следующий код, но не работал. переменная lRow не принимает значения.

Sub Concat() Sheets("Sheet1").Select Dim lRow As Long lRow = Range("A" & Rows.count).End(xlUp).Row For i = 2 To lRow ActiveWorkbook.Sheets("Sheet2").Cells(i, 1) = Cells(i, 1) & Cells(i, 2) Next i End Sub 

Что я делаю не так. Спасибо за помощь!

Что касается того, что вы делаете неправильно, я предлагаю вам использовать

 Sub Concat() Sheets("Sheet1").Select Dim lRow As Long, i As Long Dim rng As Range Set rng = Range("A" & Rows.Count).End(xlUp) Debug.Print rng.Address(External:=True) lRow = rng.Row For i = 2 To lRow ActiveWorkbook.Sheets("Sheet2").Cells(i, 1) = Cells(i, 1) & Cells(i, 2) Next i End Sub 

чтобы увидеть, что происходит. Я пробовал точно, что вы использовали, и это сработало для меня (Excel 2010).

Среднее значение означает, что значение переменной lRow не принимает значения.

Вы также можете попробовать альтернативно

 Sub Concat2() Sheets("Sheet1").Select Dim lRow As Long, i As Long Dim rng As Range Set rng = Range("A2").End(xlDown) Debug.Print rng.Address(External:=True) lRow = rng.Row For i = 2 To lRow ActiveWorkbook.Sheets("Sheet2").Cells(i, 1) = Cells(i, 1) & Cells(i, 2) Next i End Sub 

который должен дать тот же результат, если yo не имеет пустых ячеек в середине столбца источника A.

Я бы посоветовал выбраться из метода .Select программирования XL VBA в пользу прямой адресации, которая не оставит вас с ошибками.

 Sub Concat() Dim i As Long, lRow As Long With Sheets("Sheet1") lRow = .Range("A" & Rows.Count).End(xlUp).Row For i = 2 To lRow Sheets("Sheet2").Cells(i, 1) = .Cells(i, 1) & .Cells(i, 2) Next i End With End Sub 

Обратите внимание на периоды (aka. Или full stop ), которые префикс .Cells и .Range . Они сообщают .Cells и .Range, что они принадлежат к рабочему листу, на который ссылаются в With ... End With block; в этом примере это будут Sheets("Sheet1") .

Если у вас много строк для объединения, вам лучше создать массив значений из Sheet1 и обработать конкатенацию в памяти. Разделите конкатенированные значения и верните их в Sheet2.

 Sub concat2() Dim c As Long, rws As Long, vCOLab As Variant With Sheets("Sheet1") rws = .Range("A2:A" & .Cells(Rows.Count, 1).End(xlUp).Row).Rows.Count vCOLab = .Range("A2").Resize(rws, 3) For c = LBound(vCOLab, 1) To UBound(vCOLab, 1) 'Debug.Print vCOLab(c, 1) & vCOLab(c, 2) vCOLab(c, 3) = vCOLab(c, 1) & vCOLab(c, 2) Next c End With Sheets("Sheet2").Range("A2").Resize(rws, 1) = Application.Index(vCOLab, , 3) End Sub 

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

  • Как сделать несколько пивотиментов невидимыми в Excel Vba
  • Макрос, который не будет работать до завершения третьего стороннего процесса
  • постройте два набора данных на одном графике
  • Найти уникальные значения в Excel
  • выполнить некоторые вычисления для каждой ячейки в двух выравниваемых столбцах в EXCEL 2010 by VBA
  • VBA - Как передать диапазон, выбранный в TextBox, в качестве ссылки?
  • Как я могу изменить Row-Color в excel-row с NetOffice?
  • Общие значения для каждого элемента с последовательными датами
  • Копирование и вставка определенных ячеек между несколькими рабочими книгами
  • Excel 2010 VBA: копирование строки в новый лист на основе значения
  • Как найти диапазон, чтобы увидеть, отсутствует ли диапазон в строке
  • Давайте будем гением компьютера.