1

Этот блок кода продолжает получать ошибку времени выполнения 1004. Я пытаюсь скопировать небольшие блоки информации с одного листа на другой, если имена начинающих столбцов совпадают.

For a = 8 To 17
    For b = 7 To 21
        If Sheets("Sheet1").Cells(a, 2).Value = Sheets("Sheet2").Cells(b, 1).Value Then
            Sheets("Sheet2").Range(Cells(b, 1), Cells(b, 7)).Copy Sheets("Sheet1").Cells(a, 6)
        End If
    Next b
Next a

Как я могу отладить мой код?

3 ответа3

1

Короче, что-то не так с линией

Sheets("Sheet2").Range(Cells(b, 1), Cells(b, 7)).Copy Sheets("Sheet1").Cells(a, 6)

измените его на ниже, это должно решить вашу проблему.

Sheets("Sheet2").Range(Sheets("Sheet2").Cells(b, 1), Sheets("Sheet2").Cells(b, 7)).Copy Sheets("Sheet1").Cells(a, 6)

Как я отлаживал:

Когда ваш код запущен, нажмите "Отладка", когда появится ошибка 1004 времени выполнения. 4-я строка выделена желтым цветом (т. Е. VBA обнаруживает ошибку при выполнении этой строки). Так вот с чего мы начнем.

Чтобы устранить проблему, мы можем навести курсор на различные переменные, чтобы посмотреть на ее значение. b = 7, a = 8, кажется, хорошо.

Удаление параметров для функции Copy , оставляя только все перед .Copy ... проблема все еще там. Так что должно быть что-то не так с

Sheets("Sheet2").Range(Cells(b, 1), Cells(b, 7)).Copy

Глядя на помощь по .Range и обратите внимание, что вам нужно указать Sheet . И проблема исправлена.

0

У меня есть тестирование различных решений. И, прочитав документацию и проверив ее на своем компьютере, я вспомнил, что:

  • По умолчанию Excel VBA передает аргументы по ссылке.
  • Ячейки инициализируются один раз> только один экземпляр

Или, у вас решение Cells вызывается несколько раз в одной и той же процедуре! Вы передаете значение дважды в диапазоне с одним экземпляром по ссылке. Диапазон получает один и тот же экземпляр объекта дважды> Результат недействителен.

Вы можете принудительно передать ByVal с включающими параметрами (). Это то же самое, когда вы использовали ключ WITH

Код MIME:

    Dim shSrc as Excel.Worksheet, shDst as Excel.Worksheet

    Set shSrc = Sheets("Sheet1")
    Set shDst = Sheets("Sheet2")

    'copy
    With shSrc
        .Range((.Cells(1, 1)), (.Cells(1, 7))).Copy
    End With

    'special paste need same range (number of rows and colums)
    With shDst
        .Range((.Cells(1, 1)), (.Cells(1, 7))).PasteSpecial xlPasteValues
    End With
0

Убедитесь, что ни один лист не защищен (не только диапазон, который вы копируете, но и весь лист).

Кроме того, как это называется? Какова полная функция, и это в Sheet1, ThisWorkbook или отдельный модуль? Какая строка выдает ошибку?

Попробуйте объявить каждый объект отдельно и посмотрите, сможете ли вы определить, какой шаг не удался.

Dim src as Excel.Range
Set src = Sheets("Sheet1").Cells(a, 2)
Dim dst as Excel.Range
Set dst = Sheets("Sheet2").Cells(b, 1)
If src.Value = dst.Value Then
  Dim src2 as Excel.Range
  Set src2 = Sheets("Sheet2").Range(Cells(b, 1), Cells(b, 7))
  Dim dst2 as Excel.Range
  Set dst2 = Sheets("Sheet1").Cells(a, 6)
src2.Copy dst2
End If

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .