|
Как передать в файл Excel параметры при запуске?
|
|||
---|---|---|---|
#18+
Коллеги! Надо из кода одного Excel-файла открыть другой файл с параметрами, и во втором файле в Workbook_Open() вот хочется что-то типа такого: Код: vbnet 1.
и потом в OUTDATA.xlsb при Workbook_Open() вытянуть эти параметры ... |
|||
:
Нравится:
Не нравится:
|
|||
22.03.2018, 14:47 |
|
Как передать в файл Excel параметры при запуске?
|
|||
---|---|---|---|
#18+
RegisteredUser, нет такого. Передавайте через временный файл или через реестр, или через CustomDocumentProperties книги, в которой работает код, или через ячейки листа PERSONAL.XLSB, или еще как-нибудь. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.03.2018, 15:08 |
|
Как передать в файл Excel параметры при запуске?
|
|||
---|---|---|---|
#18+
RegisteredUserНадо из кода одного Excel-файла открыть другой файл с параметрамиДокумент Excel в принципе не может быть "открыт с параметрами". ... |
|||
:
Нравится:
Не нравится:
|
|||
22.03.2018, 15:12 |
|
Как передать в файл Excel параметры при запуске?
|
|||
---|---|---|---|
#18+
RegisteredUserоткрыть другой файл с параметрамиЧто под этим подразумевается? У метода Open есть свои параметры, один из которых - полный путь к открываемому файлу. А что за параметры хотите передать Вы и что они должны делать? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.03.2018, 15:35 |
|
Как передать в файл Excel параметры при запуске?
|
|||
---|---|---|---|
#18+
The_PristRegisteredUserоткрыть другой файл с параметрамиЧто под этим подразумевается? У метода Open есть свои параметры, один из которых - полный путь к открываемому файлу. А что за параметры хотите передать Вы и что они должны делать? скажем так: - хотелось бы, чтобы в зависимости от параметров в Workbook_Open() вызывались разные процедуры причем надо, чтобы это делалось именно при открытии файла. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.03.2018, 17:08 |
|
Как передать в файл Excel параметры при запуске?
|
|||
---|---|---|---|
#18+
RegisteredUser, в общем-то Казанский уже дал ответ - нельзя так сделать. Но можно открыть файл и вызвать код из того файла, код в котором его открывает(все равно ведь это кодом делается), передав туда нужные параметры(в том числе и имя файла(или ссылку на файл) можно передать, чтобы работать именно с ним). ... |
|||
:
Нравится:
Не нравится:
|
|||
22.03.2018, 17:30 |
|
Как передать в файл Excel параметры при запуске?
|
|||
---|---|---|---|
#18+
Приведенный ниже код нужно поместить в модуль ЭтаКнига (ThisWorkbook) Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.
Функция GetCommLine выдаст командную строку приложения Excel. В командной строке можно использовать и свои ключи ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2018, 08:42 |
|
Как передать в файл Excel параметры при запуске?
|
|||
---|---|---|---|
#18+
ZVIФункция GetCommLine выдаст командную строку приложения Excel.Какого именно экземпляра? Файл по Workbook_Open() скорее всего будет открыт в том же инстансе Excel, в котором работает вызывающий файл, и именно его строка запуска будет получена - та самая, которая задолго до Workbook_Open()... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2018, 08:47 |
|
Как передать в файл Excel параметры при запуске?
|
|||
---|---|---|---|
#18+
AkinaКакого именно экземпляра? Файл по Workbook_Open() скорее всего будет открыт в том же инстансе Excel, в котором работает вызывающий файл, и именно его строка запуска будет получена - та самая, которая задолго до Workbook_Open()... Да, код для получения командной строки запуска нового экземпляра с параметрами в командной строке запуска, например, такой: Excel C:\Temp\Test.xlsx /param1 /param2 Обмен (текстовыми) параметрами в пределах экземпляра Excel можно делать по разному, пример: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
При этом созданные имена и их значения живут до закрытия экземпляра Excel, независимо от того, закрыты книги или нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2018, 10:35 |
|
Как передать в файл Excel параметры при запуске?
|
|||
---|---|---|---|
#18+
если задача управлять вызываемой книгой из вызывающей (открывающей) её, то после Workbooks.Open можно через Application.Run запускать vba-макрос (в т.ч. с передачей в него параметров) в любой из открытых книг. В т.ч. в другой инстанции экселя, set app2 = createobject("Excel.Application") app2.visible = true set wb2 = app2.workbooks.open(книга2.xlsm) app2.Run ('wb2.Name'!имя макроса, параметры) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2018, 13:45 |
|
Как передать в файл Excel параметры при запуске?
|
|||
---|---|---|---|
#18+
Опишу проблему, которая возникла на ровном месте. Есть очень навороченный Excel-файл ( Файл1 ). В нем есть довольно большая логика навернутая именно на событие Workbook_Open() Этот файл может запускаться в 2 варианта: 1. Юзером как обычно --- ТУТ ВСЁ работает нормально 2. Открывается из другого Excel-файла ( Файл2 ). --- ТУТ Excel зависает и закрывается по ошибке, которую выловить не получается В связи с чем я хотел опереться на параметры запуска Файл1, чтобы отслеживать момент, когда он запускается по Варианту 2 Подскажите, может как-то можно в Файл1 отследить, что он запущен по Варианту 1 и Варианту 2 Реально уже 2 дня колбасим эту херню и не получается понять, почему слетает Workbook_Open(), когда идет Вариант 2 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2018, 18:00 |
|
Как передать в файл Excel параметры при запуске?
|
|||
---|---|---|---|
#18+
RegisteredUserОпишу проблему, которая возникла на ровном месте. Есть очень навороченный Excel-файл ( Файл1 ). В нем есть довольно большая логика навернутая именно на событие Workbook_Open() Этот файл может запускаться в 2 варианта: 1. Юзером как обычно --- ТУТ ВСЁ работает нормально 2. Открывается из другого Excel-файла ( Файл2 ). --- ТУТ Excel зависает и закрывается по ошибке, которую выловить не получается В связи с чем я хотел опереться на параметры запуска Файл1, чтобы отслеживать момент, когда он запускается по Варианту 2 Подскажите, может как-то можно в Файл1 отследить, что он запущен по Варианту 1 и Варианту 2 Реально уже 2 дня колбасим эту херню и не получается понять, почему слетает Workbook_Open(), когда идет Вариант 2 Evetlog пишет вот такое Faulting application name: EXCEL.EXE, version: 16.0.4324.1001, time stamp: 0x567a82c4 Faulting module name: VBE7.DLL, version: 7.1.10.49, time stamp: 0x55a6b6cd Exception code: 0xc0000005 Fault offset: 0x0000000000024a24 Faulting process id: 0x1b80 Faulting application start time: 0x01d3c2b6791d97ef Faulting application path: C:\Program Files\Microsoft Office\Office16\EXCEL.EXE Faulting module path: C:\Program Files\Common Files\Microsoft Shared\VBA\VBA7.1\VBE7.DLL Report Id: 8d542f20-5cf7-4fcb-97b2-e5a4f1798232 Faulting package full name: Faulting package-relative application ID: ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2018, 18:04 |
|
Как передать в файл Excel параметры при запуске?
|
|||
---|---|---|---|
#18+
RegisteredUserРеально уже 2 дня колбасим эту хернюА не пробовали её колбасить через отладку? Доходите до строки Workbooks.Open, где открываете этот файл и дальше идете по F8. Там и увидите где затык случается. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2018, 18:10 |
|
Как передать в файл Excel параметры при запуске?
|
|||
---|---|---|---|
#18+
RegisteredUserВ связи с чем я хотел опереться на параметры запуска Файл1, чтобы отслеживать момент, когда он запускается по Варианту 2 Первый предложенный мною в этой теме http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1288426&msg=21279417] вариант позволяет это определить: в GetCommLine будет только имя первого загруженного из эксплорера файла. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2018, 22:30 |
|
Как передать в файл Excel параметры при запуске?
|
|||
---|---|---|---|
#18+
ZVIRegisteredUserВ связи с чем я хотел опереться на параметры запуска Файл1, чтобы отслеживать момент, когда он запускается по Варианту 2 Первый предложенный мною в этой теме http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1288426&msg=21279417] вариант позволяет это определить: в GetCommLine будет только имя первого загруженного из эксплорера файла. Если я запускаю файл из файловой системы, то получаю вот такую строку "C:\Program Files\Microsoft Office\Office16\EXCEL.EXE" /dde при запуске программно из другого excel-файла вот так: Workbooks.Open "D:\CF.xlsb /param1 /param2" НИЧЕГО не открывается а если вот так: Workbooks.Open "D:\CF.xlsb" то файл открывается и там "C:\Program Files\Microsoft Office\Office16\EXCEL.EXE" /dde ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2018, 23:12 |
|
Как передать в файл Excel параметры при запуске?
|
|||
---|---|---|---|
#18+
ZVIAkinaКакого именно экземпляра? Файл по Workbook_Open() скорее всего будет открыт в том же инстансе Excel, в котором работает вызывающий файл, и именно его строка запуска будет получена - та самая, которая задолго до Workbook_Open()... Да, код для получения командной строки запуска нового экземпляра с параметрами в командной строке запуска, например, такой: Excel C:\Temp\Test.xlsx /param1 /param2 Обмен (текстовыми) параметрами в пределах экземпляра Excel можно делать по разному, пример: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
При этом созданные имена и их значения живут до закрытия экземпляра Excel, независимо от того, закрыты книги или нет. а вот так отработало! код Файл1 Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
код Файл2 Код: vbnet 1. 2. 3.
Результат: Код: vbnet 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2018, 23:33 |
|
Как передать в файл Excel параметры при запуске?
|
|||
---|---|---|---|
#18+
RegisteredUserОпишу проблему, которая возникла на ровном месте. Есть очень навороченный Excel-файл ( Файл1 ). В нем есть довольно большая логика навернутая именно на событие Workbook_Open()Попробуйте разнести во времени открытие файла и запуск макроса: Код: vbnet 1. 2. 3. 4.
Если работа Workbook_Open() не завязана на события, т.е. при открытии книги не предполагается обработка событий Worksheet_Chaange и т.п., лучше Application.EnableEvents = True поставить после Run. При желании можно в Файл1 добавить процедуру, которая установит глобальные переменные, и вызвать ее: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2018, 11:02 |
|
Как передать в файл Excel параметры при запуске?
|
|||
---|---|---|---|
#18+
RegisteredUserОпишу проблему, которая возникла на ровном месте. Есть очень навороченный Excel-файл ( Файл1 ). В нем есть довольно большая логика навернутая именно на событие Workbook_Open() Этот файл может запускаться в 2 варианта: 1. Юзером как обычно --- ТУТ ВСЁ работает нормально 2. Открывается из другого Excel-файла ( Файл2 ). --- ТУТ Excel зависает и закрывается по ошибке, которую выловить не получается В связи с чем я хотел опереться на параметры запуска Файл1, чтобы отслеживать момент, когда он запускается по Варианту 2 Подскажите, может как-то можно в Файл1 отследить, что он запущен по Варианту 1 и Варианту 2 Реально уже 2 дня колбасим эту херню и не получается понять, почему слетает Workbook_Open(), когда идет Вариант 2 Очевидный вариант - выкинуть всё из workbook_open, переделать на autoexec, добавить где надо DoEvents (и побольше), и принудительно программно запускать после открытия (application.run после workbooks.open) Подозреваю, что "навороченная логика" делает внешние вызовы (DLL например или ActiveX) виснет в вызываемом внешнем процессе. Тогда ессно весь экземпляр экселя зависнет. Попробуйте подгрузить книгу в отдельном дочернем экземпляре экселя. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.03.2018, 09:42 |
|
Как передать в файл Excel параметры при запуске?
|
|||
---|---|---|---|
#18+
ldfanateRegisteredUserОпишу проблему, которая возникла на ровном месте. Есть очень навороченный Excel-файл ( Файл1 ). В нем есть довольно большая логика навернутая именно на событие Workbook_Open() Этот файл может запускаться в 2 варианта: 1. Юзером как обычно --- ТУТ ВСЁ работает нормально 2. Открывается из другого Excel-файла ( Файл2 ). --- ТУТ Excel зависает и закрывается по ошибке, которую выловить не получается В связи с чем я хотел опереться на параметры запуска Файл1, чтобы отслеживать момент, когда он запускается по Варианту 2 Подскажите, может как-то можно в Файл1 отследить, что он запущен по Варианту 1 и Варианту 2 Реально уже 2 дня колбасим эту херню и не получается понять, почему слетает Workbook_Open(), когда идет Вариант 2 Очевидный вариант - выкинуть всё из workbook_open, переделать на autoexec, добавить где надо DoEvents (и побольше), и принудительно программно запускать после открытия (application.run после workbooks.open) Подозреваю, что "навороченная логика" делает внешние вызовы (DLL например или ActiveX) виснет в вызываемом внешнем процессе. Тогда ессно весь экземпляр экселя зависнет. Попробуйте подгрузить книгу в отдельном дочернем экземпляре экселя. в том то и дело, что нет DLL и даже ActiveX более того, предыдущая версия лет 6 работала в таком режиме без проблем (логика создана на Excel 2003) но вот сейчас пришло время обновится до Excel 2016 - и вот тут приехали. решили переписать вызов под .Net - там все открывается нормально ... |
|||
:
Нравится:
Не нравится:
|
|||
26.03.2018, 10:26 |
|
Как передать в файл Excel параметры при запуске?
|
|||
---|---|---|---|
#18+
более того я вычистил Workbook_Open() до момента, когда Excel перестал валится. будете смеяться, но я напихал в него кучу MsgBox, чтобы выловить моменты, где именно происходит обвал, так вот, в самом конце уже было так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
так вот, я добился, чтобы Workbook_Open() отрабатывал до конца, НО потом я вызывал макрос, ради которого вся эта канитель и делалась, и, как не трудно догадаться Exel слетел... После этого, я уже решил, что лучше будет .Net ... |
|||
:
Нравится:
Не нравится:
|
|||
26.03.2018, 10:35 |
|
Как передать в файл Excel параметры при запуске?
|
|||
---|---|---|---|
#18+
RegisteredUser, Application.ScreenUpdating = False ....... Application.ScreenUpdating = True имхо, вообще от этих "экономий на прорисовке" ScreenUpdating, DisplayAlerts и проч. по возможности лучше отказываться совсем (наоборот DoEvents лепить где только можно, чтобы в процессе загрузки интерактив сохранялся). Хлопот от них больше, чем пользы. MsgBox " FINISH Workbook_Open()" '<<< Excel закрылся после вот этого вот MsgBox. Дальше логики не было! полагаю, лучше всётаки для таких целей использовать неинтерактивный Debug.Print ... |
|||
:
Нравится:
Не нравится:
|
|||
26.03.2018, 11:45 |
|
Как передать в файл Excel параметры при запуске?
|
|||
---|---|---|---|
#18+
ldfanateот этих "экономий на прорисовке" ScreenUpdating, DisplayAlerts и проч. по возможности лучше отказываться совсем (наоборот DoEvents лепить где только можно, чтобы в процессе загрузки интерактив сохранялсяМожет я чего неправильно понял, но с чем связана такая категоричность и о каком интерактиве идет речь? Я согласен, что в самых примитивных кодах из пары строк это будет перебором. Но зачем прорисовка и отжирание ресурсов в более сложном коде, который должен просто сделать свое дело без участия пользователя? Да еще и DoEvents, который позволит пользователю в любой момент от скуки добавить что-то по ходу выполнения или активировать что-то не то. К тому же этот самый DoEvents некисло может замедлять работу кода, если напихать его после каждой строки, т.к. он будет передавать управление системе для выполнения других процессов(так же после каждой строки). Лепить надо тоже не везде, где только можно, а только там, где это реально нужно. ldfanateХлопот от них больше, чем пользыЕсли использовать неумеючи - любая строка кода принесет больше хлопот, чем пользы. Вы, наверное, не очень много программируете на VBA и не приходилось сталкиваться с ситуацией, когда надо заполнить много ячеек в цикле, создать диаграммы и прочее-прочее. И когда другие методы неприемлемы(те же массивы тоже не всегда могут быть использованы). И если не отключать обновление экрана - процесс выполняться может 3 и более часа(зависит от сложность программы). А отключение обновления(прорисовки) - сокращает это время в разы. Бывали случаи, когда эти 3 часа превращались в максимум 10 секунд. И все из-за одних только ldfanate"экономий на прорисовке" поэтому все же Ваш совет отказаться от самой действенной оптимизации в пользу замедления процесса может стоить пользователю не одного часа потраченного впустую времени. А на отлов и появление ошибок это не влияет(кроме что отключение DisplayAlerts, которое и так не очень часто применяется). Поэтому я бы уточнил: на стадии разработки и тестирования кода - да, эта оптимизация будет лишней. Но в финальной версии она должна быть, ибо цель любой программы оптимизировать процесс и сократить время на выполнение задачи, а никак не наоборот. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.03.2018, 13:07 |
|
|
start [/forum/topic.php?fid=61&msg=39619858&tid=2172368]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
29ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 291ms |
total: | 423ms |
0 / 0 |