powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Как передать в файл Excel параметры при запуске?
22 сообщений из 22, страница 1 из 1
Как передать в файл Excel параметры при запуске?
    #39618919
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги!

Надо из кода одного Excel-файла открыть другой файл с параметрами,
и во втором файле в Workbook_Open()

вот хочется что-то типа такого:

Код: vbnet
1.
Workbooks.Open "D:\OUTDATA.xlsb /param1 /param2"



и потом в OUTDATA.xlsb при Workbook_Open() вытянуть эти параметры
...
Рейтинг: 0 / 0
Как передать в файл Excel параметры при запуске?
    #39618954
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RegisteredUser, нет такого. Передавайте через временный файл или через реестр, или через CustomDocumentProperties книги, в которой работает код, или через ячейки листа PERSONAL.XLSB, или еще как-нибудь.
...
Рейтинг: 0 / 0
Как передать в файл Excel параметры при запуске?
    #39618965
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RegisteredUserНадо из кода одного Excel-файла открыть другой файл с параметрамиДокумент Excel в принципе не может быть "открыт с параметрами".
...
Рейтинг: 0 / 0
Как передать в файл Excel параметры при запуске?
    #39618986
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RegisteredUserоткрыть другой файл с параметрамиЧто под этим подразумевается? У метода Open есть свои параметры, один из которых - полный путь к открываемому файлу. А что за параметры хотите передать Вы и что они должны делать?
...
Рейтинг: 0 / 0
Как передать в файл Excel параметры при запуске?
    #39619050
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
The_PristRegisteredUserоткрыть другой файл с параметрамиЧто под этим подразумевается? У метода Open есть свои параметры, один из которых - полный путь к открываемому файлу. А что за параметры хотите передать Вы и что они должны делать?

скажем так:
- хотелось бы, чтобы в зависимости от параметров в Workbook_Open() вызывались разные процедуры
причем надо, чтобы это делалось именно при открытии файла.
...
Рейтинг: 0 / 0
Как передать в файл Excel параметры при запуске?
    #39619070
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RegisteredUser,

в общем-то Казанский уже дал ответ - нельзя так сделать. Но можно открыть файл и вызвать код из того файла, код в котором его открывает(все равно ведь это кодом делается), передав туда нужные параметры(в том числе и имя файла(или ссылку на файл) можно передать, чтобы работать именно с ним).
...
Рейтинг: 0 / 0
Как передать в файл Excel параметры при запуске?
    #39619240
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приведенный ниже код нужно поместить в модуль ЭтаКнига (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.
Option Explicit

#If VBA7 Then
  Private Declare PtrSafe Function GetCommandLine Lib "kernel32" Alias "GetCommandLineA" () As LongPtr
  Private Declare PtrSafe Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As LongPtr) As LongPtr
  Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As LongPtr)
  Dim ptr As LongPtr, i As LongPtr
#Else
  Private Declare Function GetCommandLine Lib "kernel32" Alias "GetCommandLineA" () As Long
  Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Long) As Long
  Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
  Dim ptr As Long, i As Long
#End If

Private Sub Workbook_Open()
  MsgBox GetCommLine, , "Command line"
End Sub

Private Function GetCommLine() As String
  ptr = GetCommandLine
  i = lstrlen(ptr)
  If i > 0 Then
    GetCommLine = Space(CLng(i))
    CopyMemory ByVal GetCommLine, ByVal ptr, i
  End If
End Function


Функция GetCommLine выдаст командную строку приложения Excel. В командной строке можно использовать и свои ключи
...
Рейтинг: 0 / 0
Как передать в файл Excel параметры при запуске?
    #39619245
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZVIФункция GetCommLine выдаст командную строку приложения Excel.Какого именно экземпляра?

