Top-office11.ru

IT и мир ПК
5 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Executeexcel4macro vba описание

Функции, используемые в процедурах VBA

Настоящая заметка продолжает знакомство с VBA. В ней представлены некоторые «практичные» функции, которые могут использоваться в ваших приложениях либо помогут в создании аналогичных функций. Эти функции наиболее полезны, когда вызываются из другой процедуры VBA. Следовательно, они объявляются с ключевым словом Private и не отображаются в диалоговом окне Excel Мастер функций (подробнее см. Работа с процедурами VBA).[1]

Функция FileExists

Данная функция получает один аргумент (путь и имя файла) и возвращает ИСТИНА, если файл существует.

Скачать заметку в формате Word или pdf, примеры в архиве (политика безопасности провайдера не позволяет загружать файлы Excel с поддержкой макросов)

Функция FileNameOnly

Функция получает один аргумент (путь и имя файла; не забывайте брать строку в кавычки) и возвращает только имя файла.

Функция использует функцию VBA Split, которая принимает строку (вместе с символами-разделителями) и возвращает массив типа variant, содержащий элементы, которые находятся между символами-разделителями. В рассматриваемом случае переменной temp присваивается массив, содержащий текстовые строки между Application.PathSeparater (обычно в качестве разделителя используется обратная косая черта).

Если в качестве аргумента указать » с:excelfiles2010backupbudget.xlsx » , функция возвратит строку budget.xlsx.

Функция FileNameOnly обрабатывает любой путь и имя файла (даже если файла не существует). Если файл существует, лучше воспользоваться следующей более простой функцией.

Функция PathExists

Функция получает один аргумент (путь) и возвращает ИСТИНА, если путь существует.

Функция RangeNameExists

Функция получает один аргумент (название диапазона) и возвращает ИСТИНА, если в активной рабочей книге существует указанное название диапазона.

Функция SheetExists

Функция получает один аргумент (название рабочего листа) и возвращает ИСТИНА, если данный рабочий лист существует в активной рабочей книге.

Функция WorkbooklsOpen

Функция получает один аргумент (название рабочей книги) и возвращает ИСТИНА, если данная рабочая книга открыта.

Проверка принадлежности к коллекции

Следующая функция представляет собой образец «групповой» функции, с помощью которой можно определить, является ли объект членом коллекции.

Эта функция имеет два аргумента: коллекцию (объект) и элемент (строка), который может быть либо не быть членом коллекции. Функция будет создавать объектную переменную, представляющую элемент коллекции. Если попытка увенчается успехом, функция возвратит True; иначе — False. Функцию IsInCollection можно использовать вместо трех других функций, приведенных выше. Чтобы определить, содержится ли в активной рабочей книге диапазон Data, вызовите функцию IsInCollection с помощью следующего оператора:

MsgBox IsInCollection(ActiveWorkbook.Names, » Data » )

Для того чтобы определить, открыта ли рабочая книга с названием Budget, используйте следующий оператор:

MsgBox IsInCollection(Workbooks, » budget.xlsx » )

Чтобы узнать, содержит ли активная рабочая книга рабочий лист Лист1, используйте следующий оператор:

MsgBox IsInCollection(ActiveWorkbook.Worksheets, » Лист1 » )

Получение значения из закрытой рабочей книги

В VBA не существует метода получения значения из закрытого файла рабочей книги. Однако вы можете воспользоваться возможностью управления ссылками на файлы, которая предоставляется в Excel. В настоящем разделе описана функция VBA GetValue, которая получает значение из закрытой книги. Эта задача выполняется в результате вызова макроса XLM, который появился в «доисторических» версиях Excel (до версии 5), но поддерживается до сих пор (подробнее о макрофункциях xlm см. Функция Получить.Ячейку).

Вытянуть данные из закрытых книг в Excel

Следующая ситуация:
В ячейке А1 активной книги прописан полный путь к *.xls файлу, в ячейке А2 — к другому файлу и так далее в столбце А.
Каждый из этих файлов имеет одинаковую структуру и из каждого (все эти файлы закрыты) необходимо достать, к примеру, значение ячейки А4 и поместить значения этой ячейки из всех файлов в столбец В активной книги, и значения ячейки В4 поместить в столбец С активной книги.

Если лень писать код, то объясните, пожалуйста, просто суть, а именно как оптимальнее сделать эту задачу, чтоб процедура длилась как можно меньше.

04.08.2010, 14:11
Читать еще:  Vba excel dir описание

Вытянуть данные из лога в Excel
Вот код страницы на которой отображается все люди которые участвуют в конференции разговора по.

Как с помощью PHP вытянуть данные из Excel?
ПРивет! Может кто сталкивался с такой проблемой: Есть обычный excel’файл. При помощи пхп нужно.

Удаление закрытых книг из кеша
Друзья, столкнулся с такой проблемой. есть файл ексель с макросом который открывает по указанному.

Функция для вытягивания данных из закрытых книг
Всем привет! Появилась потребность написать пользовательскую функцию в VBA для вытягивания.

04.08.2010, 15:31204.08.2010, 17:46 [ТС]3

Fedogor, так вряд ли получится, потому что здесь еще есть предыстория.

Есть папка. В ней много подпапок. Во всех этих подпапках лежат .xls файлы одного шаблона. И эти файлы добавляются, точно так же, как и папки. И когда-то на этом форуме один очень добрый человек помог мне написать макрос, который находит все эти файлы.

И всё было бы хорошо, но в силу того, что я знаю vba так, как третьеклассник знает математику, я не могу дописать этот макрос так, чтоб достать из этих файлов необходимые данные.

Суть в том, чтоб из многих файлов, которые добавляются и обновляются, создать небольшую базу данных. К примеру, в каждом таком файле в одной определённой ячейке есть имя клиента, во второй количество купленного товара и в третьей цена товара. И эти данные из файлов по разным клиентам нужно свести в одну табличку в отдельной книге.

Ниже приведены две процедуры (спасибо, Аналитика), которые находят все .xls файлы во всех папках первого уровня вложения, и заносят в столбец А пути ко всем файлам. Список этих файлов на рабочем листе мне, по сути, не нужен, было бы лучше, если бы пути к этим файлам просто сохранялись в памяти программы. И дальше мне нужен только пример того, как из каждой этих рабочих книг достать значение какой-то одной ячейки и вставить его в активную рабочую книгу в столбик.

ExecuteExcel4Macro Method fails in Excel 2011 on Mac with 1004 Error

So I’m another one of those wanting to use the ExecuteExcel4Macro Method call to retrieve data from specific cells and lookup ranges in closed workbooks. I have seen lots of examples and answers to problems here and elsewhere. I am (or will be) using a variation of a routine credited to John Walkenbach, and referenced here and on other forums. (See thread for 9311188.)

The call to ExecuteExcel4Macro fails with an error «1004 — Method ‘ExecuteExcel4Macro’ of object ‘_Global’ failed». For me, that’s not a lot to go on. I have double checked the directory paths, file and sheet names, all that. The DIR() function finds the file okay. I’ve even put the files in the root directory to eliminate path complexities or too-long of an argument to the Method. One complication is that I’m on a Mac with OS 10.8 and using Excel 2011. Mac OS uses «:» instead of «» for directory delimiters.

But I don’t really need to get into all that because the problem seems to be something fundamental about the cell reference addressing. I can’t get ExecuteExcel4Macro to execute successfully within the same worksheet with an Excel Function that addresses any cell or range, never mind about a remote, closed worksheet reference. So I have condensed my example code to the essentials – no remote reference, just functions on cells in one worksheet.

In the example below I have a simple routine that executes some sample Excel Functions and displays a MessageBox with either the successful result or the error message, along with the argument to the Method call. There’s also a function that will convert the A1 style references to R1C1 when needed. The list of Functions are within the routine, just comment/uncomment as needed to execute whichever one to test.

Читать еще:  Как отсортировать столбец в excel

The first six all work just fine, returning the values you would expect:

arg = «GET.CELL(42)» This returns the left margin, or whatever that is;
arg = «CHAR(65)» Good, you get an «A» for that;
arg = «LEN(«»ABCDE»»)» Nice, that’s a 5;
arg = «SUM(2,5,8)» Okay, 15;
arg = «INFO(«»directory»»)» Yep, the directory path of the active workbook with the macro;
arg = «INFO(«»numfile»»)» And the number of sheets in the workbook (plus 1? whatever).

