Как от макрос в екселски файл да стартирам макрос в друг екселски файл?
Здравейте, винаги ми е приятно да се връщам към този курс. Класика в жанра! :) Накратко, искам да направя макрос в екселски файл, който ще извършва групова обработка, наричам го GT. Т.е. имам 3 файла, File1, 2, 3. Всеки път върху тях извършвам повтарящи се действия, състоящи се в стартиране на файла, стартиране на няколко макроса върху него, запомняне, съхраняване. Във файл GT правя макрос, примерно Group_Task, в който се извиква първи файл - File1, извършва се обработка върху File1, чрез извикване на макроси във File1, после File2 и т.н. Тук съм дал схематичен изглед на макроса - https://pastebin.com/4Sz2ijMx
Благодаря, Peter. За да се стартира макрос от друг файл, този файл трябва да се отвори, точно така, имате инструкцията Workbooks.Open "File1" ‘отваря файл. Добавете инструкцията Application.Run "File1.xlsm!NameOfMacroFromFile1", за да се изпълни макроса, записан във File1. Обърнете внимание, трябва да зададете пълното име на файла, с разширението. Тази инструкция трябва да се добави за всеки файл. Споделете, моля, резултата.
Благодаря, Димитринка, за бързия отговор! Толкова години след провеждане на курса и Вие си го наблюдавате, както и останалите, които сте водила!
Това решение го видях, още когато публикувах въпроса. Отворих един празен файл, отворих и този, който обработвах, Developer, Macro, записах макрос в който изпълнявам от празния файл макрос в обработвания файл и получих отговора, който и вие сте показала. Проблемът ми се състоеше в това, че когато вкарвах имената на файловеге, които обработвам като променлива в цикъл, задавах имената им с двойни кавички и не работеше. Оказа се, че името трябва да задам - оградено с единични кавички! Това го установих вчера.
Тук още един въпрос. Как да се направи проверка, дали даден файл е вече отворен, за да се прескочи отварянето, което води до грешка?
Също така, възможно ли е VBA project да се направи като изпълним/.exe/ файл с оглед увеличаване на бързодействието?
Здравейте, на линка ще намерите примери как да се направи проверка дали файла е отворен https://www.rondebruin.nl/win/s9/win003.htm
В Excel не може да конвертирате VBAproject в изпълним файл (exe), защото VBAproject се създава на база Excel или друго офис приложение и не може да съществува отделно, самостоятелно. Трябва да използвате VB Studio, C# или друга платформа, които са платени.
Благодаря! Този Рон няколко пъти ми е попадал, сега вече ще си го запиша като справочник! :)
И още нещо, което не съм открил. При стартиране на макрос, който работи много дълго време, примерно повече от 5 минути, много често нямам желание да го изчакам да свърши обработката, а искам да прекъсна изпълнението му чрез клавишна комбинация. Това как може да се реализира?
Намерих някакво решение. Както е казал поетът - Това е толкоз просто и логично ... Натиска се Esc или Ctrl-Break, и в отворилия се прозорец - End. https://wellsr.com/vba/2018/excel/excel-vba-stop-macro-execution-manually-with-esc-or-ctrl-break/
Чудесно е, че сам сте намерили решение. Едно допълнение, клавишите ESC или клавишната комбинация Ctrl+Break, обаче не винаги спират изпълнението на макроса. Тогава на помощ идва класиката Ctrl+Alt+Delete. Неудобството е, че ще загубите направените промени във файла, ако има такива
Файлът за групова обработка, който създадох, работи с 6 еднотипни файла, стартират се един след друг, завършват със Save, Close. Преди стартиране на следващ файл, програмата прави задръжка 2 секунди. Обаче започнаха да излизат съобщения за недостатъчно памет. Преди започване на работа, заетата памет е 3.2 гб, след завършване на работата на 6-я файл, заетата памет е 7.7 гб, близо до лимита на компютъра ми - 8 гб. След затваряне на всичките ми екселски файлове, заетата памет остава пак толкова и прави трудна работата след работата на файла за групова обработка, решавам го чрез рестарт на компютъра. :-( Накратко, трябва ми оператор за освобождаване на памет преди стартиране на следващ файл. Имам спомен, че имаше нещо казано в уроците тук, погледнах текстовете към уроците, но не видях освобождаване на памет, а ми се струва, че имаше нещо такова описано. Моля за съвет! :-)
Вероятно, поради използването на глобални променливи . Намерих в един форум някакъв съвет, който вероятно ще ми свърши работа, но излиза съобщение - Compile Error: object required. Предложението е следното:
use this instruction before use and save instruction-- Set cbrReset = Application.VBE.CommandBars(1).Controls("&Run").Controls("&Reset") cbrReset.Execute cbrReset го дефинирах като стринг и дотук. - Жду ответа, как соловей лето ...:)
Всъщност, променливата cbrReset трябва да се дефинира като CommandBarButton - Dim cbrReset As CommandBarButton. Идеята е в макроса да се изпълни Project.Reset. Но не ми се получава. Не разбирам, защо след затваряне на файла, уиндоус 10 продължава да поддържа това ниво на заетата памет, би трябвало да я освободи! Явно, почетният шеф на Майкрософт се е вторачил във ваксините и е изпуснал наблюдението над операционната система?! Ето, 10 минути след затваряне на екселския файл, няма нищо друго стартирано, заетата памен си остава същата?!
Това с паметта е много странна работа! Изпратете ме файла на [email protected].
Извинете, имах пред вид изпратете ми файла!
Благодаря, Димитринка, както винаги - веднага реагира :-) Този проблем ми възникна преди около месец, след като направих файла за групова обработка. Сравнително често ми излизаше съобщение - Out of memory, когато четях по форуми - вероятно поради употреба на глобални променливи, съветите бяха - направете ги локални, но някак ги игнорирах. И днес се престраших да пиша във форума на Аула и както се казва - запалих моторетката. Изчетох какви ли не съвети, повечето обаче бяха от доста отдавна, реших, че не е там ключа ... Накрая видях, в сервизите на таск мениджър, най-отгоре - My Phone. сетих се, че преди около месец инсталирах това приложение на Майкрософт, което линква телефона ви с компютъра, с цел бърз обмен на информация. Това приложение е включено в Sеttins на Майкрософт в уиндоус 10. Преди това свалях данни от телефона чрез кабел или по ftp протокол през Wi-Fi. И така, деинсталирах My Phone на Майкрософт и о Чудо! - нещата заработиха като преди, щях да кажа преди пандемията ... :) За сега това приложение съм набедил и съм го отрекъл, ако ми вярвате - не го ползвайте! Сега паметта се управлява така, както трябва да го правип една уважаваща себе си операционна система. Пуснах и тестове на паметта, включени в контрол панел на уиндоус 10, паметта/на компютъра, не моята/ е наред. Благодаря на Димитринка още веднъж, ако желаете, ще ви пратя файловете /поне 2 броя/. С тях започна практиката ми във VBА for Excel преди 5 години, бях ги изоставил 4 години, тази година, през март месец, нещо се затъжих за VBA, поднових заниманията и ги доразвих, но за сега нямам практически резултати :-) Сигурен съм, че ще имам, след като реших проблема с паметта! :)
Здравейте, Peter. Отговорих на мейла, преди да прочета публикацията във форума. Радвам се, че сте намерили решението. Ще си позволя един съвет, много внимателно избирайте приложенията на Майкрософт! Много често създават странични проблеми и като се замислите не е ясно дали предложеното улеснение компенсира допълнителните проблеми. Успех!