Вопрос

Как получить диалог с открытым файлом для 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-битный.

Подробное обсуждение предмета:

Короче говоря, большинство людей не должны управлять 64-разрядным офисом, именно по той причине, с которой вы столкнулись-это вызывает унаследованный код с внешними зависимостями от 32-разрядных компонентов и API, чтобы провалиться.

Я только что боролся с решением этой проблемы в 64-разрядной версии Excel 2013.

Комбинация ...

  1. С использованием LongPtr Тип данных для 3 элементов (hwndOwner, hInstance, lpfnHook) в OPENFILENAME Структура передана GetOpenFileNameA
  2. Замена Len функционировать с LenB функция при получении размера OPENFILENAME Структура (как упоминалось Максом Альбанезе)

... Сделал трюк, благодаря руководству задокументировано здесь:https://gpgonaccess.blogspot.co.uk/2010/03/work-in-progress-and-64-bit-vba.html

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top