Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/55: Рейтинг темы: голосов - 55, средняя оценка - 4.91
1 / 1 / 0
Регистрация: 09.12.2013
Сообщений: 42
1

Создать диалог выбора папки для VBA (SolidWorks 2013)

10.12.2013, 00:10. Показов 9902. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго дня! Подскажите, пожалуйста, как создать диалог выбора папки для VBA. Работаю в программе SW2013. Есть форма, в которой кнопка должна выполнять действие выбора папки и затем сохранять этот путь в переменную. Спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.12.2013, 00:10
Ответы с готовыми решениями:

Диалог для выбора папки в VBA
Доброго времени суток! Скажите, плз, как вызвать диалог для выбора каталога? Дело в том, что выбор...

Диалог для выбора сетевой папки
Существует ли диалог для выбора сетевой папки? FolderBrowserDialog у меня показывает папки на...

Как создать диалог выбора шрифта и диалог выбора цвета
как создать диалог выбора шрифта и диалог выбора цвета в wpf

Вывести диалог для выбора папки перед сохранением файла
Пишу программу блокнот на VBA. Не получается в меню при нажатии кнопки сохранить, надо чтобы...

16
Эксперт NIX
3195 / 850 / 194
Регистрация: 14.01.2013
Сообщений: 4,068
10.12.2013, 14:45 2
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Sub UseFileDialogOpen()
    Dim lngCount As Long
    ' Open the file dialog
    With Application.FileDialog(msoFileDialogOpen)
        .AllowMultiSelect = True
        .Show
        ' Display paths of each file selected
        For lngCount = 1 To .SelectedItems.Count
            MsgBox .SelectedItems(lngCount)
        Next lngCount
    End With
