YK社に納めている Microsoft Access の 住所録.mdb の改廃履歴を見ると、平成12年,西暦2000年に作ったことになっている。Access のバージョンは 97 だったと思う。
YK社の事情で Access2007 に変えたが、どうも様子がおかしい。Access2003 ではまともに動くのに、2007 ではエラーが出る。
Access2003ではチャンと動いているのですが...
- Microsoft サポートオンラインの「Access でクエリを実行するとエラー メッセージ "指定されたデータ量がフィールド サイズを超えています" が表示される」を読んでも、事情が違うようだ。
プログラムを追うと、どうやら WindowsAPI の GetOpenFileName が絡んでいるようだ。(ギャ〜〜〜)
- はじめに
この資料では、Microsoft Office Access 2003 または Microsoft Office Access 2007 で共通ダイアログ API を、Microsoft Office 2000 Developer Edition または Microsoft Office XP Developer Edition のみに含まれている共通ダイアログ ボックス機能の代わりに使用する方法について説明します。- 詳細
共通ダイアログ機能を置き換える手順
- Microsoft Office Access 2003
- Command1_Click プロシージャのコードを、次のように変更します。
Private Sub Command1_Click() Me!Text1 = LaunchCD(Me) End Sub
- [挿入]メニューの[標準モジュール]をクリックし、次のコードを Module1 に挿入します。
Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _ "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long 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 Function LaunchCD(strform As Form) As String Dim OpenFile As OPENFILENAME Dim lReturn As Long Dim sFilter As String OpenFile.lStructSize = Len(OpenFile) OpenFile.hwndOwner = strform.hwnd sFilter = "All Files (*.*)" & Chr(0) & "*.*" & Chr(0) & _ "JPEG Files (*.JPG)" & Chr(0) & "*.JPG" & Chr(0) OpenFile.lpstrFilter = sFilter OpenFile.nFilterIndex = 1 OpenFile.lpstrFile = String(257, 0) OpenFile.nMaxFile = Len(OpenFile.lpstrFile) - 1 OpenFile.lpstrFileTitle = OpenFile.lpstrFile OpenFile.nMaxFileTitle = OpenFile.nMaxFile OpenFile.lpstrInitialDir = "C:\" OpenFile.lpstrTitle = "Select a file using the Common Dialog DLL" OpenFile.flags = 0 lReturn = GetOpenFileName(OpenFile) If lReturn = 0 Then MsgBox "A file was not selected!", vbInformation, _ "Select a file using the Common Dialog DLL" Else LaunchCD = Trim(Left(OpenFile.lpstrFile, InStr(1, OpenFile.lpstrFile, vbNullChar) - 1)) End If End Function
- Microsoft Office Access 2007
- 次のコード サンプルのように、Command1_Click プロシージャのコードを変更します。
Private Sub Command1_Click() Me!Text1 = LaunchCD(Me) End Sub
- [挿入]メニューの[標準モジュール]をクリックし、次のコード サンプルを使用環境に合わせて修正して Module1 に挿入します。
Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _ "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long 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 Function LaunchCD(strform As Form) As String Dim OpenFile As OPENFILENAME Dim lReturn As Long Dim sFilter As String OpenFile.lStructSize = Len(OpenFile) OpenFile.hwndOwner = strform.hwnd sFilter = "All Files (*.*)" & Chr(0) & "*.*" & Chr(0) & _ "JPEG Files (*.JPG)" & Chr(0) & "*.JPG" & Chr(0) OpenFile.lpstrFilter = sFilter OpenFile.nFilterIndex = 1 OpenFile.lpstrFile = String(257, 0) OpenFile.nMaxFile = Len(OpenFile.lpstrFile) - 1 OpenFile.lpstrFileTitle = OpenFile.lpstrFile OpenFile.nMaxFileTitle = OpenFile.nMaxFile OpenFile.lpstrInitialDir = "C:\" OpenFile.lpstrTitle = "Select a file using the Common Dialog DLL" OpenFile.flags = 0 lReturn = GetOpenFileName(OpenFile) If lReturn = 0 Then MsgBox "A file was not selected!", vbInformation, _ "Select a file using the Common Dialog DLL" Else LaunchCD = Trim(Left(OpenFile.lpstrFile, InStr(1, OpenFile.lpstrFile, vbNullChar) - 1)) End If End Function
Access2003 と 2007 でどこがどう違うのか ‥‥ 調べる根気がないなぁ〜 あ〜 もうやになった...