2016-11-07 16 views
0

Я получаю эту ошибку в следующей строке кода и не могу понять, почему. Может кто-нибудь объяснить, почему это происходит?Ошибка определения приложения или объекта

Sub Resource_Details() 

    Dim x As Workbook 
    Dim y As Workbook 

    Set x = ThisWorkbook 
    Set y = Workbooks.Open("C:\Users\turnbull\Documents\Global Unmet Demand\3-extract-Resource details.xls") 
    y.Sheets("Sheet1").Range("I:O, AB:AJ").EntireColumn.Delete 
    y.Sheets("Sheet1").Range("OFFSET(Sheet1!A2,0,0,COUNT(Sheet1!$A:$A),44)").Copy 
    x.Sheets("Resource Details").Range("A2").PasteSpecial xlValues 

    End Sub 

Ошибка в этой строке:

y.Sheets("Sheet1").Range("OFFSET(Sheet1!A2,0,0,COUNT(Sheet1!$A:$A),44)").Copy 

Я использовал эту строку кода на следующий макрос и он работает правильно. Я смущен, почему он работает на одном макросе, а не на другом.

Sub Unmet_Details() 

Dim x As Workbook 
Dim y As Workbook 

Set x = ThisWorkbook 
Set y = Workbooks.Open("C:\Users\turnbull\Documents\Global Unmet Demand\2-extract-Unmet details.xls") 
x.Activate 
Sheets("Unmet Details").Activate 
Range("Table2").Select 
Selection.Delete 
y.Activate 
AutoFilterMode = False 
Range("A1:AR1").AutoFilter 
Range("A1:AR1").AutoFilter Field:=8, Criteria1:=Array("Fulfilled", "Requested", "Partially Assigned", "Soft Booked", "Assigned"), Operator:=xlFilterValues 
y.Sheets("Sheet1").Range("OFFSET(Sheet1!$A$2,0,0,COUNT(Sheet1!$A:$A),44)").Copy 
x.Sheets("Unmet Details").Range("A2").PasteSpecial xlValues 
+1

'' OFFSET (Sheet1! A2,0,0, COUNT (Sheet1! $ A: $ A), 44) «' это не название диапазона, поэтому вы не можете его подавать в «Range». Вы можете попробовать 'Application.Evaluate (« OFFSET (Sheet1! A2,0,0, COUNT (Sheet1! $ A: $ A), 44) »), которые * могут * делать то, что вы хотите. Вы также можете попробовать 'Application.WorkSheetFunction.Offset()'. Лучшим подходом было бы исключить 'Offset()' полностью и использовать VBA, чтобы напрямую найти нужную ячейку. –

+0

Используйте VBA для определения диапазона на рабочем листе ** y ** - вместо того, чтобы пытаться использовать функции листа. 'Range.End (xlDown)' может помочь – CallumDA

+0

Спасибо за ваши комментарии. Я требую, чтобы он копировал все ячейки из одного листа в другой, но диапазон будет меняться каждый раз. Вот почему я использовал офсет, это не лучший подход? –

ответ

1

Это один способ пойти об этом (обратите внимание, что это не тестировалось)

Заменить:

y.Sheets("Sheet1").Range("OFFSET(Sheet1!A2,0,0,COUNT(Sheet1!$A:$A),44)").Copy 

С

y.Worksheets("Sheet1").Range("A1").Resize(WorksheetFunction.COUNTA(y.Worksheets("Sheet1").Range("A:A")),44).Offset(0,0) 

и использовать функцию сдвига в конце изменить диапазон в каждом цикле, если это то, что вам нужно (я собираюсь из вашего комментария ...). Вам понадобится цикл, хотя ваш код выше не имеет.

+0

Благодарим вас, этот код дает ошибку «Недействительный или неквалифицированный справочник» в разделе .Range –

+0

Ah yes - теперь он должен быть исправлен – CallumDA

+0

Теперь он дает «недопустимый квалификатор» на .count Также см. Мое последнее изменение в сообщение :) –