5

Access 2010 64 ビットの [ファイルを開く] ダイアログを表示するにはどうすればよいですか? 通常はコモン ダイアログ コントロールを使用しますが、これは 32 ビットであり、Access 2010 64 ビットでは使用できません。

4

7 に答える 7

9

組み込みのファイル ダイアログを使用できます。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 年以降のランタイムまたは通常版で動作し、2010 年の Access の 32 または 64 ビット版でも動作します。

于 2011-01-22T08:00:20.297 に答える
6

ファイルを開くダイアログにコントロールを使用したことはありません。これは、とにかく API 呼び出しのラッパーに過ぎないためです。 Windows の標準の [ファイルを開く/保存] ダイアログ ボックスを呼び出します 。さらに、コントロールには配布やバージョン管理の問題が発生する可能性があるため、それらを回避するために最善を尽くしています。

于 2011-01-20T19:04:41.673 に答える
2

この男は、ファイルを開くための 64 ビット互換のコードを生成するツールを持っています。フリーウェアです。

http://www.avenius.de/en/index.php?製品:IDBE_Tools

これが機能した唯一のものでした。

于 2011-01-21T13:55:45.663 に答える
1

まず、「CommonDialog クラス」は 32 ビット バージョンの Office では動作しないようです。同じ OleDb エラーが発生します。コメント投稿者の 1 人が指摘しているように、これは使用すべきコントロールではありません。使用できる別の ActiveX コントロールがあるかもしれませんが、データベースを展開するすべてのマシンで使用できるという保証はありません。私の開発ボックスには、Office やその他のプログラムに加えて、Visual Studio 6、VS 2008、および VS 2010 があり、これらはすべて、一般的なユーザーが期待できない ActiveX DLL を提供します。さらに、これらのライブラリの多くは再配布可能ではないか、単にトラブルに見合うだけの価値のない独自のインストール ハードルをもたらします。

最も単純で普遍的なソリューションは、Windows API から [開く] ダイアログを呼び出すことです。これは comdlg32.dll にあり、対象となる可能性のある Windows のすべてのバージョンで利用でき、comdlg32.ocx に依存することはありません。また、追加のモジュールをメモリにロードする必要がないため、ActiveX コントロールを使用するよりもパフォーマンスが向上します。

必要なコードもそれほど複雑ではありません。GetOpenFileName[開く] ダイアログ ボックスを作成する関数 の宣言を提供する必要があります。OPENFILENAMEこれは、ダイアログ ボックスの初期化に使用される情報を含む構造体のインスタンスである 1 つのパラメーターと、ユーザーが選択したファイルへのパスを受け取ります。したがって、この構造体の宣言も提供する必要があります。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 エディターを開いて Access でマクロを作成する方法を見つけることでした。リボンは、「貼り付け」と「保存」にメイン メニューを使用する人にとっては素晴らしい発明かもしれませんが、なんと面倒なことでしょう。私は一日中ソフトウェアを使用していますが、まだ何かを見つけることができません。[/暴言]

于 2011-01-21T01:31:29.047 に答える
0

64ビットアクセスの詳細を見逃しました。実行する可能性はほとんどありませんが、実行する場合は、API呼び出しを変更して機能させる方法を説明する検討用の記事を次に示します。新しいロングポインターデータ型を使用する必要があります。

Office2010の32ビットバージョンと64ビットバージョン間の互換性

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

しかし、64ビットアクセスを使用している理由を実際に尋ねる必要があります。MSは、64ビットOfficeを必要とする特別な理由(特に複雑なExcelスプレッドシートモデルなど、追加のメモリを使用する必要があるなど)がない限り、64ビットOfficeを使用することをまったく推奨していません。Accessは、64ビットへの変換から多くの利益を得るアプリの1つではありません。

主題の詳細な議論:

要するに、ほとんどの人は64ビットOfficeを実行するべきではありません。まさにあなたが遭遇した理由です。これにより、32ビットコンポーネントとAPIに外部依存しているレガシーコードが失敗します。

于 2011-01-22T02:10:42.070 に答える