Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Диалог открытия файла, выбора папки / 20 сообщений из 20, страница 1 из 1
18.11.2015, 18:58
    #39107130
xax_nv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диалог открытия файла, выбора папки
Приветствую всех!
Давно и успешно использую код, основанный на примере отсюда: 2867129 .
В качестве значения strInitialDir всегда указывал имя конкретного диска или конкретной папки. Но появилась потребность указать в качестве начальной области поиска "Мой компьютер". Облазил весь форум, но так и не нашел как задать в этом случае strInitialDir?

Сильно не пинайте, сделайте скидку на возраст. :)
...
Рейтинг: 0 / 0
18.11.2015, 19:24
    #39107151
guest_rusimport
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диалог открытия файла, выбора папки
xax_nv,
зависит от операционки , например в Win 7 это - C:\Users\Имя пользователя\Desktop , проделай такой трюк - жмешь Пуск-Компьютер, жмакаешь на кпопку мыши и тащишь Компьютер на рабочий стол, на рабочем столе создается при этом ярлык Компьютер , жмешь на нем правой кнопкой мыши и лезешь в свойства, на вкладке "Общие" указано "Расположение", это и есть путь к папке "Мой компьютер" :)
...
Рейтинг: 0 / 0
18.11.2015, 19:42
    #39107163
xax_nv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диалог открытия файла, выбора папки
Спасибо за отклик!
К сожалению, на вкладке "Общие" указано расположение Ярлыка, а не самой папки. Да и путь этот для конкретного компьютера. Путь именно к папке Мой компьютер есть на вкладке Ярлык под кнопкой Расположение файла, но опять же на конкретном компьютере.
...
Рейтинг: 0 / 0
18.11.2015, 20:51
    #39107197
guest_rusimport
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диалог открытия файла, выбора папки
xax_nv,
если интересует диалог выбора папки, то тогда может использовать вариант, предложенный Joss-ом
Код: 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.
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.
Public Function fnGetFolder() As String

 Dim WSHShell As Object, objFolder As Object
 Dim P1, P2
 'Некоторые значения констант:
 ' P1=0 - отображаются Рабочий стол, Мой компьютер, Сеть и "Корзина"
 ' P1=1 - "Корзина" не отображается
' P1=2 - "Корзина" отображается, в "Моем компьютере" выводится дополнительно "Панель Управления"
 ' P2 определяет верхний уровень отображения. Его можно задать как строку символов
' Пример - "C:\". Или числом. Проверено для ХР
' Р2=0 - Рабочий стол P2=10 - Корзина
' P2=1 - Интернет Explorer (недопустимо) P2=11 - Главное меню
' P2=2 - Программы Р2=12 - Рабочий стол
' P2=3 - Панель управления (недопустимо) Р2=13 - Моя музыка
' P2=4 - Принтеры и факсы (недопустимо) Р2=14 - Мои видеозаписи
' P2=5 - Мои Документы Р2=15 - Рабочий стол
' P2=6 - Избранное Р2=16 - Рабочий стол
' P2=7 - Автозагрузка Р2=17 - Мой Компьютер
' P2=8 - недавние Документы Р2=18 - Сетевой окружение
' P2=9 - SendTo Р2=19 - NetHood
 ' Р2=20 - Fonts Р2=21 - Templates
 ' Более подробную информацию об объекте можно найти в документации (EN)

 On Error GoTo fnGetFolder_Error

 P1 = 0
 P2 = 17

 Set WSHShell = CreateObject("Shell.application")
 Set objFolder = WSHShell.BrowseForFolder(0, "Выбор папки", P1, P2)
 fnGetFolder = objFolder.self.Path
 ' имя папки содержится в objFolders.Title
 Set WSHShell = Nothing
 Set objFolder = Nothing

 On Error GoTo 0
Exit_fnGetFolder:
 Exit Function

