[/vba] Этот код указывает постоянное местоположение папки ШАБЛОНЫ для всех процедур модуля.
Как создать макрос, чтобы можно было вызвать диалоговое окно для указания местоположения папки и при этом желательно, чтобы автоматический изменился путь в строке [vba]
Код
Private Const papka As String = "C:\ШАБЛОНЫ"
[/vba]
Это нужно, чтобы каждый пользователь мог один раз указать путь, где лежит его папка ШАБЛОНЫ.
Прошу помощи разобраться.
Есть такой код: [vba]
Код
Private Const papka As String = "C:\ШАБЛОНЫ"
[/vba] Этот код указывает постоянное местоположение папки ШАБЛОНЫ для всех процедур модуля.
Как создать макрос, чтобы можно было вызвать диалоговое окно для указания местоположения папки и при этом желательно, чтобы автоматический изменился путь в строке [vba]
Код
Private Const papka As String = "C:\ШАБЛОНЫ"
[/vba]
Это нужно, чтобы каждый пользователь мог один раз указать путь, где лежит его папка ШАБЛОНЫ.
Если для каждого пользователя - свой путь - я бы в файле отвел для его указания одну ячейку - в которой после выбора папки пропишется этот путь например [vba]
Если для каждого пользователя - свой путь - я бы в файле отвел для его указания одну ячейку - в которой после выбора папки пропишется этот путь например [vba]
Sub GetPath() If Len(papka) Then Exit Sub ' выходим, если путь к папке ШАБЛОНЫ нам уже известен (даже в реестр не лезем) papka = GetSetting("Проект Договоры", "Настройки", "Путь к шаблонам") ' иначе - ищем путь в реестре If Len(papka) Then Exit Sub ' если нашли в реестре - выходим ' если не нашли - просим пользователя показать эту папку Dim oShell As Object, oFolder As Object Set oShell = CreateObject("Shell.Application") Set oFolder = oShell.BrowseForFolder(0, "Укажите расположение папки ШАБЛОНЫ", 0) If oFolder Is Nothing Then Exit Sub ' пользователь передумал показывать папку papka = oFolder.Self.Path ' пользователь показал нам путь к папке ШАБЛОНЫ SaveSetting "Проект Договоры", "Настройки", "Путь к шаблонам", papka ' сохраняем его в реестре End Sub
[/vba] обратите внимание на третью строчку снизу - это "узкое" место. Что нужно делать в случае, если пользователь отказался показывать папку?
как вариант: [vba]
Код
Public papka As String
Sub GetPath() If Len(papka) Then Exit Sub ' выходим, если путь к папке ШАБЛОНЫ нам уже известен (даже в реестр не лезем) papka = GetSetting("Проект Договоры", "Настройки", "Путь к шаблонам") ' иначе - ищем путь в реестре If Len(papka) Then Exit Sub ' если нашли в реестре - выходим ' если не нашли - просим пользователя показать эту папку Dim oShell As Object, oFolder As Object Set oShell = CreateObject("Shell.Application") Set oFolder = oShell.BrowseForFolder(0, "Укажите расположение папки ШАБЛОНЫ", 0) If oFolder Is Nothing Then Exit Sub ' пользователь передумал показывать папку papka = oFolder.Self.Path ' пользователь показал нам путь к папке ШАБЛОНЫ SaveSetting "Проект Договоры", "Настройки", "Путь к шаблонам", papka ' сохраняем его в реестре End Sub
[/vba] обратите внимание на третью строчку снизу - это "узкое" место. Что нужно делать в случае, если пользователь отказался показывать папку?KSV
Получается в каждой макросе нужно указывать такой код
Нет. Я предлагал вам совершенно другую логику. Вместо того, чтобы проверять наличие папки при вызове каждой процедуры, я предлагал ОДИН раз (при открытии книги) проверить путь (и можно дописать еще проверку наличия этой папки), а потом, везде где нужно, просто использовать этот путь из глобальной переменной papka [p.s.]Или вы хотите "застраховаться" от того, что пока пользователь вводит данные клиента, кто-то может переместить папку с шаблонами в другое место? (я полагал, что эта папка не перемещается никогда, просто у каждого пользователя она находится в своем (удобном для него) месте. [/p.s.]
Получается в каждой макросе нужно указывать такой код
Нет. Я предлагал вам совершенно другую логику. Вместо того, чтобы проверять наличие папки при вызове каждой процедуры, я предлагал ОДИН раз (при открытии книги) проверить путь (и можно дописать еще проверку наличия этой папки), а потом, везде где нужно, просто использовать этот путь из глобальной переменной papka [p.s.]Или вы хотите "застраховаться" от того, что пока пользователь вводит данные клиента, кто-то может переместить папку с шаблонами в другое место? (я полагал, что эта папка не перемещается никогда, просто у каждого пользователя она находится в своем (удобном для него) месте. [/p.s.]KSV
Получается в каждой макросе нужно указывать такой код, на случай если нет такой папки
Да и следует учесть, что при глобальная переменная не запоминается если файл закрыть - а потом открыть. Т.е. если один файл пользователь открывает по несколько раз в день - ему придется каждый раз указывать это местоположение. Тоже произойдет если макрос будет завершен с ошибкой. Поэтому я предложил использовать ячейку - значение в которой, если один раз прописать - останется.
Получается в каждой макросе нужно указывать такой код, на случай если нет такой папки
Да и следует учесть, что при глобальная переменная не запоминается если файл закрыть - а потом открыть. Т.е. если один файл пользователь открывает по несколько раз в день - ему придется каждый раз указывать это местоположение. Тоже произойдет если макрос будет завершен с ошибкой. Поэтому я предложил использовать ячейку - значение в которой, если один раз прописать - останется. SLAVICK
Вместо того, чтобы проверять наличие папки при вызове каждой процедуры, я предлагал ОДИН раз (при открытии книги) проверить путь (и можно дописать еще проверку наличия этой папки), а потом, везде где нужно, просто использовать этот путь из глобальной переменной papka
Да, именно так и нужно. И как же это правильно указать?
Вместо того, чтобы проверять наличие папки при вызове каждой процедуры, я предлагал ОДИН раз (при открытии книги) проверить путь (и можно дописать еще проверку наличия этой папки), а потом, везде где нужно, просто использовать этот путь из глобальной переменной papka
Да, именно так и нужно. И как же это правильно указать?den45444
Да и следует учесть, что при глобальная переменная не запоминается если файл закрыть - а потом открыть. Т.е. если один файл пользователь открывает по несколько раз в день - ему придется каждый раз указывать это местоположение. Тоже произойдет если макрос будет завершен с ошибкой.
Проверил - запоминается. Открыл - указал папку - сохранил - вышел - Открыл снова - проверил - работает.
Да и следует учесть, что при глобальная переменная не запоминается если файл закрыть - а потом открыть. Т.е. если один файл пользователь открывает по несколько раз в день - ему придется каждый раз указывать это местоположение. Тоже произойдет если макрос будет завершен с ошибкой.
Проверил - запоминается. Открыл - указал папку - сохранил - вышел - Открыл снова - проверил - работает.den45444
Сама переменная не запоминается - KSV добавил процедуру считывания и записи в реестр и перезапись этой переменной при открытии книги Интересный прием - но суть та же. См вложенный файл. Я убрал процедуру перезаписи при открытии книги - и добавил макрос с ошибкой. И макрос Тест - для проверки переменной. Попробуйте сами. Метод KSV хорош , но нужно уметь им пользоваться - и запись в реестр наверное не всегда нужна. Тут на любителя. См. реестр: HKEY_CURRENT_USER\Software\VB and VBA Program Settings\Проект Договоры\Настройки
Сама переменная не запоминается - KSV добавил процедуру считывания и записи в реестр и перезапись этой переменной при открытии книги Интересный прием - но суть та же. См вложенный файл. Я убрал процедуру перезаписи при открытии книги - и добавил макрос с ошибкой. И макрос Тест - для проверки переменной. Попробуйте сами. Метод KSV хорош , но нужно уметь им пользоваться - и запись в реестр наверное не всегда нужна. Тут на любителя. См. реестр: HKEY_CURRENT_USER\Software\VB and VBA Program Settings\Проект Договоры\НастройкиSLAVICK
Function IsPathNotExists() As Boolean Dim n&, oShell As Object, oFolder As Object Set oShell = CreateObject("Shell.Application") papka = GetSetting("Проект Договоры", "Настройки", "Путь к шаблонам") ' ищем путь в реестре Do n = Len(papka) If n Then n = Len(Dir$(papka, vbDirectory)) ' проверяем существование папки (здесь же можно проверять и наличие файлов шаблонов на случай, если пользователь указал какую-то другую папку) If n Then Exit Function ' выходим, если папка существует Set oFolder = oShell.BrowseForFolder(0, "Укажите расположение папки ШАБЛОНЫ", 0) ' если путь не указан или указанный ранее путь не существует (папка была перемещена), просим пользователя показать папку с шаблонами If oFolder Is Nothing Then ' если пользователь передумал показывать If MsgBox("Вы не указали папку с шаблонами." & vbCr & vbCr & "Завершить работу с файлом?", vbExclamation Or vbYesNo, "Не указан путь к шаблонам") = vbYes Then IsPathNotExists = True: Exit Function Else papka = oFolder.Self.Path ' пользователь показал путь к папке ШАБЛОНЫ SaveSetting "Проект Договоры", "Настройки", "Путь к шаблонам", papka ' сохраняем путь к папке ШАБЛОНЫ в реестре Exit Function End If Loop End Function
[/vba] (правда, не оптимизировал) и [vba]
Код
Private Sub Workbook_Open() If IsPathNotExists Then Me.Close False End Sub
Function IsPathNotExists() As Boolean Dim n&, oShell As Object, oFolder As Object Set oShell = CreateObject("Shell.Application") papka = GetSetting("Проект Договоры", "Настройки", "Путь к шаблонам") ' ищем путь в реестре Do n = Len(papka) If n Then n = Len(Dir$(papka, vbDirectory)) ' проверяем существование папки (здесь же можно проверять и наличие файлов шаблонов на случай, если пользователь указал какую-то другую папку) If n Then Exit Function ' выходим, если папка существует Set oFolder = oShell.BrowseForFolder(0, "Укажите расположение папки ШАБЛОНЫ", 0) ' если путь не указан или указанный ранее путь не существует (папка была перемещена), просим пользователя показать папку с шаблонами If oFolder Is Nothing Then ' если пользователь передумал показывать If MsgBox("Вы не указали папку с шаблонами." & vbCr & vbCr & "Завершить работу с файлом?", vbExclamation Or vbYesNo, "Не указан путь к шаблонам") = vbYes Then IsPathNotExists = True: Exit Function Else papka = oFolder.Self.Path ' пользователь показал путь к папке ШАБЛОНЫ SaveSetting "Проект Договоры", "Настройки", "Путь к шаблонам", papka ' сохраняем путь к папке ШАБЛОНЫ в реестре Exit Function End If Loop End Function
[/vba] (правда, не оптимизировал) и [vba]
Код
Private Sub Workbook_Open() If IsPathNotExists Then Me.Close False End Sub
согласен, но в данном случае, путь "привязан" к компу, а не к книге (например, книгу могут кинуть на другой комп), поэтому посчитал, что путь нужно хранить на компе. (к тому же, в этой папке можно хранить и другие шаблоны/файлы, и использовать этот ключ реестра в других макросах (в других книгах)
согласен, но в данном случае, путь "привязан" к компу, а не к книге (например, книгу могут кинуть на другой комп), поэтому посчитал, что путь нужно хранить на компе. (к тому же, в этой папке можно хранить и другие шаблоны/файлы, и использовать этот ключ реестра в других макросах (в других книгах)KSV
путь "привязан" к компу, а не к книге (например, книгу могут кинуть на другой комп),
Согласен. Тут все зависит от того для чего этот файл используют и как долго, и кто бросает эту книгу всем. Выбирать ТС Просто я не сторонник забрасывать в реестр всякую инфу. Тут и на ограничения админов можно нарваться. В своей практике у меня менеджерам скидывают всегда обнуленную книгу. Т.е. без выбора пути. Правда по умолчанию я всегда прописываю проверку в подпапке рядом с активной книгой - 99% именно туда ложат вспомогательные файлы
путь "привязан" к компу, а не к книге (например, книгу могут кинуть на другой комп),
Согласен. Тут все зависит от того для чего этот файл используют и как долго, и кто бросает эту книгу всем. Выбирать ТС Просто я не сторонник забрасывать в реестр всякую инфу. Тут и на ограничения админов можно нарваться. В своей практике у меня менеджерам скидывают всегда обнуленную книгу. Т.е. без выбора пути. Правда по умолчанию я всегда прописываю проверку в подпапке рядом с активной книгой - 99% именно туда ложат вспомогательные файлы SLAVICK
Иногда все проще чем кажется с первого взгляда.
Сообщение отредактировал SLAVICK - Четверг, 24.09.2015, 14:35
согласен, но в данном случае, путь "привязан" к компу, а не к книге (например, книгу могут кинуть на другой комп), поэтому посчитал, что путь нужно хранить на компе. (к тому же, в этой папке можно хранить и другие шаблоны/файлы, и использовать этот ключ реестра в других макросах (в других книгах)
Да - именно для разных компов нужно. А можно ли чтобы это было именно в модуле, а не в книге? Я делаю это все для надстройки и получается при открытии любого файла у меня срабатывает данная процедура.
согласен, но в данном случае, путь "привязан" к компу, а не к книге (например, книгу могут кинуть на другой комп), поэтому посчитал, что путь нужно хранить на компе. (к тому же, в этой папке можно хранить и другие шаблоны/файлы, и использовать этот ключ реестра в других макросах (в других книгах)
Да - именно для разных компов нужно. А можно ли чтобы это было именно в модуле, а не в книге? Я делаю это все для надстройки и получается при открытии любого файла у меня срабатывает данная процедура.den45444
В своей практике у меня менеджерам скидывают всегда обнуленную книгу. Т.е. без выбора пути.
А как можно так устроить? У нас смысл такой. Есть папка ШАБЛОНЫ и в ней находятся файлы для формирования документов. Всем скидываем файл для надстройки и папку ШАБЛОНЫ. Пользователи устанавливают надстройки и должны указать папку ШАБЛОНЫ, чтобы данные надстройки работали верно.
В своей практике у меня менеджерам скидывают всегда обнуленную книгу. Т.е. без выбора пути.
А как можно так устроить? У нас смысл такой. Есть папка ШАБЛОНЫ и в ней находятся файлы для формирования документов. Всем скидываем файл для надстройки и папку ШАБЛОНЫ. Пользователи устанавливают надстройки и должны указать папку ШАБЛОНЫ, чтобы данные надстройки работали верно.
Есть еще какие-либо упрощенные варианты действий?den45444
Перед тем как отправить пользователям надстройку - очистите ячейки в которых прописаны пути. Менеджер получит надстройку - запустит - данные заполнятся. А в процедурах обращайтесь к этой ячейке и считывайте с нее данные.
Сделать по коду KSV, но если не заполнять переменную при загрузке надстройки - тогда нужно вставлять процедуру обновления папки из реестра в каждой процедуре. Если вдруг возникнут ошибки при выполнении макроса - переменная слетит - ячейка останется. Выбирать Вам
Перед тем как отправить пользователям надстройку - очистите ячейки в которых прописаны пути. Менеджер получит надстройку - запустит - данные заполнятся. А в процедурах обращайтесь к этой ячейке и считывайте с нее данные.
Сделать по коду KSV, но если не заполнять переменную при загрузке надстройки - тогда нужно вставлять процедуру обновления папки из реестра в каждой процедуре. Если вдруг возникнут ошибки при выполнении макроса - переменная слетит - ячейка останется. Выбирать Вам SLAVICK
Иногда все проще чем кажется с первого взгляда.
Сообщение отредактировал SLAVICK - Четверг, 24.09.2015, 14:55