So from this I know I’m accessing the Method correctly; it does work; you don’t use the «=» in the argument; and the two INFO() Functions tell me it’s able to access info about this workbook; i.e. it doesn’t require explicit full directory pathway to find itself.

Now some functions that make reference to cells in the worksheet. These all work fine as a Formula in a cell in the worksheet. But they fail as a call to the Method, with the respective error codes:

arg = «SUM(A32:A34)» 13 — Type mismatch
As expected, the Method requires R1C1 style references.

arg = «SUM(ValList)» 13 — Type mismatch
Okay, not too surprising, so it won’t work with a named range. Too bad, I was counting on that.

arg = MakeR1C1(«SUM(A32:A34)») 1004 — Method ‘ExecuteExcel4Macro’ of object ‘_Global’ failed
Now the puzzlement. The MakeR1C1() converts the A1 addressing okay to «SUM(R32C1:R34C1)».

arg = «SUM(R32C1:R34C1)» 1004 — Method ‘ExecuteExcel4Macro’ of object ‘_Global’ failed
And setting the argument explicitly with the R1C1 style fails the same.

I’ll be really embarrassed if this is due to something simple and obvious. But I’ll risk it because I’m stumped.
If it’s not so simple then, Gurus, have at it. If I get this simple reference addressing problem figured out, then the remote file reference should fall into place, too.

I’ll be especially appreciative of anyone who can test these in a Windows version and let me know what you get. That’s what I’m most worried about – a Mac incompatibility that I can’t fix.

Thanks to all in advance.
PS: I hope I have marked up all the above correctly, I tried.

Edit: Maybe I should have mentioned that to run my TestExcel4Macro() subroutine, I just mash the F5 key while in the VBA editor.

Executeexcel4macro vba описание

Shpux » 16.08.2007 (Чт) 6:52

Этот вопрос уже всяко обсасывался но я так и не понял (ламер наверно) почему

Sub Пример1()
MsgBox ExecuteExcel4Macro(«‘D:[Книга1.xls]» & «Лист2’!R1C1»)
End Sub

Function Пример2() As Variant
Пример2= ExecuteExcel4Macro(«‘D:[Книга1.xls]Лист1’!R1C1»)
End Function

Очень надо однако.
Мне необходимо считывать данные из однотипных файлов и одинаковых ячеек, пересчитывать данные и вносить их в результирующий файл. Причем файлы-источники и их количество должны быть произвольными.

bi-lya » 16.08.2007 (Чт) 8:46

Shpux » 16.08.2007 (Чт) 8:55

Обращаю внимание с процедурой (Sub) — РАБОТАЕТ, а с функцией (public function) — не работает

При попытке использовать эту функцию (Пример2) в ячейке рабочего листа, т.е. «=Пример2()» — выдает ЗНАЧ#

RayShade » 16.08.2007 (Чт) 10:13

Вниматльно посмотри. В функции, у тебя другой код.

Shpux » 16.08.2007 (Чт) 10:48

RayShade
В данном случае код внутри ExecuteExcel4Macro непринципиален: это ведь просто строка, а в Книге1 существуют и Лист1 и Лист2.

Проблема в том, что некоторые (я, ессно не все проверял) команды работают только в процедурах (SUB), а из public-функций просто не запускаются.
Например:

sub Open1()
Workbooks.Open(«Адрес», 0 ,true).activate
end sub

открывает файл без проблем.

function Open1() as integer
Workbooks.Open(«Адрес», 0 ,true).activate
Open1 = 0
end function

даже не завершится, выводится «ЗНАЧ#»

Вот такая вот ботва, а мне надо позарез.

Читать еще:  Виснет файл excel

P.S. Проблема ессно при вызове функций с рабочего листа

Genyaa » 16.08.2007 (Чт) 11:35

Так и должно быть.

