Страницы: 1
RSS
Копирование данных из закрытой книги
 
Здравствуйте уважаемые форумчане!Помогите пожалуйста создать макрос по переносу данных из закрытой книги в текущей папке.Есть файл исходник(книга1) и закрытый файл база(SC33.xlsx)надо сделать так что бы данные из базы копировались в определенные столбцы файла исходника начиная со второй строки базы.Какие столбцы копировать указано в файле книга1.
 
открываете закрытый файл и копируете, потом закрываете  
 
1000раз было
Живи и дай жить..
 
хорошо.если это нереально,возможно ли это сделать макросом который открывал бы книгу копировал,данные а потом закрывал бы ее?
 
Пара цитат:  
 
============================================================­==  
<EM>http://www.programmersforum.ru/showthread.php?s=97d4dcfd4e4aaa13a2146730fef9a4db&t=191322</EM>  
 
В VBA не существует метода получения значения из закрытого файла рабочей  
книги. Однако вы можете воспользоваться возможностью управления ссылками на  
файлы, которая предоставляется в Excel. В настоящем разделе описана функция VBA  
(GetValue, показанная ниже), которая получает значение из закрытой книги.  
Эта задача выполняется в результате вызова макроса XLM.  
Код 1  
 
Private Function GetValue(path, file, sheet, ref)  
Dim arg As String  
If Right(path, 1) <> "\" Then path = path & "\"  
If Dir(path & file) = "" Then  
GetValue = "Файл не найден"  
Exit Function  
End If  
arg = "'" & path & "[" & file & "]" & sheet & "'!" & _
Range(ref).Range("A1").Address(, , xlR1C1)  
GetValue = ExecuteExcel4Macro(arg)  
End Function  
 
Функция GetValue имеет четыре аргумента:  
¦ path – путь к закрытому файлу (например, "d:\files");  
¦ file – название рабочей книги (например, "budget.xls");  
¦ sheet – название рабочего листа (например, "Лист1");  
¦ ref – ссылка на ячейку (например, "C4").  
Следующая процедура демонстрирует, как используется функция GetValue.  
В этой процедуре отображается значение ячейки А1 листа Лист1 файла 99Budget.xls  
(папка XLFiles\Budget на диске c:.  
Код 1  
Sub TestGetValue()  
p = "c:\XLFiles\Budget"  
f = "99Budget.xls"  
s = "Лист1"  
a = "A1"  
MsgBox GetValue(p, f, s, a)  
End Sub  
 
Ниже приведен еще один пример. Эта процедура считывает 1200 значений  
(100 строк и 12 столбцов) из закрытого файла и помещает эти значения на активный  
рабочий лист.  
Код 1  
 
Sub TestGetValue2()  
p = "c:\XLFiles\Budget"  
f = "99Budget.xls"  
s = "Sheet1"  
Application.ScreenUpdating = False  
For r = 1 To 100  
For c = 1 To 12  
a = Cells(r, c).Address  
Cells(r, c) = GetValue(p, f, s, a)  
Next c  
Next r  
Application.ScreenUpdating = True  
End Sub  
   
============================================================­==  
Вот так можно получить значения из закрытой книги:  
 
Dim sFilePath As String, sFileName As String, sSh As String  
Dim sStr As String  
sFilePath = "C:\Temp\"  
sFileName = "Книга1.xls"  
sSh = "Лист1"  
 
With Range("A1:A100")  
.Formula = "='" & sFilePath & "[" & sFileName & "]" & sSh & "'!" & "A1"
.Value = .Value  
End With  
 
'Вот еще один способ:  
sStr = "'" & sFilePath & "[" & sFileName & "]" & sSh & "'!" & Range("A1").Address(ReferenceStyle:=xlR1C1)
Range("A1") = ExecuteExcel4Macro(sStr)  
_______________________
 
Спасибо Prist  
 
Sub Get_Value_From_Close_Book()  
   Dim sShName As String, sAddress As String, vData  
   'Отключаем обновление экрана  
   Application.ScreenUpdating = False  
   Workbooks.Open "C:\Documents and Settings\user\Рабочий стол\SC33.xlsx"  
   sAddress = "A2:A1000" 'или одна ячейка - "A1"  
   'получаем значение  
   vData = Sheets("SC33").Range(sAddress).Value  
   ActiveWorkbook.Close False  
   'Записываем данные на активный лист книги,  
   'с которой запустили макрос  
   If IsArray(vData) Then  
       [A1].Resize(UBound(vData, 1), UBound(vData, 2)).Value = vData
   Else  
       [A1] = vData
   End If  
   'Включаем обновление экрана  
   Application.ScreenUpdating = True  
End Sub  
 
код хороший а как сделать что бы копировались определенные столбцы до последней строки,а не диапазон?
 
sAddress = range("a2",cells(rows.count,1).end(xlup))
Живи и дай жить..
 
ошибка type mismatch
 
Спасибо Hugo за старания!А как мне припаять что нибудь и этого под свою задачу?  
Мне понравился этот код  
 
Sub Get_Value_From_Close_Book()  
Dim sShName As String, sAddress As String, vData  
'Отключаем обновление экрана  
Application.ScreenUpdating = False  
Workbooks.Open "C:\Documents and Settings\user\Рабочий стол\SC33.xlsx"  
sAddress = "A2:A1000" 'или одна ячейка - "A1"  
'получаем значение  
vData = Sheets("SC33").Range(sAddress).Value  
ActiveWorkbook.Close False  
'Записываем данные на активный лист книги,  
'с которой запустили макрос  
If IsArray(vData) Then  
[A1].Resize(UBound(vData, 1), UBound(vData, 2)).Value = vData
Else  
[A1] = vData
End If  
'Включаем обновление экрана  
Application.ScreenUpdating = True  
End Sub  
 
Но как сделать что бы он брал значения со второй строки SC33.xls и подставлял 4 столбец из SC33.xls в B5,3 столбец из SC33.xls в D5,32 столбец из SC33.xls в E5,30 столбец из SC33.xls в F5??
 
Вариант
Спасибо
 
R Dmitry Даже не представляете как выручили!Респектище огромный!!!Прям то что надо!
 
{quote}{login=eskimo87}{date=21.03.2012 11:10}{thema=}{post}Прям то что надо!{/post}{/quote}  
Столбец С затирается и если там будут формулы или данные, они сотрутся.  
если нужно оставлять данные, код надо будет править.
Спасибо
 
Сори!еще один вопрос!а где в вашем коде поменять формат что бы я копировал с dbf?
 
Для DBF нужен другой код. Почему сразу не указали что нужен импорт из DBF ???  
Пишите в почту все хотелки , вечером подправлю, желательно и dbf сбросьте.
Спасибо
 
R Dmitry dbf у меня большого формата 8м,а в excel не редактируется,по этому решил сбросить в xls,просто я в других кодах менял формат xls на dbf и все получалось.сбросил и на всякий случай код перекодировки из Windows-1251 в DOS-866 для работы в Excel если будут иероглифы.
Страницы: 1
Читают тему
Наверх