Ошибка времени выполнения «1004» при использовании полностью определенных ячеек в объекте диапазона - PullRequest
1 голос
/ 29 октября 2019

Я пытаюсь скопировать значения из одной рабочей книги и вставить их в другую, используя свойство ячейки объекта диапазона. Как правильно указать ссылки на диапазон, чтобы я не получал сообщение об ошибке «1004»?

Я работаю в Excel 2013 и запускаю код в книге «Практика» с активной рабочей таблицей.

Я исследовал много подобных проблем, как эта, Ошибка времени выполнения 1004 в Range (Cells ()) , но они мне не помогли. Я убедился, что мои ссылки полностью уточнены.

Sub Transfer()

    Dim wsCopy As Worksheet
    Dim wsDest As Worksheet

    Set wsCopy = Workbooks("Practicebook2").Worksheets("Sheet1")
    Set wsDest = Workbooks("Practicebook").ActiveSheet
    wsCopy.Range(wsCopy.Cells(2,8)).Copy
    wsDest.Range("J5").PasteSpecial

End Sub

Когда я запускаю код, появляется сообщение об ошибке «Метод« Диапазон »объекта». выделено отладчиком. При изменении ссылки на нотацию в стиле A1 код выдает вставленное значение в лист назначения, как и ожидалось.

Ответы [ 2 ]

3 голосов
/ 29 октября 2019

Range ожидает, что строка или ДВЕ ячейки определят диапазон.

С помощью только одной КЛЕТКИ удалите ДИАПАЗОН:

wsCopy.Cells(2,8).Copy

При использовании двух ячеек это будет примерно так:

wsCopy.Range(wsCopy.Cells(2,8),wsCopy.Cells(4,10)).Copy

Если вместо этого у вас есть желаемый диапазон в виде строки в ячейке, нужно добавить .Value к Cells()

wsCopy.Range(wsCopy.Cells(2,8).Value).Copy

Теперь он примет значениев этой ячейке в виде строки передайте ее в Range.

Также пропустите двойные строки:

wsCopy.Cells(2,8).Copy wsDest.Range("J5")

Копирование принимает аргумент назначения.

1 голос
/ 29 октября 2019

Две вещи, которые вы можете учитывать при работе с диапазонами:

1 - Вы можете ссылаться на листы по их кодовым именам, и это предотвращает ошибку, если кто-то меняет их имя в Excel

enter image description here

2 - Вам не нужно использовать ячейки внутри диапазона. Таким образом, код может выглядеть так:

Sub Transfer()

    'Dim wsCopy As Worksheet -> Don't need this if you refer to the sheet with it's codename
    Dim wsDest As Worksheet

    'Set wsCopy = ThisWorkbook.Worksheets("Sheet1")  -> Don't need this if you refer to the sheet with it's codename
    Set wsDest = ThisWorkbook.ActiveSheet
    Sheet1.Cells(2, 8).Copy wsDest.Range("J5") ' -> Refer directly to source sheet codename

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