Пишу макрос для обработки однотипных выгрузок. В какой-то момент макрос ссылается на файл (путь строго прописан в макросе). Если файл есть, то оттуда подтягиваются данные в обрабатываемый макросом файл, если нет - эта часть пропускается (кстати, с этим мне помоли здесь).
Вопрос такой: можно ли (и если да, то как) сделать так, чтобы юзер сам выбрал вспомогательный файл, из которого должны подтягиваться данные, но, выбрав его однажды, этот выбор запомнился бы и диалоговое окно с выбором файла не возникало до востребования?
Как выбрать файл мне в принципе понятно, здесь достаточно подробно описано, но как запомнить выбор, не могу придумать.
Добрый день. Как вариант - при выполнении процедуры выбора файла/файлов записывать где-нибудь в книге значение полученной строки/массива по файлам. И потом осуществлять проверку - заполнены данные в где-нибудь - значит диалог выбора не требуется, а если пусто - то вызывать (это если я до конца понял задачу).
Запомнить выбор можно кучей разных способов - в именах, на листе, в другом файле (типа как *.ini), в переменной... Вы лучше сперва придумайте как будете это "до востребования" выражать.
Пытливый, спасибо. Я думал про отдельный файл, но решение показалось мне слишком громоздким что ли.
Hugo, наверное, отдельной кнопкой на панели. Ну, то есть отдельным макросом, скажем FileChoose:
1. Объявляю переменную iFile 2. Если переменная "iFile" пуста (или = 0, не знаю, как корректно), то выполняется вызов окна выбора; 3. Юзер выбирает файл (если Cancel, to Exit Sub); 4. Переменной iFile присваиваю выбранный файл (или путь?); (если я второй раз вызову процедуру, то iFile уже <> 0) 5. Основной макрос ссылается на iFile
Но ведь значения iFile сбросится, если я, скажем, закрою программу или перезагружу устройство?
сразу после обьявления переменная iFile - ВСЕГДА пуста все дальнейшие рассуждения можно пропустить - ВСЕГДА вызываем окно выбора файла
Вам говорят о том, что имя выбранного последний раз файла нужно куда-то положить: 1. запомнить в именованную переменную (ту что видна в Диспетчере имен) 2. в любую (укромную или явно видную ячейку листа) 3. в любое внешнее хранилище (в файл, в реестр, может еще что придумаете) решите какой один из предложенных способов Вам подходит
и алгоритм такой: 1. в установленном месте есть имя последнего файла? 2 имя есть, ппроверяете наличие самого файла? 3. если 1 или 2 неудача - вызываете окно выбора файла и записываете выбранное имя в установленное место отказ от выбора - выход 4. запускаете открыть и обработать файл
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Ну и дполнительно ко всему - FileChoose выбирает файл и пишет путь в укромное место. Как вариант - далее сразу вызывает основной макрос, который делает п.1-2-3-4
Hugo, суть уловил, в связи с чем понял, что изначально я неверно поставил вопрос.
Доп.макрос создал; пока что он ссылается на специально созданный для этого файл.
Код
Sub FileChoose()
Dim iWb As Workbook
iFile = Application.GetOpenFilename("Excel files(*.xls*),*.xls*", 1, "Âûáðàòü Excel ôàéëû", , False)
If VarType(iFile) = vbBoolean Then
Exit Sub
End If
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.ShowWindowsInTaskbar = False
Set iWb = Workbooks.Open("Äëÿ ïðèìåðà")
iWb.Sheets(1).Range("A1").Value = iFile
iWb.Close True
Application.ShowWindowsInTaskbar = True
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
Но мне кажется, что можно найти получше варианты. Может, вы посоветуете, какие-нибудь, так сказать, "укромные места"? Просто мне бы не хотелось, чтобы юзеры видели или знали о том, что имя вспомогательного файла хранится в специально созданной для этого книге, что это книга находится вот там-то и т.д. То есть, одной фразой - как бы это все провернуть, чтобы юзер не догадывался о костыле?