VBA Range

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Gogic
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 24.08.2008 (Вс) 13:19

VBA Range

Сообщение Gogic » 15.02.2011 (Вт) 14:25

Доброго времени суток.
Необходимо скопировать область данных из одной книги в другую, но получаю ошибку следующего плана:
1004 Метод Copy из класса Range завершен неверно.
Скопировать нужно полностью область с форматированием внутри, итд. Внутри Range попадаются объединенные ячейки, то есть через Cells здесь видимо не вариант.
Код следующий:

Код: Выделить всё
FPath = txtPath01.Text
objExcel.Application.Workbooks.Open FPath
objExcel2.Application.Workbooks.Open App.Path & "\template-hat.xls"
    objExcel.Worksheets(1).Range("A2:H16").Copy objExcel2.Worksheets(1).Range("A7")
objExcel.Application.Workbooks.Close
objExcel2.Application.Workbooks.Close


В чем может быть дело?

З.Ы. Пишу не в раздел VBA, потому что работаю из VB6.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: VBA Range

Сообщение alibek » 15.02.2011 (Вт) 15:46

А вручную эти области копируются?
Думаю, что нет.
Lasciate ogni speranza, voi ch'entrate.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: VBA Range

Сообщение Денис » 15.02.2011 (Вт) 16:31

есть еще один полезный совет.
полагаю, что objExcel создается из GetObject?
А если написать тот же код в виде VBA-скрипта (вот тут уместно называть код скриптом) внутри экселя? Тогда, во первых будет работать Intellsence для методов объекта, во вторых будет более подробный вывод ошибок.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Gogic
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 24.08.2008 (Вс) 13:19

Re: VBA Range

Сообщение Gogic » 15.02.2011 (Вт) 16:49

А вручную эти области копируются?


Да.

полагаю, что objExcel создается из GetObject?


Код: Выделить всё
Dim objExcel As New Excel.Application


Excel подключен в References.

А если написать тот же код в виде VBA-скрипта (вот тут уместно называть код скриптом) внутри экселя? Тогда, во первых будет работать Intellsence для методов объекта, во вторых будет более подробный вывод ошибок.


Не думаю, что это что-то кардинально изменит.

anvg
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 20.05.2007 (Вс) 18:04

Re: VBA Range

Сообщение anvg » 16.02.2011 (Ср) 10:23

Код: Выделить всё
Public Sub testCopy()
    Dim xls As New Excel.Application, pSheet As Worksheet
    Dim pSBook As Excel.Workbook, pDBook As Excel.Workbook
   
    Set pSBook = xls.Workbooks.Open("d:\path\source.xls")
    Set pSheet = pSBook.Worksheets(1)
    Set pDBook = xls.Workbooks.Open("d:\path\dest.xls")
    pSheet.Range("A1:C18").Copy pDBook.Worksheets(1).Range("A20")
    xls.Visible = True
End Sub

В VBA работает такой код. Будет работать и VB6. Если не секрет - зачем создавать два экземпляра Excel.Application?

Gogic
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 24.08.2008 (Вс) 13:19

Re: VBA Range

Сообщение Gogic » 16.02.2011 (Ср) 16:48

В VBA работает такой код. Будет работать и VB6.


Вы похоже не уловили суть вопроса. И мой код будет работать и в VBA, и VB6. Дело в том, что он не будет работать с конкретными файлами, собственно. как и Ваш.
Потому что Ваш ничем не отличается.

Если не секрет - зачем создавать два экземпляра Excel.Application?


Не суть...

Alec
Бывалый
Бывалый
 
Сообщения: 275
Зарегистрирован: 31.08.2008 (Вс) 0:15
Откуда: Ростов-на-Дону

Re: VBA Range

Сообщение Alec » 16.02.2011 (Ср) 22:58

Gogic писал(а):
Если не секрет - зачем создавать два экземпляра Excel.Application?


Не суть...

По-ходу, именно в этом и суть (и проблема).

Справка Microsoft Visual Basic писал(а):Copy method as it applies to the Range object.

Copies the range to the specified range or to the Clipboard.

expression.Copy(Destination)

expression Required. An expression that returns a Range object.

Destination Optional Variant. Specifies the new range to which the specified range will be copied. If this argument is omitted, Microsoft Excel copies the range to the Clipboard.


Т.е. копирует или в указанный диапазон, или в буфер обмена.
Ты пытаешься копировать в диапазон в другой книге, открытой в другом экземпляре Excel, без использования буфера обмена, что, ИМХО, создателями и не планировалось. Сравни, например, специальную вставку в одном и том же экземпляре Excel и в разных.
Попробуй свой кусок кода изменить на:
Код: Выделить всё
FPath = txtPath01.Text
objExcel.Application.Workbooks.Open FPath
objExcel.Application.Workbooks.Open App.Path & "\template-hat.xls"
    objExcel.Worksheets(1).Range("A2:H16").Copy objExcel.Worksheets(2).Range("A7")
objExcel.Application.Workbooks.Close

Иногда лучше вовремя остановиться...
И начать заново!

Gogic
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 24.08.2008 (Вс) 13:19

Re: VBA Range

Сообщение Gogic » 19.02.2011 (Сб) 21:18

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

В конце концов сделал через буфер.

Код: Выделить всё
FPath = txtPath01.Text
objExcel.Application.Workbooks.Open FPath
objExcel2.Application.Workbooks.Open App.Path & "\template-hat.xls"
    objExcel.Worksheets(1).Range("B2:H11").Copy
    objExcel2.Worksheets(1).Range("A7").PasteSpecial xlPasteValues
objExcel.Application.Workbooks.Close
objExcel2.Application.Workbooks.Close


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 48

    TopList  
cron