Здравствуйте. Нужна Ваша помощь, вообщем я нашел макрос в интернете который копирует данные из закрытой книги, но он получается копирует диапазон, а мне надо, чтобы копировал нужные мне ячейки ("A3","C5","H4", G8"). Вот ссылка на макрос КАК ПОЛУЧИТЬ ДАННЫЕ ИЗ ЗАКРЫТОЙ КНИГИ. Я его не много переделал, вот что получилось:
Код
Sub Копировать_ИЗ()
Dim sShName As String, sAddress As String, vData
Dim objCloseBook As Object
'Отключаем обновление экрана
Application.ScreenUpdating = False
Set objCloseBook = GetObject("D:\Сюда.xlsm")
vData = objCloseBook.Sheets("Поиск").Range("A3","C5","H4", "G8").Value
objCloseBook.Close False
If IsArray(vData) Then
Sheets("Лист1").Range("A3","C5","H4", "G8").Resize(UBound(vData, 1), UBound(vData, 2)).Value = vData
Else
Sheets("Поиск").Range("A3","C5","H4", G8") = vData
End If
Application.ScreenUpdating = True
End Sub
Но когда я прописываю в макросе вот так:
Код
.Range("A3","C5")
то он копирует, а когда так:
Код
.Range("A3","C5","H4", "G8")
То выдает ошибку. Где мне прописать нужное количество ячеек, для копирования???
Sub Копировать_ИЗ()
Dim sShName As String, sAddress As String, vData
Dim objCloseBook As Object
'Отключаем обновление экрана
Application.ScreenUpdating = False
Set objCloseBook = GetObject("D:\Сюда.xlsm")
vData = objCloseBook.Sheets("Поиск").Range("A3", "C5", "H4", "G8").Value
objCloseBook.Close False
If IsArray(vData) Then
Sheets("Лист1").Range("A3", "C5", "H4", "G8").Resize(UBound(vData, 1), UBound(vData, 2)).Value = vData
Else
Sheets("Поиск").Range("A3", "C5", "H4", "G8") = vData
End If
Application.ScreenUpdating = True
End Sub
Sub Get_Value_From_Close_Book2()
Dim sShName As String, sAddress As String, vData
Dim objCloseBook As Object
'Отключаем обновление экрана
Application.ScreenUpdating = False
Set objCloseBook = GetObject("C:\Documents and Settings\Книга1.xls")
sAddress = "A1:C100" 'или одна ячейка - "A1"
'получаем значение
vData = objCloseBook.Sheets("Лист1").Range(sAddress).Value
objCloseBook.Close False
'Записываем данные на активный лист книги,
'с которой запустили макрос
If IsArray(vData) Then
[A1].Resize(UBound(vData, 1), UBound(vData, 2)).Value = vData
Else
[A1] = vData
End If
'если надо копировать ячейки с форматами,
'то можно использовать стандартные методы копирования вставки
'objCloseBook.Sheets("Лист1").Range(sAddress).Copy
'[A1].PasteSpecial xlPasteValues 'вставляем значения
'[A1].PasteSpecial xlPasteFormats 'вставляем форматы
'Включаем обновление экрана
Application.ScreenUpdating = True
End Sub
так нельзя, потому что невозможно применить эту команду к несвязанным диапазонам. Хоть из закрытой книги, хоть из открытой. Надо переносить их поячеечно.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
не применимо для несвязанных диапазонов. В случае, когда диапазон имеет 2 ячейки, он преобразуется в непрерывный диапазон с адресом, ограниченным этими ячейками
Вам помогли: подсказали что надо сделать, чтобы заработало. У Вас это видимо не получилось, а здесь никто не обязан писать Вам код под конкретно Вашу задачу. По сути надо просто сделать цикличный перенос информации из каждой ячейки отдельно(о чем я упоминал уже). При этом Вам правильно написали, что быстрее будет забирать данные ссылками(в статье по Вашей ссылке этот метод описан). Но раз хочется именно путем открытия книги, то делайте так:
Код
Sub Get_Value_From_Close_Book2()
Dim sShName As String, vData
Dim objCloseBook As Object
'Отключаем обновление экрана
Application.ScreenUpdating = False
Set objCloseBook = GetObject("C:\Documents and Settings\Книга1.xls")
Dim x
For each x in array("A3","C5","H4", "G8")
'Записываем данные на активный лист книги,
'с которой запустили макрос
Range(x).Value = objCloseBook.Sheets("Лист1").Range(x).Value
Next
objCloseBook.Close False
'Включаем обновление экрана
Application.ScreenUpdating = True
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Т.е. Вы пример приложили от балды? У Вас в примере ячейки для вставки те же, что и для копирования. Код основан на этом. Если надо вставлять в какие-то другие ячейки и коды сами подправить не можете - будьте любезны озвучить в какие именно ячейки, являются ли они постоянными и т.д. А то в примере кода одно указываете, а в качестве решения что-то другое ждете...
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Sub Get_Value_From_Close_Book2()
Dim sShName As String, vData
Dim objCloseBook As Object
Dim aCopy, aPaste,lr&
aCopy = array("A3","C5","H4", "G8") 'кол-во ячеек должно быть равно кол-ву в aPaste
aPaste = array("A8","C8","H8", "G16") 'кол-во ячеек должно быть равно кол-ву в aCopy
'Отключаем обновление экрана
Application.ScreenUpdating = False
Set objCloseBook = GetObject("C:\Documents and Settings\Книга1.xls")
For lr = lbound(aCopy) to ubound(aCopy)
'Записываем данные на активный лист книги,
'с которой запустили макрос
Range(aCopy(lr)).Value = objCloseBook.Sheets("Лист1").Range(aPaste(lr)).Value
Next
objCloseBook.Close False
'Включаем обновление экрана
Application.ScreenUpdating = True
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...