Access 2010 64bitのオープンファイルダイアログはありますか?
-
13-10-2019 - |
質問
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つではありません。
主題の詳細な議論:
- Office2010 -64ビットバージョンについて - オフィスウォッチ
- Office 2010 64ビットのインストール - オフィスウォッチ
- オフィス32ビットまたは64ビット - どのバージョンがインストールされていますか? - オフィスウォッチ
- 同じマシンのオフィス32と64ビット - オフィスウォッチ
- Office 2010 64ビットの準備 - オフィスウォッチ
- 64ビットオフィス - トラブルの価値はありますか? - オフィスウォッチ
要するに、ほとんどの人は、あなたが遭遇した理由のために、64ビットのオフィスを運営すべきではありません。それは、32ビットコンポーネントの外部依存関係を備えたレガシーコードとAPIを失敗させます。
Excel 2013の64ビットバージョンでこの問題を解決することに取り組んでいます。
の組み合わせ...
- を使用して
LongPtr
3つのアイテムのデータ型(hwndOwner
,hInstance
,lpfnHook
) の中にOPENFILENAME
に渡された構造GetOpenFileNameA
- 置き換えます
Len
で機能しますLenB
機能のサイズを取得するときOPENFILENAME
構造(Max Albaneseが言及したように)
...ここに文書化されたガイダンスのおかげで、トリックをしました:https://gpgonaccess.blogspot.co.uk/2010/03/work-inprogress-and-64-bit-vba.html