End Sub
Пример из справки. Правда справка для 2003 офиса. Хз, как там в SolidWorks.
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
10.12.2013, 15:02 3
Думаю это с сайта EducatedFool:
Visual Basic
1
2
3
4
5
6
7
Function GetFolderPath(Optional ByVal Title As String = "Выберите папку", Optional ByVal InitialPath As String = "c:\") As String
    GetFolderPath = "": PS = Application.PathSeparator
    With Application.FileDialog(msoFileDialogFolderPicker)
        .ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialPath
        If .Show = -1 Then GetFolderPath = .SelectedItems(1): If Not Right$(GetFolderPath, 1) = PS Then GetFolderPath = GetFolderPath & PS
    End With
End Function
0
1 / 1 / 0
Регистрация: 09.12.2013
Сообщений: 42
10.12.2013, 15:51  [ТС] 4
выделяет ": PS = Application.PathSeparator" желтым и пишет ошибку: "Object doesn't support this property or method"
0
6081 / 1325 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
10.12.2013, 16:37 5
rekord522, ребята же оговорились, что не знакомы с объектной моделью SolidWorks. Поэтому вам не обязательно копировать все с точностью до буквы.

Попробуйте сделать совсем просто:
Visual Basic
1
2
3
4
5
6
7
Sub To_Choose_A_Folder()
    With Application.FileDialog(4)
        If .Show <> False Then
            MsgBox "Выбрана папка " & .SelectedItems(1)
        End If
    End With
End Sub
С уважением,
Aksima
0
1 / 1 / 0
Регистрация: 09.12.2013
Сообщений: 42
10.12.2013, 17:01  [ТС] 6
Похоже, у Application нет таких методов, как PathSeparator и FileDialog. Кстати, прошу прощения, я не профессиональный программист, поэтому в терминах могу ошибаться. Методом я называю то, что ставится после точки "Application." Кто не знаком с объектами SolidWorks могу написать, какие методы доступны у Application.
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
10.12.2013, 17:13 7
Можете попробовать перебрать все диалоги в цикле - так можно найти нужный.

Подсказка выше.

Добавлено через 2 минуты
Например:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Sub test()
    Dim i&
    On Error Resume Next
    For i = 1 To 10
        With Application.FileDialog(i)
            If .Show <> False Then
                MsgBox "Выбрана папка " & .SelectedItems(1)
            End If
        End With
    Next
End Sub
0
1 / 1 / 0
Регистрация: 09.12.2013
Сообщений: 42
10.12.2013, 17:34  [ТС] 8
Цикл прогоняется, каждый раз происходит вход в тело цикла, те условие цикла каждый раз верно, но при этом никакого сообщения о выбранной папке не появляется, и окна с диалогом выбора папки тоже. Вообще ничего. Если закомментировать "& .SelectedItems(1)", то появляется сообщение "Выбрана папка ", но не более того
0
5562 / 1368 / 150
Регистрация: 08.02.2009
Сообщений: 4,109
Записей в блоге: 30
10.12.2013, 17:48 9
Visual Basic
1
2
3
4
Sub MSOffice_Dialog()
    Dialogs(wdDialogFileOpen).Display 'можно Show
'wdDialogFileOpen = 80 в программе Word
End Sub
Что-нибудь открывает?
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
10.12.2013, 18:01 10
А так:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Sub test()
    Dim i&
    On Error Resume Next
    For i = 1 To 100
        Err.Clear
        With Application.FileDialog(i)
            If .Show = False Then
                If Err = 0 Then MsgBox i
            End If
        End With
    Next
End Sub
0
6081 / 1325 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
10.12.2013, 22:59 11
rekord522, в поисках надежного решения вашей проблемы нашел на MSDN упоминание о Windows API функции SHBrowseForFolder, которая, как следует из ее описания, позволяет вызывать диалог для просмотра папок (и выбора нужной). Вот ссылки на использованные мной источники (правда, они на английском языке):
  1. Описание функции SHBrowseForFolder
  2. Описание структуры BROWSEINFO
  3. Описание функции SHGetPathFromIDList
Чтобы вам было легче и приятнее работать с данной функцией, я адаптировал ее для работы в среде VBA, а также вручную перевел на русский большую часть описаний флагов и элементов структуры (перевод оформлен в виде комментариев к соответствующим элементам программы). Получившийся код привожу ниже.
Назависимая от объектной модели приложения функция для просмотра папок
Visual Basic
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
Type BROWSEINFO
    hwndOwner As Long   'Указатель на родительское окно.
    pidlRoot As Long    'Идентификатор папки, с которой начинается просмотр. Если опущен,
                        'то просмотр начинается с корня всей иерархии папок локального ПК.
    pszDisplayName As String    'Указатель на буфер, который будет хранить отображемое имя
                                'папки, выбранной пользователем (без пути к папке!).
                                'Предполагается, что размер буфера равен константе MAX_PATH,
                                'определенной в заголовочном файле windows.h.
    lpszTitle As String 'Указатель на строку с завершающим нулевым символом, которая
                        'будет выведена над деревом папок в диалоговом окне. Вы можете
                        'использовать ее в качестве заголовка, или описать в ней
                        'краткую инструкцию для пользователя.
    ulFlags As Long     'Совокупность битовых флагов, задающих опции диалогового окна.
                        'Опции выражены константами, список которых приведен чуть ниже.
    lpfn As Long        'Указатель на определяемую приложением функцию обратного вызова.
    lParam As Long      'Значение, передаваемое диалоговым окном в функцию обратного вызова.
    iImage As Integer   'Целочисленное значение, хранящее системный индекс изображения,
                        'ассоциированного c выбранной папкой.
End Type
Const BIF_RETURNONLYFSDIRS As Long = &H1&   'Позволяет выбирать папки только в рамках
                                            'файловой системы локального компьютера.
Const BIF_DONTGOBELOWDOMAIN As Long = &H2&  'Позволяет не показывать сетевые папки,
                                            'находящиеся по уровню ниже определенного домена.
Const BIF_STATUSTEXT As Long = &H4&     'Добавляет окно статуса, в которое вы можете выводить
                                        'сообщения с помощью функции обратного вызова. Опция
                                        'несовместима с далоговыми окнами нового типа (т. е.
                                        'с константой BIF_NEWDIALOGSTYLE)
Const BIF_RETURNFSANCESTORS As Long = &H8&  'Позволяет выбирать только предки заданной
                                            'корневой папки в файловой системе
                                            'локального компьютера.
Const BIF_EDITBOX As Long = &H10&   'Добавить поле, в котором пользователь может ввести свое
                                    'имя папки.
Const BIF_VALIDATE As Long = &H20&  'Проверять коректность имени, введенного пользователем
                                    'в текстовое поле. При ошибке ввода вызывается функция
                                    'обратного вызова.
Const BIF_NEWDIALOGSTYLE As Long = &H40&    'Позволяет использовать новый интерфейс
                                            'дилогового окна. Несовместимо с константой
                                            'BIF_STATUSTEXT и с использованием
                                            'многопоточной системы компонентных объектов.
Const BIF_USENEWUI = BIF_EDITBOX Or BIF_NEWDIALOGSTYLE
Const BIF_BROWSEINCLUDEURLS As Long = &H80& 'Позволяет отображать в окне выбора папок
                                            'универсальный локатор ресурса (URL). Для
                                            'корректной работы данной опции должны быть
                                            'установлены также флаги BIF_USENEWUI и
                                            'BIF_BROWSEINCLUDEFILES.
Const BIF_UAHINT As Long = &H100&   'В совокупности с константой BIF_NEWDIALOGSTYLE
                                    'отображает подсказки по использованию окна. Подсказки
                                    'отображаются на месте текстового поля, поэтому опция
                                    'несовместима с константой BIF_EDITBOX.
Const BIF_NONEWFOLDERBUTTON As Long = &H200&    'Не включать в диалог опцию создания
                                                'новой папки.
Const BIF_NOTRANSLATETARGETS As Long = &H400&   'При выборе ярлыка возвращать идентификатор
                                                'ярлыка вместо идентификатора папки, на которую
                                                'он указывает.
Const BIF_BROWSEFORCOMPUTER As Long = &H1000&   'Позволяет указывать в окне выбора папки
                                                'только компьютеры.
Const BIF_BROWSEFORPRINTER As Long = &H2000&    'Позволяет указывать в окне выбора папки
                                                'только принтеры.
Const BIF_BROWSEINCLUDEFILES As Long = &H4000&  'Диалоговое окно просмотра отображает файлы.
Const BIF_SHAREABLE As Long = &H8000&           'Диалоговое окно просмотра может отображать
                                                'общие ресурсы удаленных компьютеров.
Const BIF_BROWSEFILEJUNCTIONS As Long = &H10000 'Позволяет просматривать "ложные" папки вроде
                                                '.zip-файлов или библиотек Windows 7.
'Функция для вызова диалога просмотра папок.
Declare Function SHBrowseForFolder Lib "shell32" Alias "SHBrowseForFolderA" (ByRef bif As BROWSEINFO) As Long
'Функция для перевода идентификатора папки в путь к папке.
Declare Function SHGetPathFromIDList Lib "shell32" Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As Boolean
'Функция-"обертка" диалога просмотра папок.
Function MyBrowseForFolder() As String
    Const MAX_PATH = 260 'Определение взято из windows.h.
    Dim MyBIF As BROWSEINFO, retVal As Long, success As Boolean
    Dim buffer As String, instructions As String * 47
    buffer = String(MAX_PATH, 0)
    instructions = "Пожалуйста, выберите папку, которая вам нужна." & Chr(0)
    MyBIF.pszDisplayName = buffer 'Выделяем память для хранения отображаемого имени папки.
    MyBIF.lpszTitle = instructions
    'MyBIF.ulFlags = ... 'Если хотите изменить внешний вид и/или поведение диалогового окна,
    'можете поиграться с флагами. При использовани нескольких флагов они объединяются
    'с помощью побитового ИЛИ (в VBA его функцию выполняет оператор Or).
    retVal = SHBrowseForFolder(MyBIF) 'Начинаем просмотр папок. После того, как пользователь
    'нажмет кнопку "Ок" или "Отмена", в переменную retVal будет передан уникальный системный
    'идентификатор папки, выбранной пользователем, или значение, равное нулю, в случае, если
    'пользователь ничего не выбрал.
    If retVal Then
        buffer = String(32000, 0)
        success = SHGetPathFromIDList(retVal, buffer) 'По идентификатору находим путь к папке.
        If success Then
            buffer = Left(buffer, InStr(buffer, Chr(0)) - 1) 'Отбрасываем нулевые символы.
            MyBrowseForFolder = buffer 'Возвращаем результат.
        Else
            Err.Raise vbObjectError + 2, "MyBrowseForFolder()", "Не удалось получить путь к папке по идентификатору."
        End If
    Else
        Err.Raise vbObjectError + 1, "MyBrowseForFolder()", "Выбор папки отменен пользователем."
    End If
End Function
'Пример использования функции для запуска диалога выбора папки.
Sub TellChosenFolderAndPath()
    Dim s As String
    On Error GoTo ErrHandle
    s = MyBrowseForFolder
    On Error GoTo 0
    MsgBox "Вы выбрали папку: " & s, vbInformation, "Ваш выбор"
    Exit Sub
 
ErrHandle:
    Select Case Err.Number
        Case vbObjectError + 1
            MsgBox Err.Description, vbInformation, "Операция прервана"
        Case vbObjectError + 2
            MsgBox Err.Description, vbExclamation, "Неудача"
        Case Else
            MsgBox Err.Number & vbCr & Err.Description, vbCritical
    End Select
End Sub

Надеюсь, теперь у вас все получится. Даже не надеюсь, а почти уверен - ведь вероятность того, что у вас есть Windows, очень высока...

С уважением,
Aksima
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
10.12.2013, 23:08 12
Такой ещё вариант (замените Application.PathSeparator на "\", если не работает):

Visual Basic
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
27
28
Sub tt()
    MsgBox BrowseForFolderShell
End Sub
 
Function BrowseForFolderShell() As String
    Dim objShell As Object, objFolder As Object
    Set objShell = CreateObject("Shell.Application")
    ' Раскомментируйте следующую строку, чтобы начать
    ' обзор папок с рабочего стола Windows.
    'Set objFolder = objShell.BrowseForFolder(0, "Пожалуйста, выберите папку", 0, 0)
    ' Укажите папку, с которой нужно начать обзор.
    Set objFolder = objShell.BrowseForFolder(0, "Пожалуйста, выберите папку", 0, "c:\")
    If (Not objFolder Is Nothing) Then
        On Error Resume Next
        If IsError(objFolder.Items.Item.Path) Then _
           BrowseForFolderShell = CStr(objFolder): GoTo Here
        On Error GoTo 0
        If Len(objFolder.Items.Item.Path) > 3 Then
            BrowseForFolderShell = objFolder.Items.Item.Path _
                                   & Application.PathSeparator
        Else
            BrowseForFolderShell = objFolder.Items.Item.Path
        End If
    Else: Application.ScreenUpdating = True: End
    End If
Here:
    Set objFolder = Nothing: Set objShell = Nothing
End Function
1
1 / 1 / 0
Регистрация: 09.12.2013
Сообщений: 42
11.12.2013, 00:33  [ТС] 13
Sasha_Smirnov , открывает окно с ошибкой "Sub or Function not defined". При этом выделяется Dialogs

Добавлено через 26 минут
Hugo121, все прекрасно работает, спасибо! Есть некоторые моменты:
1. В первоначальном варианте, как написано у Вас открывается диалог выбора папки. Затем, если нажать "Отмена", то выделяется ": Application.ScreenUpdating = True" с комментарием Object doesn't support this property or method. Если выбрать какую-нибудь папку и нажать ОК, то с теми же комментариями выделяется "BrowseForFolderShell = objFolder.Items.Item.Path _
& Application.PathSeparator". То есть в любом случае программа вылетает.
2. Замена "Application.PathSeparator на "\"" - спасает дело, действительно.
3. Если закомментировать соответственно строку "Else: Application.ScreenUpdating = True: End", то все работает. Вопрос - насколько это критично?
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
11.12.2013, 00:46 14
Application.ScreenUpdating - это экселевское обновление экрана (изменения на листе). Очевидно что в солидворке этого нет, или называется иначе, или вообще не нужно. Т.е. убирайте.
0
1 / 1 / 0
Регистрация: 09.12.2013
Сообщений: 42
11.12.2013, 00:48  [ТС] 15
Aksima, выдает ошибку на объявление функций Declare Function SHBrowseForFolder и Declare Function SHGetPathFromIDList:
"The code in this project must be updated for use on 64-bit systems. Please review and update Declare statements and then mark them with the PtrSafe attribute"
0
6081 / 1325 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
11.12.2013, 10:21 16
rekord522, если у вас 64-битная система, то необходима дополнительная адаптация API-функций под работу на 64-битной системе.

Полезную информацию о том, как это сделать, вы можете найти в недавней теме Адаптация кода для 64 битных систем (x64).

С уважением,
Aksima
0
1 / 1 / 0
Регистрация: 09.12.2013
Сообщений: 42
11.12.2013, 11:29  [ТС] 17
Aksima, разобрался, все прекрасно работает, спасибо!!

Отдельное спасибо всем, кто не прошел мимо и заинтересовался проблемой!
0
11.12.2013, 11:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.12.2013, 11:29
Помогаю со студенческими работами здесь

Копирование файлов и диалог выбора папки с кнопкой "Создать папку"
Задача довольно популярная, но на просторах интернета лежат примеры для старых версий Builder,...

Как в Delfi 7 при нажатии Batton открыть диалог выбора папки в подкаталоге программы и сохранить путь папки в Edit
Как в Delfi 7 при нажатии Batton открыть диалог выбора папки в подкаталоге программы и сохранить...

Диалог выбора папки
Привет. Как мы знаем есть диалог открытия(open dialog), а можете дать мне типо такого же диалого...

Диалог выбора папки
Подскажите пожалуйста, в Delphi 2007, для Windows 7 - есть ли диалог выбора не файла, а целой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru