подробно есть 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 работала?
Повторюсь: где содержится имя? Если Вы читали тему, на которую дали ссылку - то там данные забираются на основе именованного диапазона. Может Вам что-то попроще? Типа этого: Как получить данные из закрытой книги? я там и функцию выкладывал, которая данные из закрытой книги тянет...
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
(как сделать чтобы пользовательская функция была доступна во всех книгах excel?)
если будете ф-цию использовать только на одном компьютере то загнать её в личную книгу макросов. если файл будет передаваться на другие компьютеры то придется ф-цию копировать в файл.
как сделать чтобы пользовательская функция была доступна во всех книгах 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, а из любого другого файла без макроса, то импорта не происходит?
Чепуха, все работает. См. скрин. А насчет личной книги макросов, надо понимать, что делаешь. Тупого копирования мало. Там есть строка:
Тот пример был для конкретной ситуации, а при смене условий использования нужно понимать, что делает каждая строчка кода и соответственное подкорректировать.
Если Вы хотите поместить код в книгу личных макросов, то там должен быть весь код, т.е.:
Код
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)"