- 締切済み
GetOpenFileName 開かない
win7 32bitで使用していたVBAが、win10 64bitで動作せず、困っております。 ダイアログが開かないまま先に進んでしまうのですが、どのように修正すれば良いでしょうか? #If Win64 Then Public Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" ( pOpenFileName As OPENFILENAME) As Long #Else Public Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" ( pOpenFileName As OPENFILENAME) As Long #End If Type OPENFILENAME lStructSize As Long hwndOwner As LongPtr hInstance As LongPtr lpstrFilter As String lpstrCustomFilter As Long nMaxCustrFilter 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 lCustrData As LongPtr lpfnHook As LongPtr lpTemplateName As Long End Type Public Const OFN_ALLOWMULTISELECT = &H200 Public Const OFN_CREATEPROMPT = &H2000 Public Const OFN_EXPLORER = &H80000 Public Const OFN_FILEMUSTEXIST = &H1000 Public Const OFN_HIDEREADONLY = &H4 Public Const OFN_NOCHANGEDIR = &H8 Public Const OFN_NODEREFERENCELINKS = &H100000 Public Const OFN_NONETWORKBUTTON = &H20000 Public Const OFN_NOREADONLYRETURN = &H8000 Public Const OFN_NOVALIDATE = &H100 Public Const OFN_OVERWRITEPROMPT = &H2 Public Const OFN_PATHMUSTEXIST = &H800 Public Const OFN_READONLY = &H1 Public Const OFN_SHOWHELP = &H10 Public Const OFN_EXTENSIONDIFFERENT = &H400 Public Function GetFileName(pstrDir As String, pstrFile) As String Dim pOpenFileName As OPENFILENAME Dim lngRet As Long pOpenFileName.hwndOwner = Application.hWndAccessApp pOpenFileName.hInstance = 0 ' pOpenFileName.lpstrFilter = "CSVファイル (*.xlsx)" & String(1, vbNullChar) & "*.xlsx" & String(2, vbNullChar) ' pOpenFileName.lpstrFilter = "全てのファイル (*.*)" & String( 1, vbNullChar) & "*.*" & String(2, vbNullChar) pOpenFileName.lpstrCustomFilter = 0 pOpenFileName.nMaxCustrFilter = 0 pOpenFileName.nFilterIndex = 1 pOpenFileName.lpstrFile = String(511, vbNullChar) pOpenFileName.nMaxFile = 511 pOpenFileName.lpstrFileTitle = String(512, vbNullChar) pOpenFileName.nMaxFileTitle = 511 pOpenFileName.lpstrInitialDir = pstrDir pOpenFileName.lpstrTitle = String(1, vbNullChar) pOpenFileName.nFileOffset = 0 pOpenFileName.nFileExtension = 0 pOpenFileName.lpstrDefExt = String(1, vbNullChar) pOpenFileName.lCustrData = 0 pOpenFileName.lpfnHook = 0 pOpenFileName.lpTemplateName = 0 pOpenFileName.lStructSize = Len(pOpenFileName) pOpenFileName.Flags = OFN_HIDEREADONLY _ Or OFN_EXPLORER lngRet = GetOpenFileName(pOpenFileName) GetFileName = Left(pOpenFileName.lpstrFile, _ InStr(pOpenFileName.lpstrFile, vbNullChar) - 1) If Len(GetFileName) Then pstrFile = Left(pOpenFileName.lpstrFileTitle, _ InStr(pOpenFileName.lpstrFileTitle, vbNullChar) - 1) pstrDir = Left(GetFileName, Len(GetFileName) - Len(pstrFile) - 1) End If End Function '実行プロシージャ Private Sub CmdlgTest() Dim strPath As String, strfile As String Debug.Print GetFileName(strPath, strfile) End Sub
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- m3_maki
- ベストアンサー率64% (296/460)
直接の回答ではありませんが なぜ FileDialog を使わないの? Access 2000 以前じゃないですよね? FileDialog プロパティ (Access) https://docs.microsoft.com/ja-jp/office/vba/api/access.application.filedialog Office のバージョンは異なるかもしれませんが、分かりやすいサンプル。 Officeオブジェクトを使った"ファイル選択"ダイアログ https://tsware.jp/tips/tips_221.htm 64ビットの Office で動くかどうか知りませんが、 試してみる価値は有るかと思います。
- masnoske
- ベストアンサー率35% (67/190)
外しているかも知れませんが、こちらの情報と比較したところ、構造体の宣言部に違いがありました。 https://www.ilovex.co.jp/blog/system/i/systemdevelopment/winapi32bit64bit.html String型で宣言すべきパラメータがLong型になっている。 nMaxCustFilter が nMaxCustrFilter になっている。
補足
参考サイトに習って該当箇所を修正し、ご指摘のnMaxCustFilter(他にもCust がCustrになっている箇所も含めて)も修正して実行してみましたが、挙動に変化はありませんでした。
- masnoske
- ベストアンサー率35% (67/190)
> 64bit のOSなので、64bitのソフトがインストールされていると思います。 思い込みではなく、確認されたほうが良いと思います。 ヘルプを見れば、32ビットか64ビットかをすぐに確認できます。
補足
64bit版がインストールされておりました。
- oboroxx
- ベストアンサー率40% (317/792)
No.1です。 64bitOSでも、多くの人はまだ32bitのOfficeをインストールしていると思いますよ。 過去のOfficeのアドイン等の資産が32bitのままのが多いので、それらは32bitのOfficeでないと使えないのです。 64bitで使えるようにするのは参考URLを見てみてください。 http://ivystar.jp/ms-office/access/%E6%97%A7access%E3%82%9264bit-win7access-2010%E3%81%A7%E9%96%8B%E3%81%84%E3%81%9F%E6%99%82%E3%81%AEapi%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95/
お礼
参考URLを有難うございます。 しかしながら、既に閲覧済みのサイトでした。
- oboroxx
- ベストアンサー率40% (317/792)
Windows10にインストールされているAccessは32bitでしょうか? もしかしたら、64bitでインストールされていると動かないのかもしれません。
補足
64bit のOSなので、64bitのソフトがインストールされていると思います。 なので、64bitで動作させる為の修正箇所と、方法が知りたいです。
お礼
ですよねww 私が作ったものではないaccessを64bitでも動くように…との依頼なので、出来るだけ元の形を維持したまま使えないか?と模索しております。 動かない理由が分からないままなのもモヤモヤするので(ネット検索した限りでは動きそうでしたし)、そのまま使える解決策があるなら、知りたいと思いました。 有難うございます。