2013-12-17 7 views
1

У меня возникли проблемы с назначением значений из одного диапазона рабочей книги в диапазон в моей текущей книге. Когда я назначаю свой диапазон с помощью Range («A1: C1»), этот код работает нормально, однако, когда мой диапазон определен с использованием Range (Cells (1,1), Cells (1,3)), функция не работает:VBA Excel: присвоение значений диапазона новому диапазону

Sub CopyRange() 
    Dim inputExcel As Excel.Application, BookA As Workbook 
    Path_A = ThisWorkbook.Path & "\Book_A.xlsx" 
    Set inputExcel = New Excel.Application 
    Set BookA = inputExcel.Workbooks.Open(Path_A, ReadOnly:=True) 

    'THIS WORKS: 
    ThisWorkbook.Sheets(1).Range("A1:C1").Value = _ 
    BookA.Sheets(1).Range("A1:C1").Value 

    'THIS DOESN'T WORK: 
    ThisWorkbook.Sheets(1).Range(Cells(1, 1), Cells(1, 3)).Value = _ 
    BookA.Sheets(1).Range(Cells(1, 1), Cells(1, 3)).Value 
End Sub 

Я знаю, что это должна быть простая проблема синтаксиса, но я не смог понять это. Как я могу получить задания Range с использованием «Ячейки»?

ответ

5

ты должен квалифицировать Cells вызовы с объектом рабочего листа тоже:

ThisWorkbook.Sheets(1).Range(ThisWorkbook.Sheets(1).Cells(1, 1), ThisWorkbook.Sheets(1).Cells(1, 3)).Value = _ 
    BookA.Sheets(1).Range(BookA.Sheets(1).Cells(1, 1), BookA.Sheets(1).Cells(1, 3)).Value 

для смежных диапазонов, как, что вы также можете использовать Изменить размер:

ThisWorkbook.Sheets(1).Cells(1, 1).Resize(, 3).Value = _ 
     BookA.Sheets(1).Cells(1, 1).Resize(, 3).Value 
+0

Нет у вас нет, и это не решает проблему, так как в любом случае 'Sheet1.Cells (1,1) 'оценивает строку *, а не объект адреса или диапазона. :) –

+0

да, так и нет, попробуйте и посмотрите :-) Это довольно стандартный метод. – JosieP

+0

Ваш второй метод должен работать, я думаю. Но первый метод: для меня возникает 1004: 'Sheet2.Range (Sheet2.Cells (1, 1)). Value = Sheet1.Range (Sheet1.Cells (1, 1)). Значение« –

1

Я думаю, что в конечном счете, вы собираетесь об это не лучший способ решить проблему. У вас есть object.object.object.object нотации в вашем коде, что громоздко и трудно интерпретировать и исправлять.

Если определить еще несколько переменных, то код будет проще, чтобы диагностировать и решить проблему:

Dim myAddr as String 'A string to represent the Address of the range 
myAddr = Cells(1,1).Address & ":" & Cells(1,3).Address 

ThisWorkbook.Sheets(1).Range(myAddr).Value = BookA.Sheets(1).Range(myAddr).Value 
+0

Хотя я уверен, что ваш ответ будет работать, я не уверен, согласен ли я с замечанием. При отладке больших проектов VBA я обычно предпочитаю использовать пространства имен во всех операторах, чтобы избежать путаницы в отношении текущего объекта. Особенно при работе с перекрестными книгами или кросс-приложениями это уменьшит количество ошибок и на самом деле будет легче отлаживать их. – Trace

+1

@ KimGysen в реальном мире Я использую блоки «С» и определяю, где это необходимо, переменные объекта (например, «Установить rng1 = ThisWorkbook.Sheets (1) .Range (« A1: A50 ») и т. Д.), И я использую Окно 'Locals' для помощи в отладке. Но, YMMV. :) –

Смежные вопросы