Excel Macro дает ошибку при вставке

Я пытаюсь создать макрос excel, который, вероятно, будет в конечном итоге довольно большим, чтобы упростить работу, я немного решусь по этому поводу. До сих пор я …

Sub Macro4() ' ' Test Macro ' 'Selects the product_name column by header name Dim rngAddress As Range 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 Range(rngAddress, rngAddress.End(xlDown)).Select 'Inserts new column to the left of the product_name column Selection.Insert Shift:=xlToRight 'Re-selects the product_name column Range(rngAddress, rngAddress.End(xlDown)).Select 'Copys the contents of the product_name column Selection.Copy Selection.Paste End Sub 

Я хочу, чтобы он сделал следующее.

  • Поиск в электронной таблице для имени заголовка 'product_name'
  • Вставьте пустой столбец слева от столбца 'product_name'
  • Скопировать содержимое столбца «product_name»
  • Вставьте их во вновь созданный пустой столбец
  • Измените имя заголовка в этом новом столбце на 'product_name_2'

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

 'Run-time error '438'; - Object doesn't support this property or method' 

Может кто подскажет, где я иду не так?

Ваша ошибка:

 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 

Заметка:

  1. Я ничего не выбрал.
  2. Я оставил код, действующий на активном листе, но лучше использовать 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

Я забыл упомянуть, что найти столбец botton колонки:

 RowLast = Range(Rows.Count, ColNum).End(xlUp).Row 

Это движение вверху вниз, а не сверху.

PS 2

Чтобы указать диапазон, используя ячейки:

 .Range(.Cells(Top,Left),.Cells(Bottom,Right)) 

Точки должны совпадать: все три или ни один.

Я не уверен, где вы пытаетесь копировать, но когда вы хотите вставить, вам нужно сделать выбор, а затем
ActiveSheet.Paste
Например:

/ваш код/
Selection.Copy

Диапазон. ( "O: O") Выберите
ActiveSheet.Paste

Я бы вообще не хотел копировать / вставлять, если вы хотите только передавать значения.

Например, вместо:

 Range("B1:B100").Copy Destination:=Range("A1") 

Я хотел бы использовать:

 Range("A1:A100").Value = Range("B1:B100").Value 

Если бы мы заменили это на ваш код и включили некоторые комментарии, сделанные Тони:

 Sub Macro4() Dim colFound As Integer Dim rowLast As Long Const rowSearch As Integer = 1 'Find the product_name column colFound = Rows(rowSearch).Find("product_name").Column If colFound = 0 Then MsgBox "The product_name column was not found." Exit Sub End If 'Find the last non-empty row rowLast = Cells(Rows.Count, colFound).End(xlUp).Row 'Inserts new column to the left of the product_name column Columns(colFound).EntireColumn.Insert 'Transfer the contents of the product_name column to the newly inserted one Range(Cells(rowSearch, colFound), Cells(rowLast, colFound)).Value = _ Range(Cells(rowSearch, colFound + 1), Cells(rowLast, colFound + 1)).Value 'Rename the new column Cells(rowSearch, colFound).Value = Cells(rowSearch, colFound).Value & "_2" End Sub 
Interesting Posts

Подтвердить в excel перед загрузкой для доступа

Excel: подавить, если ячейка выше имеет такое же значение?

Excel – поиск слова в столбце A. Когда совпадение найдено в строке, сообщите слово, которое находится в столбце B, затем найдите столбец A для любых сообщенных слов

Экспорт данных из Excel в Word, пока функция

База данных текстовых файлов SQL с поддержкой VBA Excel

xls-to-json не работает в Node.js

Изменение ссылки в рабочей книге программно

Как использовать ячейку Excel внутри SQL-запроса с помощью PowerShell?

Чтение и запись данных для Excel с помощью POI – Удаление исходных данных из Excel после записи новых данных

Генерировать случайное время с учетом условия

Как эффективно ранжировать очень длинный столбец в Excel

Файлы docx и xlsx не загружаются с использованием HttpUrlConnection.getInputStream и FileUtils.copyInputStreamToFile

Ошибка EXCEL VBA: «Ошибка компиляции: ожидаемый массив»

Как протестировать метод контроллера, который возвращает файл .xls с помощью sprint-test-mvc

Добавление текста в текстовое поле

Давайте будем гением компьютера.