Ошибка времени выполнения «1004» при попытке скопировать диапазон (Excel VBA) - PullRequest
1 голос
/ 07 декабря 2010

Я пытаюсь скопировать диапазон ячеек, для которых я не знаю последнюю строку и столбец (хотя я могу легко добраться до тех, которые используют переменные). К сожалению, хотя я пытаюсь сослаться на диапазон, я получаю ошибку времени выполнения 1004 (ошибка приложения или объекта), когда я использую переменные, и я не могу понять, почему. Ниже приведен пример кода:

Dim wkbk As Workbook
Dim copy_rng As Range
...
Set copy_rng = wkbk.Worksheets("Payable").Range("A1:Y3500")
Set copy_rng = wkbk.Worksheets("Payable").Range(Cells(1, 1), Cells(last_row_pay, last_col_pay))

Первый оператор Set - просто пример, и он отлично работает (поэтому я знаю, что wkbk определен правильно и находит лист «Payable»). Кто-нибудь знает, почему второе утверждение Set не будет работать? Есть ли проблема с синтаксисом? (Во время отладки, если я наведу курсор на переменные last_row_pay и last_col_pay, я увижу действительные значения - 1533 и 25 соответственно.) Спасибо за любую помощь.

Ответы [ 4 ]

4 голосов
/ 07 декабря 2010

Используйте функцию изменения размера, потому что функция Cells() работает для активного листа и может запутаться.

Dim wkbk As Workbook
Dim copy_rng As Range 
Dim pay_rows As Integer ,pay_columns As Integer
... 
pay_rows = 3500
pay_columns = 23
Set copy_rng = wkbk.Worksheets("Payable").Range("A1").Resize(pay_rows,pay_columns)

где A1 - верхняя левая ячейка ваших данных.

0 голосов
/ 12 декабря 2013

У меня были такие же проблемы. Вам необходимо указать как ячейку, так и свойства диапазона.

Set copy_rng = wkbk.Worksheets("Payable").Range(Cells(1, 1), wkbk.Sheets("Payable").Cells(last_row_pay, last_col_pay))

0 голосов
/ 11 ноября 2013
with Worksheets("Payable")
  copy_rng = .Range(.Cells(1, 1), .Cells(last_row_pay, last_col_pay)).Value
end with

больше строк, но работает ..

0 голосов
/ 08 декабря 2010

Если диапазон, который вы пытаетесь скопировать, представляет собой непрерывный набор ячеек, то я считаю, что самый простой способ получить размер диапазона без жесткого кодирования любого количества строк / столбцов - использовать CurrentRegion

Sub GetCurrentRange

Dim rng as range
Set rng = Worksheets("Payable").Range("A1").CurrentRegion

End Sub

Преимущество здесь в том, что даже если вы добавляете строки / столбцы в ваш набор данных, вам не нужно беспокоиться о разработке новых ограничений на столбцы и строки, поскольку CurrentRegion делает это для вас

Пример:

     A     B     C
 1   10    20    30
 2   40    50    60
 3   70    80    90

Sub GetCurrentRange

Dim rng as range
Set rng = Worksheets("Payable").Range("A1").CurrentRegion

Debug.Print rng.Address //Prints $A$1:$C$3

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