質問

Access 2010 64bitのオープンファイルダイアログを取得するにはどうすればよいですか?通常、私は一般的なダイアログコントロールを使用しますが、それは32ビットであり、アクセス2010 64ビットで使用することはできません。

役に立ちましたか?

解決 4

この男には、ファイルを開くのに64ビット互換性のあるコードを生成するツールがあります。フリーウェアです。

http://www.avenius.de/en/index.php?products:idbe_tools

これがうまくいった唯一のことでした。

他のヒント

ビルトインファイルダイアログを使用できます。 Access 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年以降のランタイムまたはレギュラーエディションで機能し、Access 2010の32ビットまたは64ビットエディションでも機能します。

API呼び出しの単なるラッパーであるため、オープンファイルダイアログにコントロールを使用したことはありません。標準のWindowsファイル]を呼び出してください[]ダイアログボックスを開きます さらに、コントロールを避けるために最善を尽くします。

私は長い間この問題に取り組んでいました...

あなたが上記のことを言ったことはすべてうまくいきますが、追加する最後の作品が1つあります... with ofn宣言の下にあなたは変更する必要があります

.lStructSize = Len(ofn)

.lStructSize = LenB(ofn)

そして、すべてが機能します。

まず第一に、「Commondialogクラス」は、32ビットバージョンのオフィスでも機能していないようです。同じOLEDBエラーが発生します。コメンターの1人が指摘しているように、これはあなたが使用すべきコントロールではありません。また、使用できる別のActiveXコントロールがあるかもしれませんが、データベースを展開したいすべてのマシンで利用できるという保証はありません。私の開発ボックスには、オフィスやその他のプログラムに加えて、Visual Studio 6、vs 2008、およびVS 2010があります。これらはすべて、典型的なユーザーが予想できないActiveX DLLを提供します。さらに、これらのライブラリの多くは再配分できないか、単にトラブルの価値がないかもしれないユニークなインストールハードルを提起します。

最も単純で最も普遍的なソリューションは、Windows APIからオープンダイアログを呼び出すことです。 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内から呼び出すことができるヘルパー関数の内部にこの混乱全体を包みました。パラメータとして、[オープンファイル]ダイアログに設定する必要があるプロパティを受け入れ、Windows API自体を呼び出すことを処理し、ユーザーが選択したファイルへのフルパスまたは空の文字列(空の文字列)のいずれかを返します(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

うわー、それは長くなりました。コピーしてモジュールに貼り付ける必要がある宣言がたくさんありますが、実際に対処しなければならないインターフェイスは驚くほど簡単です。これは、コードで実際にこれを使用して[ファイル]ダイアログを表示し、ファイルへのパスを取得する方法のサンプルです。

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エディターを開き、アクセスのマクロを書き込む方法を見つけようとすることでした。リボンは、「貼り付け」と「保存」にメニュープライマリを使用する人々にとって大きな発明かもしれませんが、なんと苦痛です。私は一日中ソフトウェアを使って費やしていますが、まだ物を見つけることができません。 [/暴言

64ビットアクセスの詳細を逃しました。あなたがそれを実行する必要があることは非常にありそうもないが、もしあなたがいるなら、ここにあなたが仕事のためにあなたのAPI呼び出しを変更する方法を説明するあなたの考慮のための記事を紹介します - あなたは新しい長いポインターデータタイプを使用する必要があります:

オフィス2010の32ビットと64ビットバージョンの間の互換性

それに応じてAPIコードを変更すると、64ビットアクセスで正常に動作するはずです。

ただし、なぜ64ビットアクセスを使用しているのかを本当に尋ねる必要があります。 MSが、必要な理由がない場合がない限り、64ビットオフィスを使用することはまったく推奨されていません(特に複雑なExcelスプレッドシートモデルのようなものに対して、提供する追加のメモリを使用する必要があるなど)。アクセスは、64ビットへの変換から多くの利益を得るアプリの1つではありません。

主題の詳細な議論:

要するに、ほとんどの人は、あなたが遭遇した理由のために、64ビットのオフィスを運営すべきではありません。それは、32ビットコンポーネントの外部依存関係を備えたレガシーコードとAPIを失敗させます。

Excel 2013の64ビットバージョンでこの問題を解決することに取り組んでいます。

の組み合わせ...

  1. を使用して LongPtr 3つのアイテムのデータ型(hwndOwner, hInstance, lpfnHook) の中に OPENFILENAME に渡された構造 GetOpenFileNameA
  2. 置き換えます Len で機能します LenB 機能のサイズを取得するとき OPENFILENAME 構造(Max Albaneseが言及したように)

...ここに文書化されたガイダンスのおかげで、トリックをしました:https://gpgonaccess.blogspot.co.uk/2010/03/work-inprogress-and-64-bit-vba.html

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top