Копирование и вставка с использованием массива в VBA - PullRequest
0 голосов
/ 27 июня 2011

Я пытаюсь создать относительно простую процедуру копирования и вставки.У меня есть определенные адреса ячеек, хранящиеся в массиве (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

Ответы [ 2 ]

1 голос
/ 27 июня 2011

Несколько возможных причин здесь:

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

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

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

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

Dim NextRow as Range на ваш суб

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

EDIT

на основе вашего редактирования ошибка "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 перед For и

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

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

EDIT2

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

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

Set NextRow = _
    shSearchResults.Cells(shSearchResults.Rows.Count, 4).End(xlUp).Offset(1, -3)
0 голосов
/ 27 июня 2011

Вы никогда не используете оператор 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...