Есть ли диалог с открытым файлом для Access 2010 64bit?
-
13-10-2019 - |
Вопрос
Как получить диалог с открытым файлом для Access 2010 64bit? Обычно я использовал бы общий диалоговый элемент управления, но он составляет 32 бит и не может использоваться с 64 -битным Access 2010.
Решение 4
У этого парня есть инструмент, который генерирует код, который является 64 -битным совместимым для открытия файла. Это бесплатное программное обеспечение.
http://www.avenius.de/en/index.php?products:idbe_tools
Это было единственное, что сработало.
Другие советы
Вы можете использовать встроенный диалог файла. Это было там с доступа 2003 года.
Dim f As FileDialog
Set f = Application.FileDialog(msoFileDialogFilePicker)
f.Show
MsgBox "file choose was " & f.SelectedItems(1)
Вы можете поздно привязать, если хотите:
Выше потребности: Microsoft Office 14.0 Библиотека объектов
Если вы удалите ссылку на библиотеку объектов 14.0, то следующий код будет работать без каких -либо ссылок:
Dim f As Object
Set f = Application.FileDialog(3)
f.AllowMultiSelect = True
f.Show
MsgBox "file choosen = " & f.SelectedItems.Count
Таким образом, выше работает во время выполнения или регулярного издания с 2003 года, а также работает в 32 или 64 -битном выпуске Access 2010.
Я никогда не использовал элемент управления для диалогового окна открытого файла, так как это просто обертка для вызова API.Вызовите диалоговое окно «Открыть/сохранение стандартного файла Windows». Кроме того, могут возникнуть проблемы с дистрибуцией и версиями с элементами управления, поэтому я стараюсь избегать их.
Я долго работал с этой проблемой ...
Все, что вы сказали выше, работает, но есть одна последняя часть, которую нужно добавить ... под объявлением с Ofn вам нужно изменить
.lStructSize = Len(ofn)
к
.lStructSize = LenB(ofn)
И тогда все работает.
Прежде всего, «класс Commondialog», похоже, даже не работает на 32-разрядной версии Office. Это дает ту же ошибку OLEDB. Как указывает один из комментаторов, это не тот элемент управления, который вы должны использовать. И хотя может быть еще один элемент управления ActiveX, который вы могли бы использовать, на самом деле нет никакой гарантии, что оно будет доступно на каждой машине, на которой вы хотите развернуть свою базу данных. My Dev Box имеет Visual Studio 6, против 2008 и против 2010 года, в дополнение к офисным и другим программам, которые предоставляют ActiveX DLL, которые нельзя ожидать типичного пользователя. Кроме того, многие из этих библиотек не могут быть перераспределены или представляют уникальные препятствия для установки, которые могут просто не стоить проблем.
Безусловно, самое простое, наиболее универсальное решение - вызвать открытый диалог из API Windows. Он расположен в Comdlg32.dll, который доступен на каждой версии Windows, которые вы можете быть нацелены, и не навязывает никаких зависимостей от comdlg32.ocx. Он также обеспечивает лучшую производительность, чем использование элемента управления ActiveX, потому что он не требует дополнительного модуля, чтобы загружать в память.
Требуемый код тоже не очень сложный. Вам нужно предоставить объявление для функции GetOpenFileName
, который создает открытое диалоговое окно. Требуется один параметр, экземпляр OPENFILENAME
структура которая содержит информацию, используемую для инициализации диалогового окна, а также получение пути к файлу, выбранному пользователем. Таким образом, вам также необходимо предоставить объявление этой структуры. Код в VBA будет выглядеть примерно так:
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" (ByRef lpofn As OPENFILENAME) As Long
Есть также несколько констант, которые вы можете пройти в качестве флагов, чтобы настроить поведение диалога. Для полноты, вот полный список:
Private Const OFN_ALLOWMULTISELECT As Long = &H200
Private Const OFN_CREATEPROMPT As Long = &H2000
Private Const OFN_ENABLEHOOK As Long = &H20
Private Const OFN_ENABLETEMPLATE As Long = &H40
Private Const OFN_ENABLETEMPLATEHANDLE As Long = &H80
Private Const OFN_EXPLORER As Long = &H80000
Private Const OFN_EXTENSIONDIFFERENT As Long = &H400
Private Const OFN_FILEMUSTEXIST As Long = &H1000
Private Const OFN_HIDEREADONLY As Long = &H4
Private Const OFN_LONGNAMES As Long = &H200000
Private Const OFN_NOCHANGEDIR As Long = &H8
Private Const OFN_NODEREFERENCELINKS As Long = &H100000
Private Const OFN_NOLONGNAMES As Long = &H40000
Private Const OFN_NONETWORKBUTTON As Long = &H20000
Private Const OFN_NOREADONLYRETURN As Long = &H8000&
Private Const OFN_NOTESTFILECREATE As Long = &H10000
Private Const OFN_NOVALIDATE As Long = &H100
Private Const OFN_OVERWRITEPROMPT As Long = &H2
Private Const OFN_PATHMUSTEXIST As Long = &H800
Private Const OFN_READONLY As Long = &H1
Private Const OFN_SHAREAWARE As Long = &H4000
Private Const OFN_SHAREFALLTHROUGH As Long = 2
Private Const OFN_SHAREWARN As Long = 0
Private Const OFN_SHARENOWARN As Long = 1
Private Const OFN_SHOWHELP As Long = &H10
Private Const OFS_MAXPATHNAME As Long = 260
И для удобства я завершил весь этот беспорядок в вспомогательную функцию, которую вы можете позвонить из VBA. Он принимает в качестве параметров, свойства, которые вам чаще всего необходимо установить для диалога с открытым файлом, обрабатывает вызов самого API Windows, а затем возвращает либо полный путь к файлу, выбранному пользователем, либо пустой строкой (vbNullString
) Если пользователь нажал кнопку «Отмена». Вы можете проверить возвращаемое значение в вызовом коде, чтобы определить, какой ход действий следует предпринять.
'This function shows the Windows Open File dialog with the specified
' parameters, and either returns the full path to the selected file,
' or an empty string if the user cancels.
Public Function OpenFile(ByVal Title As String, ByVal Filter As String, _
ByVal FilterIndex As Integer, ByVal StartPath As String, _
Optional OwnerForm As Form = Nothing) As String
'Create and populate an OPENFILENAME structure
'using the specified parameters
Dim ofn As OPENFILENAME
With ofn
.lStructSize = Len(ofn)
If OwnerForm Is Nothing Then
.hwndOwner = 0
Else
.hwndOwner = OwnerForm.Hwnd
End If
.lpstrFilter = Filter
.nFilterIndex = FilterIndex
.lpstrFile = Space$(1024) & vbNullChar & vbNullChar
.nMaxFile = Len(ofn.lpstrFile)
.lpstrFileTitle = vbNullChar & Space$(512) & vbNullChar & vbNullChar
.nMaxFileTitle = Len(.lpstrFileTitle)
.lpstrInitialDir = StartPath & vbNullChar & vbNullChar
.lpstrTitle = Title
.flags = OFN_FILEMUSTEXIST
End With
'Call the Windows API function to show the dialog
If GetOpenFileName(ofn) = 0 Then
'The user pressed cancel, so return an empty string
OpenFile = vbNullString
Else
'The user selected a file, so remove the null-terminators
' and return the full path
OpenFile = Trim$(Left$(ofn.lpstrFile, Len(ofn.lpstrFile) - 2))
End If
End Function
Вау, это в итоге оказалось длинным. Есть много заявлений, которые вам нужно скопировать и вставить в модуль, но интерфейс, с которым вам действительно нужно иметь дело, удивительно прост. Вот пример того, как вы можете использовать это в своем коде, чтобы показать диалог open file и получить путь к файлу:
Public Sub DoWork()
'Set the filter string (patterns) for the open file dialog
Dim strFilter As String
strFilter = "Text Files (*.txt)" & vbNullChar & "*.txt*" & vbNullChar & _
"All Files (*.*)" & vbNullChar & "*.*" & vbNullChar & vbNullChar
'Show the open file dialog with the custom title, the filters specified
' above, and starting in the root directory of the C: drive.
Dim strFileToOpen As String
strFileToOpen = OpenFile("Choose a file to open", strFilter, 0, "C:\")
'See if the user selected a file
If strFileToOpen = vbNullString Then
MsgBox "The user pressed the Cancel button."
Else
MsgBox "The user chose to open the following file: " & _
vbNewLine & strFileToOpen
End If
End Sub
Самая длинная часть написания и тестирования этого решения фактически пыталась найти, как открыть редактор VBA и написать макрос в доступе. Лента может быть отличным изобретением для людей, которые используют основное меню для «пасты» и «Сохранить», но какая боль. Я провожу весь день, используя программное обеспечение, и я до сих пор не могу найти вещи. [/rant
Я пропустил 64-битную деталь доступа. Маловероятно, что вы должны его запустить, но если вы есть, вот статья для вашего рассмотрения, в которой объясняется, как вы должны изменить свой призыв API на работу - вы должны использовать новый тип данных длинного указателя:
Совместимость между 32-битными и 64-битными версиями Office 2010
Если вы соответственно измените код API, он должен работать нормально на 64-разрядном доступе.
Но вы должны действительно спросить, почему вы используете 64-битный доступ. На самом деле не рекомендуется MS, что кто-либо использует 64-битный офис, если у них нет конкретных причин, по которым им это нужно (например, необходимость использовать дополнительную память, которую он предоставляет, особенно для таких вещей, как сложные модели электронных таблиц Excel). Доступ, безусловно, не является одним из приложений, которые в значительной степени приносят пользу от конверсии в 64-битный.
Подробное обсуждение предмета:
- Office 2010 - О 64 -битной версии - Office Watch
- Установка Office 2010 64 -бит - Office Watch
- Office 32-битный или 64-битный-какая версия установлена? - Офисные часы
- Офис 32 и 64 бит на той же машине - Office Watch
- Подготовка к Office 2010 64 -бит - Office Watch
- 64 -битный офис - стоит ли проблемы? - Офисные часы
Короче говоря, большинство людей не должны управлять 64-разрядным офисом, именно по той причине, с которой вы столкнулись-это вызывает унаследованный код с внешними зависимостями от 32-разрядных компонентов и API, чтобы провалиться.
Я только что боролся с решением этой проблемы в 64-разрядной версии Excel 2013.
Комбинация ...
- С использованием
LongPtr
Тип данных для 3 элементов (hwndOwner
,hInstance
,lpfnHook
) вOPENFILENAME
Структура переданаGetOpenFileNameA
- Замена
Len
функционировать сLenB
функция при получении размераOPENFILENAME
Структура (как упоминалось Максом Альбанезе)
... Сделал трюк, благодаря руководству задокументировано здесь:https://gpgonaccess.blogspot.co.uk/2010/03/work-in-progress-and-64-bit-vba.html