Ваша ошибка:
Range(rngAddress, rngAddress.End(xlDown)).Select
Выбирается от верхней части столбца до чуть выше первой пустой ячейки.Вставка сдвигает эту часть колонки вправо, оставляя остальную часть там, где она есть.При повторном выборе вы, вероятно, получите больший диапазон, потому что вы смешали два столбца.Копирование завершается неудачно, потому что вы затем пытаетесь скопировать значения поверх значений.
Если это не имеет смысла, прокрутите макрос с помощью F8 и посмотрите, что происходит на каждом шаге.
Когда вы поймете, почему ваш текущий макрос не работает, попробуйте следующее:
Sub Macro5()
Dim rngAddress As Range
Dim ColToBeCopied As Integer
Set rngAddress = Range("A1:Z1").Find("'product_name")
If rngAddress Is Nothing Then
MsgBox "The product_name column was not found."
Exit Sub
End If
ColToBeCopied = rngAddress.Column
Columns(ColToBeCopied).EntireColumn.Insert
Columns(ColToBeCopied + 1).Copy Destination:=Columns(ColToBeCopied)
End Sub
Примечание:
- Я ничего не выбрал.
- Я оставилкод, работающий на активном листе, но лучше использовать
With Sheets("XXX")
... End With
.
Ответ на второй вопрос
Макросрекордер не умеет показывать, как систематически обращаться к отдельным ячейкам.
With Sheets("xxxx")
.Cells(RowNum,ColNum).Value = "product_name 1"
End With
Выше указано With
, которое я рекомендую.Обратите внимание на точку перед ячейками.
Нижеследующая точка действует на активный лист.
Cells(RowNum,ColNum).Value = "product_name 1"
RowNum должен быть числом.ColNum может быть числом (скажем, 5) или буквой (скажем, «E»).
В вашем случае RowNum равен 1, а ColNum равен ColToBeCopied и ColToBeCopied + 1.
PS
Я забыл упомянуть, что для поиска нижнего ряда столбцов используйте:
RowLast = Range(Rows.Count, ColNum).End(xlUp).Row
Это движение вверх снизу, а не сверху вниз.
PS 2
Чтобы указать диапазон с помощью ячеек:
.Range(.Cells(Top,Left),.Cells(Bottom,Right))
Точки должны совпадать: все три или ни одного.