Страницы: 1
RSS
VBA: Выбор файла, привязка файла к макросу
 
Коллеги, здравствуйте,

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

Вопрос такой: можно ли (и если да, то как) сделать так, чтобы юзер сам выбрал вспомогательный файл, из которого должны подтягиваться данные, но, выбрав его однажды, этот выбор запомнился бы и диалоговое окно с выбором файла не возникало до востребования?

Как выбрать файл мне в принципе понятно, здесь достаточно подробно описано, но как запомнить выбор, не могу придумать.

Буду рад почитать ваши советы. Спасибо заранее.
 
Добрый день.
Как вариант - при выполнении процедуры выбора файла/файлов записывать где-нибудь в книге значение полученной строки/массива по файлам.
И потом осуществлять проверку - заполнены данные в где-нибудь - значит диалог выбора не требуется, а если пусто - то вызывать (это если я до конца понял задачу).
Кому решение нужно - тот пример и рисует.
 
Запомнить выбор можно кучей разных способов - в именах, на листе, в другом файле (типа как *.ini), в переменной...
Вы лучше сперва придумайте как будете это "до востребования" выражать.
 
Пытливый, спасибо. Я думал про отдельный файл, но решение показалось мне слишком громоздким что ли.

Hugo, наверное, отдельной кнопкой на панели. Ну, то есть отдельным макросом, скажем FileChoose:

1. Объявляю переменную iFile
2. Если переменная "iFile" пуста (или = 0, не знаю, как корректно), то выполняется вызов окна выбора;
3. Юзер выбирает файл (если Cancel, to Exit Sub);
4. Переменной iFile присваиваю выбранный файл (или путь?); (если я второй раз вызову процедуру, то iFile уже <> 0)
5. Основной макрос ссылается на iFile

Но ведь значения iFile сбросится, если я, скажем, закрою программу или перезагружу устройство?  
Изменено: Framed - 14.03.2019 13:26:34
 
"Мюллер, так мы об то и говорим!" (С) :)
Хранить в файле на листе - в коде проверять.
Кому решение нужно - тот пример и рисует.
 
Цитата
Framed написал:
1. Объявляю переменную iFile
2. Если переменная "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

Но мне кажется, что можно найти получше варианты. Может, вы посоветуете, какие-нибудь, так сказать, "укромные места"? Просто мне бы не хотелось, чтобы юзеры видели или знали о том, что имя вспомогательного файла хранится в специально созданной для этого книге, что это книга находится вот там-то и т.д. То есть, одной фразой - как бы это все провернуть, чтобы юзер не догадывался о костыле?
 
Цитата
Framed написал:
Application.ShowWindowsInTaskbar
Сейчас отправят на другой форум :)

Одно из укромных мест.
Владимир
 
sokol92, Пытливый, Ігор Гончаренко, Hugo, cпасибо всем, благодаря вам реализовал то, что задумал.
Страницы: 1
Наверх