Страницы: 1
RSS
ToArray (функция) в Personal.xls, для копирования данных из закрытых книг
 
Добрый день!

на форуме приводился пример копирования данных из закрытых книг
http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=8&TID=18165&MID=159094&tags=&q=ToArray&FORUM_ID%5B0%5D=0&DATE_CHANGE=0&order=relevance&s=%D0%9D%D0%B0%D0%B9%D1%82%D0%B8#message159094
т.е.:
1) книга с макросом, куда импортируются данные
2) книга с внешними данными

мне нужно настроить для ситуации:
1) книга с макросом
2) книга куда импортируются данные (без макросов)
2) книга с внешними данными

Вспомогательная функция ToArray в данной ситуации не работает,
пробовал размещать её в Personal.xls не помогло.

В чем ошибка?

Спасибо
 
Это проверка на телепатию?
В чем выражается неработа? Где размещали коды? Где содержится имя?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
извиняюсь за сумбур

подробно
есть 3 файла:
файл №1 с макросом
файл №2  с таблицей для импорта (без макросов)
файл №3 с внешними данными

***
фрагмент кода
     With Sheets(1).Cells(Rows.Count, 1).End(xlUp).Offset(1)
                   .Formula = "=ToArray('" & strPath & strFName & "штатное расписание'" & "!D81:AI86")"
                   .Formula = Empty
       End With

               If IsArray(arr) Then                    
                   Sheets(Worksheets("$Итоги1$").Index).Range("D" & CStr((I - 1) * 5 + 2)).Resize(UBound(arr, 1),  UBound(arr, 2)).Value = arr
               Else                                        
                   MsgBox ("Ошибка копирования массива")
               End If
***
запускаю макрос из файла №2 и при проверке переменной arr  сообщение "Ошибка копирования массива" и
данные не импортируются

А если разместить сам макрос в файл №2, то импорт работает.

и если в новой книге excel без макросов ввести формулу
=ToArray('C:\3 Штатка тмп\[Район1.XLS]штатное расписание'!D81:AI86), то ошибка #ИМЯ?

а если туже формулу в файл с макросом
то результат 0 (т.е. функция работает)

Как настроить, чтобы в новой книге без макросов, при запуске кода из другой книги функция
ToArray работала?
 
Повторюсь: где содержится имя? Если Вы читали тему, на которую дали ссылку - то там данные забираются на основе именованного диапазона.
Может Вам что-то попроще? Типа этого:
Как получить данные из закрытой книги?
я там и функцию выкладывал, которая данные из закрытой книги тянет...
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
orda, оформляйте код тегами.
 
спасибо,  использовал метод  GetObject для своей ситуации
метод GetObject



п.с.
.но с ошибкой, пока не разобрался
(как сделать чтобы пользовательская функция была доступна во всех книгах excel?)
 
Цитата
(как сделать чтобы пользовательская функция была доступна во всех книгах excel?)
если будете ф-цию использовать только на одном компьютере то загнать её в личную книгу макросов.
если файл будет передаваться на другие компьютеры то придется ф-цию копировать в файл.
 
Вот ещё вариант подобной функции (для загрузки массива данных из файла Excel)
http://excelvba.ru/code/loadarrayfromworkbook

может, пригодится.
 
Цитата
как сделать чтобы пользовательская функция была доступна во всех книгах excel?
Можно поместить функции в надстройку, как это сделано, например, в надстройке PLEX.
Но тогда потребуется установка надстройки на каждую машину.
И если надстройка будет установлена не в одну и ту же (посимвольно) папку, то возникает известная проблема с обменом книг, но она решается, смотрите эту тему:  
Надстройка, пользовательские функции, проблемы при переносе на другой компьютер
 
спасибо, но

на данную тему: Как считать данные из закрытой книги
пользователь ZVI выкладывал пример (приложен)

и если запустить макрос ImportExternalData, но не из файла с макросом MasterWb_01.xls, а из любого другого файла без макроса, то импорта не происходит?  
( вспомогательную функцию ToArray копировал в личную книгу макросов, без толку )
 
Просто поменяйте часть кода в макросе
Код
If IsArray(arr) Then
    Sheets(Worksheets("$Итоги1$").Index).Range("D" & CStr((I - 1) * 5 + 2)).Resize(UBound(arr, 1), UBound(arr, 2)).Value = arr
Else
    MsgBox ("Ошибка копирования массива")
End If 

на
Код
If IsArray(arr) Then
    Workbooks("ИмяКнигиДляВставки").Worksheets("ИмяЛистаДляВставки").Range("A1").Resize(UBound(arr, 1), UBound(arr, 2)).Value = arr
Else
    MsgBox ("Ошибка копирования массива")
End If 
 
Код
и если запустить макрос ImportExternalData, но не из файла с макросом MasterWb_01.xls, а из любого другого файла без макроса, то импорта не происходит?
Чепуха, все работает. См. скрин. А насчет личной книги макросов, надо понимать, что делаешь. Тупого копирования мало. Там есть строка:
Код
.Formula = "=ToArray('" & ThisWorkbook.Path & "\[ExternalWb.xls]Лист2'!A2:F4)"
т.е. ссылка на тот путь, по к-рому расположена книга с макросом. У вас книга-источник по тому же пути, что и personal.xls?
Я сам - дурнее всякого примера! ...
 
спасибо,

(пример с post_156533.zip )

при запуске из файла без макроса Книга1.xls
переменная arr при проверке не массив, соответственно вставки не происходит

... может дело в excel ( без лицензии office 2003 )
 
Тот пример был для конкретной ситуации, а при смене условий использования нужно понимать, что делает каждая строчка кода и соответственное подкорректировать.

Если Вы хотите поместить код в книгу личных макросов, то там должен быть весь код, т.е.:
Код
Dim arr
...
Sub ImportExternalData()
...
End Sub

Function ToArray(ExternalDataLink)
...
End Function


И, как правильно здесь уже отмечалось, в строке кода
.Formula = "=ToArray('" & ActiveWorkbook.Path & "\[ExternalWb.xls]Лист2'!A2:F4)"
потребуются корректировки, например, вместо  ThisWorkbook можно записать ActiveWorkbook,
а вместо [ExternalWb.xls]Лист2'!A2:F4 - что-то своё. При этом предполагается что ExternalWb.xls хранится в той же папке, что и активная книга.
 
Сделал по мотивам Владимира (ZVI) и Дмитрия (R_Dmitry) форму для копирования заданного диапазона (а если не задан, то A1:AZ16384), указанного листа заданной закрытой книги на лист требуемой книги в определённую верхнюю левую ячейку. Защиту от э.. некорректных действий не делал.
Предполагаю, что такое действие может помочь только если в закрытой книге есть куча вычислений, подтягиваемые с разных источников данные, что может замедлить скорость... Хотя не проверял, будет ли так лучше.
 
спасибо всем, получилось  :)

поместил весь код (процедуру и функцию) в Personal.xls
и заменил
.Formula = "ToArray('" & ThisWorkbook.Path & "\[ExternalWb.xls]Лист2'!A2:F4)"
на
.Formula = "=Personal.xls!ToArray('" & ActiveWorkbook.Path & "\[ExternalWb.xls]Лист2'!A2:F4)"
Страницы: 1
Наверх