fnGetFolder_Error:

 Set WSHShell = Nothing
 Set objFolder = Nothing
 Select Case Err.Number
 Case 91
 fnGetFolder = ""
 Resume Exit_fnGetFolder
 Case Else
 MsgBox "Ошибка " & Err.Number & " (" & Err.Description & ") в процедуре fnGetFolder"
 Resume Exit_fnGetFolder
 End Select

 End Function
...
Рейтинг: 0 / 0
18.11.2015, 21:34
    #39107214
xax_nv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диалог открытия файла, выбора папки
Спасибо, попробую.
...
Рейтинг: 0 / 0
19.11.2015, 11:25
    #39107519
xax_nv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диалог открытия файла, выбора папки
Как диалог выбора папки применить можно. Но мне нужен еще и диалог выбора файла, и в нем тоже желательно начальной папкой задать Мой компьютер.
Пытался задать путь через поиск специальных папок, все ищет, кроме Мой компьютер и Сетевое окружение.
...
Рейтинг: 0 / 0
19.11.2015, 14:14
    #39107768
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диалог открытия файла, выбора папки
xax_nv,
В левом окне "Мой компьютер, а в правом Вы определяете что.(Вашу хотелку полностью не осуществил-только так)
В модуле:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
                (ByVal Hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _
                ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Public Const SW_SHOWMAXIMIZED = 3
Public Const SW_SHOWDEFAULT = 10
Public Const SW_SHOWNOACTIVATE = 4
Public Const SW_SHOWNORMAL = 1

Function StartOfFile(strNameFile As String)
Dim intResult As Integer
intResult = ShellExecute(Application.hWndAccessApp, "open", strNameFile, 0, 0, SW_SHOWNORMAL)
If intResult = 31 Then
    MsgBox "незарегистрированный тип"
End If
End Function

на событии:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Dim fd As FileDialog
Dim vrtSelectedItem As Variant, myPath
Set fd = Application.FileDialog(3)
   With fd
       .InitialFileName = "d:\excel\" 'по этому пути правое окно
       If .Show = -1 Then
          For Each vrtSelectedItem In .SelectedItems
                myPath = vrtSelectedItem 'путь к выбранному файлу
            Next vrtSelectedItem
        End If
      End With
 Set fd = Nothing
 StartOfFile (myPath)
...
Рейтинг: 0 / 0
19.11.2015, 14:22
    #39107779
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диалог открытия файла, выбора папки
Диалог выбора папки и диалог выбора файла - это разные операции. Вариантов вызова диалога выбора файла - множество. Вот один из них
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  Dim dlgOpenFile As Object ' FileDialog
  Set dlgOpenFile = Application.FileDialog(4) 'msoFileDialogFolderPicker
  With dlgOpenFile
    .Filters.Clear
    .InitialFileName = CurrentProject.Path
    .AllowMultiSelect = False
    .Title = "ляляля"
    If (.Show = -1) And (.SelectedItems.Count > 0) Then
      МаёПоле.Value = .SelectedItems(1)
    End If
  End With
  Set dlgOpenFile = Nothing

А можно так Диалог выбора файла Вариант 2 ( by АлексейЕ )
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Public Sub test_dialog2()  
Dim strFile As String, strFilter As String  
strFilter = "MS Access Database (*.mdb)|*.mdb|Add-ins (*.mda)|*.mda|MDE-Files (*.mde)|*.mde|All Files (*.*)|*.*||"  
WizHook.Key = 51488399  
WizHook.GetFileName 0, "AppName", "DlgTitle", "", strFile, "c:\", strFilter, 0, 0, 0, True  
MsgBox strFile  
End Sub  


Хотя лично я предпочитаю Вариант 3 (WinApi)
Код: 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.
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.
'--- модуль api_filedialog ------------------------  
Option Compare Database  
Option Explicit  
'Немножко адаптированный способ кедзо  
'оригинал: http://www.sql.ru/forum/actualthread.aspx?tid=113776&hl=declare+filedialog#874185  
' Вызов диалога:  
' strFile = InputFile("Загрузка документа", "Текстовые файлы (*.txt)" & vbNullChar & "*.txt" & vbNullChar & vbNullChar , "\\server\c")  
' If strFile <> "" Then ЗАГРУЖАЙСЯ (strFile)  
 
 
Private Type OPENFILENAME  
lStructSize As Long  
hwndOwner As Long  
hInstance As Long  
lpstrFilter As String  
lpstrCustomFilter As String  
nMaxCustFilter As Long  
nFilterIndex As Long  
lpstrFile As String  
nMaxFile As Long  
lpstrFileTitle As String  
nMaxFileTitle As Long  
lpstrInitialDir As String  
lpstrTitle As String  
flags As Long  
nFileOffset As Integer  
nFileExtension As Integer  
lpstrDefExt As String  
lCustData As Long  
lpfnHook As Long  
lpTemplateName As String  
End Type  
 
Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenFilename As OPENFILENAME) As Long  
 
 
'Ввод имени файла  
Public Function InputFile(ByVal strTitle As String, ByVal strFilter As String, Optional strInitialDir As String) As String  
Dim lngReturn As Long  
Dim intLocNull As Integer  
Dim strTemp As String  
Dim ofnFileInfo As OPENFILENAME  
Dim strFileName As String  
 
strFileName = String(256, 0)  
 
With ofnFileInfo  
.lStructSize = Len(ofnFileInfo)  
.lpstrFile = strFileName  
.lpstrFileTitle = String(256, 0)  
.lpstrInitialDir = strInitialDir  
.hwndOwner = Application.hWndAccessApp  
.lpstrFilter = strFilter  
.nFilterIndex = 1  
.nMaxFile = Len(strFileName)  
.nMaxFileTitle = ofnFileInfo.nMaxFile  
.lpstrTitle = strTitle  
.flags = &H1000 Or &H800  
.hInstance = 0  
.lpstrCustomFilter = String(255, 0)  
.nMaxCustFilter = 255  
.lpfnHook = 0  
End With  
 
lngReturn = GetOpenFileName(ofnFileInfo)  
If lngReturn = 0 Then  
strFileName = ""  
Else  
strTemp = Trim(ofnFileInfo.lpstrFile)  
intLocNull = InStr(strTemp, Chr(0))  
If intLocNull Then  
strTemp = Left(strTemp, intLocNull - 1)  
End If  
strFileName = strTemp  
End If  
InputFile = strFileName  
End Function  
...
Рейтинг: 0 / 0
19.11.2015, 19:18
    #39108188
xax_nv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диалог открытия файла, выбора папки
Друзья, спасибо за советы и примеры!
Создать окно выбора не проблема, проблема задать strInitialDir, т.е. сделать начальной папку Компьютер (или Мой компьютер).
Видимо придется оставить выбор за юзером, на панели слева.
...
Рейтинг: 0 / 0
20.11.2015, 07:00
    #39108462
guest_rusimport
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диалог открытия файла, выбора папки
xax_nvДрузья, спасибо за советы и примеры!
Создать окно выбора не проблема, проблема задать strInitialDir, т.е. сделать начальной папку Компьютер (или Мой компьютер).
Видимо придется оставить выбор за юзером, на панели слева.
вот здесь было решение
http://stackoverflow.com/questions/19927852/vba-get-excel-filedialogopen-to-point-to-my-computer-by-default
не знаю насколько оно вам понравиться
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
23.09.2018, 12:23
    #39706519
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диалог открытия файла, выбора папки
Решил поднять старую ветку, чтоб не создавать новую.
Проблема: диалог выбора для открытия файла при помощи WinAPI. Вот текст чисто для 64-х битной версии офиса
Код: 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.
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.
Option Compare Database
Option Explicit

Type OPENFILENAME
        lStructSize As Long
        hwndOwner As LongPtr
        hInstance As LongPtr
        lpstrFilter As String
        lpstrCustomFilter As String
        nMaxCustFilter As Long
        nFilterIndex As Long
        lpstrFile As String
        nMaxFile As Long
        lpstrFileTitle As String
        nMaxFileTitle As Long
        lpstrInitialDir As String
        lpstrTitle As String
        flags As Long
        nFileOffset As Integer
        nFileExtension As Integer
        lpstrDefExt As String
        lCustData As LongPtr
        lpfnHook As LongPtr
        lpTemplateName As String
'#if (_WIN32_WINNT >= 0x0500)
        pvReserved As LongPtr
        dwReserved As Long
        FlagsEx As Long
'#endif // (_WIN32_WINNT >= 0x0500)
End Type

Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long


'---------------------------------------------------------------------------------------
' Procedure : GetDBFileNameDlg
' DateTime  : 19.01.2007 10:25
' Author      : DSonnyh
' Purpose    : Диалог задания пути к подключаемой базе MDB
'---------------------------------------------------------------------------------------
'
Public Function GetDBFileNameDlg64(hWn As Long, fName As String) As Integer

On Error GoTo Err_

Dim l As Long
Dim pOpenfilename As OPENFILENAME
Dim strPatchFi As String
Dim strFolderName As String
   
GetDBFileNameDlg64 = False
   
pOpenfilename.lStructSize = Len(pOpenfilename)
pOpenfilename.lpstrFilter = "*.mdb" + Chr(0) + "*.mdb" + Chr(0) + "*.*" + Chr(0) + "*.*" + Chr(0) + Chr(0)
pOpenfilename.lpstrFile = String(255, Chr(0))
pOpenfilename.nMaxFile = 255
pOpenfilename.lpstrTitle = "Выберите файл с таблицами базы данных"
pOpenfilename.hwndOwner = hWn
pOpenfilename.lpstrInitialDir = fName

l = GetOpenFileName(pOpenfilename)

If l <> 0 Then
   fName = pOpenfilename.lpstrFile
   GetDBFileNameDlg64 = True
End If

Exit_:
   Exit Function

Err_:
    MsgBox Err.Description
    Resume Exit_

End Function

' =======================================================
Public Sub testfo()
Dim strPath As String
Dim i As Long
        strPath = "C:\"
        i = GetDBFileNameDlg64(0, strPath)
End Sub

Запускаешь testfo() и смотришь под отладчиком. В строке
Код: vbnet
1.
   l = GetOpenFileName(pOpenfilename)

просто не происходит вызов диалога выбора файла. Программа просто проскакивает дальше без всяких сообщений.
А вот вариант АлексеяЕ работает прекрасно
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Public Sub test_dialog2()  
Dim strFile As String, strFilter As String  
strFilter = "MS Access Database (*.mdb)|*.mdb|Add-ins (*.mda)|*.mda|MDE-Files (*.mde)|*.mde|All Files (*.*)|*.*||"  
WizHook.Key = 51488399  
WizHook.GetFileName 0, "AppName", "DlgTitle", "", strFile, "c:\", strFilter, 0, 0, 0, True  
MsgBox strFile  
End Sub  

Да и вариант
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Public Sub dialog1()
  Dim dlgOpenFile As Object ' FileDialog
  Dim strFile As String
  Set dlgOpenFile = Application.FileDialog(1) 
  With dlgOpenFile
    .Filters.Clear
    .InitialFileName = CurrentProject.Path
    .AllowMultiSelect = False
    .Title = "&#235;&#255;&#235;&#255;&#235;&#255;"
    If (.Show = -1) And (.SelectedItems.Count > 0) Then
      strFile = .SelectedItems(1)
    End If
  End With
  Set dlgOpenFile = Nothing

End Sub

работает нормально.
А вот WinAPI в 64-х битной версии Access запускаться не хочет. Кто знает, в чём дело?
...
Рейтинг: 0 / 0
23.09.2018, 13:09
    #39706531
Игортан
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диалог открытия файла, выбора папки
Joss,

у меня была проблема, когда код не отрабатывал в "чужом" для системы/офиса файле. Это вин 7 и выше
Скачанный или переданный человеку от меня...
Как раз на FileDialog и перешел, что бы не "болеть"...
...
Рейтинг: 0 / 0
23.09.2018, 15:57
    #39706559
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диалог открытия файла, выбора папки
Joss
Код: vbnet
1.
Public Function GetDBFileNameDlg64(hWn As Long, fName As String) As Integer

Выделенное не того типа. Вообще-то должна быть ошибка времени исполнения связанная с неявным преобразованием типа.
...
Рейтинг: 0 / 0
23.09.2018, 15:59
    #39706561
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диалог открытия файла, выбора папки
На сайте Leadersoft.ru есть пример Диалог открытия файлов Microsoft Office Он использует ту же библиотеку

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
'Функция открытия файла
Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" ( _
         FILENAME As OPENFILENAME) As Boolean

'Функция сохранения файла
Declare Function apiGetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" ( _
         FILENAME As OPENFILENAME) As Boolean

и он работает но как-то кривовато. Пока не разобрался в чём дело
...
Рейтинг: 0 / 0
23.09.2018, 16:04
    #39706562
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диалог открытия файла, выбора папки
Joss, вот же, ты сам приводил
Joss LongLong — тип данных LongLong — это 64-разрядные целые числа со знаком, которые доступны только в 64-разрядных версиях пакета Office. Используйте тип LongLong для 64-разрядных целых чисел. Для явного присвоения значений типа LongLong (включая тип LongPtr на 64-разрядных платформах) целочисленным типам данных меньшего размера должны использоваться функции преобразования. Неявное преобразование типа LongLong в целочисленные данные меньшего размера не допускается.
Access. Переход с 32-х разрядной системы на 64-х разрядную. (Примерное реководство)
...
Рейтинг: 0 / 0
23.09.2018, 16:13
    #39706565
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диалог открытия файла, выбора папки
ПанургJoss
Код: vbnet
1.
Public Function GetDBFileNameDlg64(hWn As Long, fName As String) As Integer

Выделенное не того типа. Вообще-то должна быть ошибка времени исполнения связанная с неявным преобразованием типа. Поменял тип. Пробовал LongPtr. Ничего не изменилось. Диалог не вызывается
...
Рейтинг: 0 / 0
23.09.2018, 16:15
    #39706566
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диалог открытия файла, выбора папки
ПанургJoss, вот же, ты сам приводил
Joss LongLong — тип данных LongLong — это 64-разрядные целые числа со знаком, которые доступны только в 64-разрядных версиях пакета Office. Используйте тип LongLong для 64-разрядных целых чисел. Для явного присвоения значений типа LongLong (включая тип LongPtr на 64-разрядных платформах) целочисленным типам данных меньшего размера должны использоваться функции преобразования. Неявное преобразование типа LongLong в целочисленные данные меньшего размера не допускается.
Access. Переход с 32-х разрядной системы на 64-х разрядную. (Примерное реководство) Проморгал. Правил по живому.
...
Рейтинг: 0 / 0
23.09.2018, 16:33
    #39706568
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диалог открытия файла, выбора папки
Никаких ошибок компилятор не Выдаёт, но окно выбора файлов не выводит...
...
Рейтинг: 0 / 0
23.09.2018, 17:33
    #39706581
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диалог открытия файла, выбора папки
JossНикаких ошибок компилятор не Выдаёт, но окно выбора файлов не выводит...Увы больше предложений нет, т.к. не на чем тестировать.
...
Рейтинг: 0 / 0
11.01.2019, 21:02
    #39758620
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диалог открытия файла, выбора папки
Вот здесь 21780464 даётся ссылка на сайт, где эта проблема решена. А вот здесь - 19479482 код с этого сайта.
Проверено пол Access 2010 + 64 bit
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Диалог открытия файла, выбора папки / 20 сообщений из 20, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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