Копирование и вставка с использованием массива в VBA

Я пытаюсь создать относительно простую процедуру копирования и вставки. У меня есть определенные адреса ячеек, хранящиеся в массиве (Results1 ()), и я пытаюсь экстраполировать строку, в которой он находится, чтобы скопировать всю строку данных в другой лист Excel. У меня есть следующее до сих пор, и в настоящее время я получаю ошибку, требуемую объектом, когда я пытаюсь определить, что такое мой «NextRow». Любые советы или отзывы будут очень благодарны!

For i1 = LBound(Results1) To UBound(Results1) Set NextRow = Worksheets("searchresult").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) Range(Results(i1)).EntireRow.Copy NextRow Next i1 

Отредактированный код

  For i1 = LBound(Results1) To UBound(Results1) Worksheets("properties").Select Set p1results = Range(Results1(i1)) p1results.EntireRow.Copy With Worksheets("SearchResult").Select NextRow = Range("D65536").End(xlUp).Row + 1 Cells(NextRow, 1).Select ActiveSheet.Paste End With Next i1 

Обновление: на самом деле мои диапазоны данных варьируются от столбцов D: P, поэтому, когда я подсчитываю строки, я рассчитываю из столбца D (4), потому что столбцы AC являются пустыми диапазонами. Это повлияет на то, как он вставляет мои данные?

  On Error Resume Next For i1 = LBound(Results1) To UBound(Results1) Set NextRow = shSearchResult.Cells(shSearchResult.Rows.Count, 4).End(xlUp).Offset(1, 0) shProperties.Range(Results1(i1)).EntireRow.Copy NextRow If Err.Number <> 0 Then Err.Clear MsgBox "Bad address" & Results1(i1) End If Next i1 

Несколько потенциальных причин здесь:

Ваши ссылки на цикл Результаты1, но ваши ссылки на копии Результаты (опечатка в вопросе или причина маршрута?)

В ваших Set NextRow = .Cells(Rows.Count, unqualified, строки ссылаются на активный лист, а не на лист "searchresult" . Вероятно, это не то, что вы намеревались, но также не будет иметь разницы в этом случае.

Аналогично Range(Results(i1)) относится к активному листу, может быть в порядке – зависит от более широкого контекста вашей заявки

Я подозреваю, что ваша проблема заключается в том, что NextRow не был DIM 'd. Попробуйте добавить

Dim NextRow as Range для вашего Sub

В общем, хорошей практикой является использование Option Explicit (первая строка в вашем модуле). Это заставляет явное объявление всей переменной.

РЕДАКТИРОВАТЬ

на основе вашего редактирования "Method 'Range' of object '_Global' failed" Ошибка может быть вызвана "Method 'Range' of object '_Global' failed" строкой адреса

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

 Sub zxx() Dim Results1(0 To 1) As Variant Dim i1 As Long Dim NextRow As Range Dim shProperties As Worksheet Dim shSearchResults As Worksheet ' other code ... Set shSearchResults = ActiveWorkbook.Worksheets("searchresult") Set shProperties = ActiveWorkbook.Worksheets("properties") On Error Resume Next For i1 = LBound(Results1) To UBound(Results1) Set NextRow = shSearchResults.Cells(shSearchResults.Rows.Count, 1).End(xlUp).Offset(1, 0) shProperties.Range(Results1(i1)).EntireRow.Copy NextRow Next i1 End Sub 

Чтобы обнаружить плохие адреса, попробуйте добавить в поле « On Error Resume Next до

  If Err.Number <> 0 Then Err.Clear MsgBox "Bad Address " & Results1(i1) End If 

после копии (внутри цикла for)

EDIT2

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

Используйте это для смещения назад к столбцу A

 Set NextRow = _ shSearchResults.Cells(shSearchResults.Rows.Count, 4).End(xlUp).Offset(1, -3) 

Вы никогда не используете инструкцию With, поэтому просто сделайте это вместо этого:

 For i1 = LBound(Results1) To UBound(Results1) Worksheets("properties").Select Set p1results = Range(Results1(i1)) p1results.EntireRow.Copy Worksheets("SearchResult").Select NextRow = Range("D65536").End(xlUp).Row + 1 Cells(NextRow, 1).Select ActiveSheet.Paste Next i1 

или лучше:

 For i1 = LBound(Results1) To UBound(Results1) Worksheets("properties").Range(Results1(i1)).EntireRow.Copy Worksheets("SearchResult").Cells(Range("D65536").End(xlUp).Row + 1, 1).Paste Next i1 

В зависимости от того, что вы делаете, вместо этого вы можете использовать PasteSpecial.

  • Скопируйте несколько гиперссылок с текстом привязки в Excel
  • Скопировать вставку из одной книги в другую
  • Исправление ошибок: скопированные изображения в Excel VBA отображаются как пустые изображения
  • ВставитьСпециальные только значения
  • Вставить выходы Python (0,25, 0,78, 0,33, ...) в ячейки Excel
  • C # не находит пространство в строке, скопированной из Excel
  • Скопировать и вставить VBA с переменными и неизвестным местоположением
  • Excel скопирует все значения из листа 1 и 2, выделенные / желтые на лист 3
  • Удалить возможные отношения объектов внутри изображений? Попытка xlCopy с ограничениями памяти
  • VBA преуспеть, чтобы скопировать формулу с листа и вставить в несколько листов
  • Метод CopyPicture класса диапазона не удался - иногда
  • Давайте будем гением компьютера.