Файл по Workbook_Open() скорее всего будет открыт в том же инстансе Excel, в котором работает вызывающий файл, и именно его строка запуска будет получена - та самая, которая задолго до Workbook_Open()...
...
Рейтинг: 0 / 0
Как передать в файл Excel параметры при запуске?
    #39619322
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
Sub SetParam(ParamName, ParamStrValue)
  ExecuteExcel4Macro "SET.NAME(""" & ParamName & """, """ & ParamStrValue & """)"
End Sub

Function GetParam(ParamName)
  GetParam = ExecuteExcel4Macro(ParamName)
End Function

Sub Test_SetParam()
  Call SetParam("Param1", "value1")
  Call SetParam("Param2", "value2")
End Sub

Sub Test_GetParam()
  Debug.Print GetParam("Param1"), GetParam("Param2")
End Sub


При этом созданные имена и их значения живут до закрытия экземпляра Excel, независимо от того, закрыты книги или нет.
...
Рейтинг: 0 / 0
Как передать в файл Excel параметры при запуске?
    #39619495
ldfanate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если задача управлять вызываемой книгой из вызывающей (открывающей) её, то после Workbooks.Open можно через Application.Run запускать vba-макрос (в т.ч. с передачей в него параметров) в любой из открытых книг.
В т.ч. в другой инстанции экселя,
set app2 = createobject("Excel.Application")
app2.visible = true
set wb2 = app2.workbooks.open(книга2.xlsm)
app2.Run ('wb2.Name'!имя макроса, параметры)
...
Рейтинг: 0 / 0
Как передать в файл Excel параметры при запуске?
    #39619757
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Опишу проблему, которая возникла на ровном месте.

Есть очень навороченный Excel-файл ( Файл1 ).
В нем есть довольно большая логика навернутая именно на событие Workbook_Open()

Этот файл может запускаться в 2 варианта:
1. Юзером как обычно --- ТУТ ВСЁ работает нормально
2. Открывается из другого Excel-файла ( Файл2 ). --- ТУТ Excel зависает и закрывается по ошибке, которую выловить не получается

В связи с чем я хотел опереться на параметры запуска Файл1, чтобы отслеживать момент, когда он запускается по Варианту 2

Подскажите, может как-то можно в Файл1 отследить, что он запущен по Варианту 1 и Варианту 2

Реально уже 2 дня колбасим эту херню и не получается понять, почему слетает Workbook_Open(), когда идет Вариант 2
...
Рейтинг: 0 / 0
Как передать в файл Excel параметры при запуске?
    #39619758
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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:
...
Рейтинг: 0 / 0
Как передать в файл Excel параметры при запуске?
    #39619763
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RegisteredUserРеально уже 2 дня колбасим эту хернюА не пробовали её колбасить через отладку? Доходите до строки Workbooks.Open, где открываете этот файл и дальше идете по F8. Там и увидите где затык случается.
...
Рейтинг: 0 / 0
Как передать в файл Excel параметры при запуске?
    #39619858
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RegisteredUserВ связи с чем я хотел опереться на параметры запуска Файл1, чтобы отслеживать момент, когда он запускается по Варианту 2
Первый предложенный мною в этой теме http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1288426&msg=21279417] вариант позволяет это определить: в GetCommLine будет только имя первого загруженного из эксплорера файла.
...
Рейтинг: 0 / 0
Как передать в файл Excel параметры при запуске?
    #39619869
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
...
Рейтинг: 0 / 0
Как передать в файл Excel параметры при запуске?
    #39619873
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
Sub SetParam(ParamName, ParamStrValue)
  ExecuteExcel4Macro "SET.NAME(""" & ParamName & """, """ & ParamStrValue & """)"
End Sub

Function GetParam(ParamName)
  GetParam = ExecuteExcel4Macro(ParamName)
End Function

Sub Test_SetParam()
  Call SetParam("Param1", "value1")
  Call SetParam("Param2", "value2")
End Sub

Sub Test_GetParam()
  Debug.Print GetParam("Param1"), GetParam("Param2")
End Sub


При этом созданные имена и их значения живут до закрытия экземпляра Excel, независимо от того, закрыты книги или нет.


а вот так отработало!

код Файл1

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Sub DoOtherExcel()
    
   
    Call SetParam("AWR", "awrPRM")
    Debug.Print "from DoOtherExcel: " & GetParam("AWR")
    
    Workbooks.Open "D:\temp\SA25\Outdata25\CF25.xlsb"

End Sub



код Файл2

Код: vbnet
1.
2.
3.
Private Sub Workbook_Open()
   Debug.Print "from Workbook_Open: " & GetParam("AWR")
End Sub



Результат:
Код: vbnet
1.
2.
from DoOtherExcel: awrPRM
from Workbook_Open: awrPRM
...
Рейтинг: 0 / 0
Как передать в файл Excel параметры при запуске?
    #39619932
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RegisteredUserОпишу проблему, которая возникла на ровном месте.
Есть очень навороченный Excel-файл ( Файл1 ).
В нем есть довольно большая логика навернутая именно на событие Workbook_Open()Попробуйте разнести во времени открытие файла и запуск макроса:
Код: vbnet
1.
2.
3.
4.
  Application.EnableEvents = False
  Workbooks.Open "c:\temp\Файл1.xlsm"
  Application.EnableEvents = True
  Run "Файл1.xlsm!ЭтаКнига.Workbook_Open" 'может быть ThisWorkbook вместо ЭтаКнига

Если работа 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.
'обычный модуль в Файл1

Public Param1, Param2

Sub SetParams(x, y)
  Param1 = x: Param2 = y
End Sub

'код в вызывающей книге

  Application.EnableEvents = False
  Workbooks.Open "c:\temp\Файл1.xlsm"
  Application.EnableEvents = True
  Run "Файл1.xlsm!SetParams", "hello", "world"
  Run "Файл1.xlsm!ЭтаКнига.Workbook_Open" 'может быть ThisWorkbook вместо ЭтаКнига
...
Рейтинг: 0 / 0
Как передать в файл Excel параметры при запуске?
    #39620342
ldfanate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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) виснет в вызываемом внешнем процессе. Тогда ессно весь экземпляр экселя зависнет. Попробуйте подгрузить книгу в отдельном дочернем экземпляре экселя.
...
Рейтинг: 0 / 0
Как передать в файл Excel параметры при запуске?
    #39620371
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 - там все открывается нормально
...
Рейтинг: 0 / 0
Как передать в файл Excel параметры при запуске?
    #39620374
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
более того
я вычистил Workbook_Open() до момента, когда Excel перестал валится.
будете смеяться, но я напихал в него кучу MsgBox, чтобы выловить моменты, где именно происходит обвал,
так вот, в самом конце уже было так:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Private Sub Workbook_Open()

Application.ScreenUpdating = False
.......
Application.ScreenUpdating = True
    
MsgBox " FINISH Workbook_Open()"     '<<<  Excel закрылся после вот этого вот MsgBox. Дальше логики не было!
End Sub



так вот, я добился, чтобы Workbook_Open() отрабатывал до конца,
НО
потом я вызывал макрос, ради которого вся эта канитель и делалась, и, как не трудно догадаться Exel слетел...

После этого, я уже решил, что лучше будет .Net
...
Рейтинг: 0 / 0
Как передать в файл Excel параметры при запуске?
    #39620420
ldfanate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RegisteredUser,

Application.ScreenUpdating = False
.......
Application.ScreenUpdating = True

имхо, вообще от этих "экономий на прорисовке" ScreenUpdating, DisplayAlerts и проч. по возможности лучше отказываться совсем (наоборот DoEvents лепить где только можно, чтобы в процессе загрузки интерактив сохранялся). Хлопот от них больше, чем пользы.



MsgBox " FINISH Workbook_Open()" '<<< Excel закрылся после вот этого вот MsgBox. Дальше логики не было!

полагаю, лучше всётаки для таких целей использовать неинтерактивный Debug.Print
...
Рейтинг: 0 / 0
Как передать в файл Excel параметры при запуске?
    #39620477
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ldfanateот этих "экономий на прорисовке" ScreenUpdating, DisplayAlerts и проч. по возможности лучше отказываться совсем (наоборот DoEvents лепить где только можно, чтобы в процессе загрузки интерактив сохранялсяМожет я чего неправильно понял, но с чем связана такая категоричность и о каком интерактиве идет речь? Я согласен, что в самых примитивных кодах из пары строк это будет перебором. Но зачем прорисовка и отжирание ресурсов в более сложном коде, который должен просто сделать свое дело без участия пользователя? Да еще и DoEvents, который позволит пользователю в любой момент от скуки добавить что-то по ходу выполнения или активировать что-то не то. К тому же этот самый DoEvents некисло может замедлять работу кода, если напихать его после каждой строки, т.к. он будет передавать управление системе для выполнения других процессов(так же после каждой строки). Лепить надо тоже не везде, где только можно, а только там, где это реально нужно.
ldfanateХлопот от них больше, чем пользыЕсли использовать неумеючи - любая строка кода принесет больше хлопот, чем пользы.
Вы, наверное, не очень много программируете на VBA и не приходилось сталкиваться с ситуацией, когда надо заполнить много ячеек в цикле, создать диаграммы и прочее-прочее. И когда другие методы неприемлемы(те же массивы тоже не всегда могут быть использованы). И если не отключать обновление экрана - процесс выполняться может 3 и более часа(зависит от сложность программы). А отключение обновления(прорисовки) - сокращает это время в разы. Бывали случаи, когда эти 3 часа превращались в максимум 10 секунд. И все из-за одних только ldfanate"экономий на прорисовке"
поэтому все же Ваш совет отказаться от самой действенной оптимизации в пользу замедления процесса может стоить пользователю не одного часа потраченного впустую времени. А на отлов и появление ошибок это не влияет(кроме что отключение DisplayAlerts, которое и так не очень часто применяется).
Поэтому я бы уточнил: на стадии разработки и тестирования кода - да, эта оптимизация будет лишней. Но в финальной версии она должна быть, ибо цель любой программы оптимизировать процесс и сократить время на выполнение задачи, а никак не наоборот.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Как передать в файл Excel параметры при запуске?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]