はじめまして。
初質問で解りづらい点がありましたらご容赦ください。
下記のようなマクロを作成し、ファイル選択の画面を呼び出してデータの読み込みを行っていたのですがExcel2013(64bit)で実行させるとファイル選択の画面が表示されず困っています。(Excel2010(64bit)では動作確認済み)
詳細としては下記モジュール2を実行した時、ファイル選択の画面が表示されず、キャンセル扱い(pubGetOpenFileName()=""で返ってきてしまいます)となってしまい「データを開くをキャンセルしました」のメッセージが表示されてしまいます。
64bit環境のExcel2013で下記のマクロを実行するにはどのようにすればいいでしょうか?
[使用環境]
OS:windows8.1 Pro 64bit
office:Excel2013
VBAVer:Microsoft Visual Basic for Applications 7.1
以下サンプルコード
'----標準モジュール1--------------------------------------------------------------------
'ファイルを開く
Private Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" _
(pOpenfilename As OPENFILENAME) As Long
'comdlg32に渡す構造体
Private Type OPENFILENAME
lStructSize As Long 'この構造体の長さ
hwndOwner As Long '呼び出し元ウインドウハンドル
hInstance As Long
lpstrFilter As String 'フィルタ文字列
lpstrCustomFilter As String
nMaxCustrFilter As Long
nFilterIndex As Long
lpstrFile As String '選択されたファイル名(フルパス)
nMaxFile As Long 'lpstrFileのバッファサイズ
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 Long
lpfnHook As Long
lpTemplateName As String
End Type
'フラグの定数
Const OFN_READONLY = &H1
Const OFN_OVERWRITEPROMPT = &H2 '上書き確認を出す
Const OFN_HIDEREADONLY = &H4
Const OFN_NOCHANGEDIR = &H8
Const OFN_SHOWHELP = &H10
Const OFN_ENABLEHOOK = &H20
Const OFN_ENABLETEMPLATE = &H40
Const OFN_ENABLETEMPLATEHANDLE = &H80
Const OFN_NOVALIDATE = &H100 'ファイル名に無効文字を許可
Const OFN_ALLOWMULTISELECT = &H200 '複数ファイルの選択を許可
Const OFN_EXTENSIONDIFFERENT = &H400 '拡張子チェック
Const OFN_PATHMUSTEXIST = &H800
Const OFN_FILEMUSTEXIST = &H1000 '既存ファイルのみ取得可能
Const OFN_CREATEPROMPT = &H2000
Const OFN_SHAREAWARE = &H4000 'ファイル共有違反を無視
Const OFN_NOREADONLYRETURN = &H8000
Const OFN_NOTESTFILECREATE = &H10000
Public Function pubGetOpenFileName() As String
'機能:comdlg32.dllを使用してファイル選択ダイアログを呼び出す。
Dim tpOpenFName As OPENFILENAME
Dim ret As Long
Dim NULLPos As Long
Dim RetFileName As String
On Error GoTo ErrByeBye:
With tpOpenFName 'GetOpenFileName関数に渡す構造体を設定
.lStructSize = Len(tpOpenFName)
.flags = OFN_FILEMUSTEXIST '既存ファイルのみ取得可能
'ファイルの種類
.lpstrFilter = "データファイル(*.ri2)" & vbNullChar & "*.ri2" _
& vbNullChar
.nMaxFile = 256 'ファイル名の長さ(パス含む)
.lpstrFile = String(256, vbNullChar) 'ファイル名を格納する文字列を初期化
End With
ret = GetOpenFileName(tpOpenFName) 'ファイル選択ダイアログ表示
NULLPos = InStr(tpOpenFName.lpstrFile, vbNullChar) 'NULL削除
RetFileName = Left(tpOpenFName.lpstrFile, NULLPos - 1)
ExitByeBye:
On Error Resume Next
pubGetOpenFileName = RetFileName
On Error GoTo 0
Exit Function
ErrByeBye:
'エラーの場合
RetFileName = vbNullString '普通はエラーを渡すが(Err.Description)
'ここでは、キャンセルクリックと同じにする
Resume ExitByeBye
End Function
'----標準モジュール2--------------------------------------------------------------------
Sub ファイルを開く()
Dim data(8) As String 'テキストファイルの読み込み用のバッファー
Dim FileName As String
FileName = pubGetOpenFileName() 'モジュール1を実行している。
If FileName = "" Then
MsgBox "データを開くをキャンセルしました", , "中 止"
Exit Sub
' Else
' MsgBox FileName
End If
Open FileName For Input As #1 '※5 テキストファイルを開く
Input #1, data(1), data(2), data(3), data(4), data(5), data(6), data(7), data(8), '※5、4 テキストファイルを読み込む
' ※4 読み込んだ値をセルに写す
Range("h3").Value = data(1)
Range("b4").Value = data(2)
Range("d5").Value = data(3)
Range("d6").Value = data(4)
Range("d7").Value = data(5)
Range("e7").Value = data(6)
Range("d8").Value = data(7)
Range("d9").Value = data(8)
Close #1 ' テキストファイルを閉じる
End Sub