К сожалению уже давно не помню где я прочел это. какая-то очень неплохая была книжка по Excel. там было сказано, что одним из ограничений пользовательских функций, используемых в ячейках листа, есть суть — недопустимость изменения рабочей среды приложения. т.е., в том числе, нельзя открывать, закрывать, менять другие файлы. В Sub — пожалуйста. В Function, используемой на листе — нет. Попробуйте Вашу функцию вызвать в другой Sub — должна отработать. А на листе не будет.

KL » 16.08.2007 (Чт) 13:51

где-то я уже это видел
http://tinyurl.com/2sqnrc

А что мешает использовать Sub связав его с одним из событий листа? Тут даже лучше будет вводить кодом нормальную формулу в ячейку.

Shpux » 17.08.2007 (Пт) 3:03

Genyaa
Ей богу не понимаю смысла подобных ограничений, ну да ладно.
Я пошел чудовищным путем но все же как вариант может кому пригодится: я эту функцию (ExecuteExcel4Macro) запихал во внешнюю dll-библиотеку (с помощью Delphi), потом подключил ее к Ехелю и все заработало. Правда пришлось помучаться с типами переменных, я сам не ахти какой программист но такое ощущение что у Delphi и Excel(VBA) совпадают только Integer и Double. Например при попытке вернуть из библиотеки (созданной в Delphi) значение типа String, Excel без объяснения причин вырубается.

KL
Использовать SUB конечно можно, но:
Попытаюсь вкратце обрисовать суть задачи:
Есть некоторое (неопределенное) количество файлов-источников Excel с абсолютно одинаковой структурой, есть один результирующий файл-приемник с такой-же структурой, но файлы источники содержат в себе сложные теплотехнические расчеты (например за разные периоды), а значения результирующего файла должны собираться (суммированием, среднеарифметическим, средневзвешенным, и т.п.).
Причем подразумевается постояное развитие и видоизменение расчетов.
Какова была моя мысль:
Исходные данные для расчета значения конкретной ячейки — массив адресов исходных файлов, принцип накопления (суммированием, среднеарифметическим, средневзвешенным, и т.п.), ссылка на параметр взвешивания.
Макрос — ФУНКЦИЯ вычисляет собственное местоположение (адрес ячейки) опрашивает ячейки файлов-источников с таким же адресом, рассчитывает их и возвращает нужное значение в ячейку результирующего файла.
Таким образом я могу быстро сформировать сам результирующий файл (банальным протягиванием), легко менять файлы-источники (и их количество), и главное — это может сделать любой пользователь независимо от знаний VBA.

Примечание: Сводные таблицы не подходят в принципе из-за неопределенности источников и относительно сложных алгоритмов определения результирующего значения.

Если существует какое-либо другое направление при решении этой задачи — буду очень признателен.

P.S. Прошу прошения если не смог доступно объяснить.

Shpux » 17.08.2007 (Пт) 6:20

Прошу прощения за ложную информацию :

«функцию (ExecuteExcel4Macro) запихал во внешнюю dll-библиотеку (с помощью Delphi), потом подключил ее к Ехелю и все заработало»

фокус срабатывает только один раз, а при попытке повторно использовать функцию — Excel захлапывается — бред какой-то, я верно даун .

Есть у кого-нибудь русская книжка по VBA для Excel?
Наверно пора учиться.

KL » 17.08.2007 (Пт) 6:38

Shpux писал(а): Прошу прощения за ложную информацию :

«функцию (ExecuteExcel4Macro) запихал во внешнюю dll-библиотеку (с помощью Delphi), потом подключил ее к Ехелю и все заработало»

фокус срабатывает только один раз, а при попытке повторно использовать функцию — Excel захлапывается — бред какой-то, я верно даун .

Есть у кого-нибудь русская книжка по VBA для Excel?
Наверно пора учиться.

Shpux » 17.08.2007 (Пт) 8:59

Genyaa » 17.08.2007 (Пт) 12:26

KL » 17.08.2007 (Пт) 14:34

Ограничение на самомом деле пошло с одного из обновлений для Office97. Excel97 позволял вызывать макросы прямо из формулы с пом. функции (не помню имени), которую по соображениям безопасности впоследствии «обезточили»

KL
[MVP — Microsoft Excel]

@Nik » 20.08.2007 (Пн) 12:19

Ссылка на основную публикацию
Adblock
detector