• ベストアンサー

ダイアログボックスを表示したい。

下記処理コードを実行したときに、 ファイル選択のダイアログ表示をさせるのにファイル名を決まった形にしないと駄目みたいです。 (例)strLookupFileName = "abcms_E000_H*.csv;" ファイル名に関係なくダイアログを表示させるにはどうしたら良いのでしょうか? 今現在、ファイル名を適当なものに変えると「キャンセルされました。」のメッセージボックスが表示されます。 例:strLookupFileName = "abc明細.xls"←エラー(これでも可に) (処理コード) 'ファイル選択 strFileName = FileNameGet(Me.Hwnd, strHomeDirectory, strLookupFileName, "CSV ファイル", "ファイル選択") If strFileName = "" Then MsgBox "キャンセルされました。", vbInformation + vbOKOnly, " " Exit Sub End If ↓ Public Function FileNameGet(Owner As Variant, DefaultDirectory As String, DefaultFilter As String, DefaultFilterName As String, Title As String) As Variant On Error GoTo Err Dim dlg As OPENFILENAME Dim rslt As Long dlg.hwndOwner = Owner dlg.hInstance = 0 'dlg.nFilterIndex = 0 dlg.lpstrTitle = Title & Chr(0) & Chr(0) dlg.lpstrFileTitle = Space(256) & Chr(0) & Chr(0) dlg.lpstrInitialDir = DefaultDirectory & Chr(0) & Chr(0) dlg.lpstrFile = DefaultFilter & Space(256) & Chr(0) & Chr(0) dlg.lpstrFilter = DefaultFilter & Chr(0) & Chr(0) dlg.nMaxFile = Len(dlg.lpstrFile) dlg.nMaxFileTitle = Len(dlg.lpstrFileTitle) dlg.lStructSize = Len(dlg) rslt = GetOpenFileName(dlg) If rslt = 0 Then FileNameGet = "" Exit Function End If 'ファイル名チェック If IsNull(dlg.lpstrFile) Or dlg.lpstrFile = "" Then MsgBox "ファイル名が取得できませんでした。", vbInformation + vbOKOnly, " " FileNameGet = Null Exit Function End If 'FileNameGet = StrConv(MidB(StrConv(dlg.lpstrFile, vbFromUnicode), 1, (dlg.nFileExtension + 3)), vbUnicode) FileNameGet = Left$(dlg.lpstrFile, InStr(dlg.lpstrFile, vbNullChar) - 1 On Error GoTo 0 Exit Function Err: MsgBox Err.Description End Function

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.4

nMaxFileに与える数値を LenB(dlg.lpstrFile) といった具合にすればいいようですよ DLLを呼び出した際にエラーになるなら ErrオブジェクトのLastDllErrでエラーコードを取得して PlatformSDKの『System Error Code』などを参照し原因を究明しましょう #1の回答は的外れでしたね m(__)m

n_c63amg
質問者

お礼

有り難う御座いました。 お蔭様で解決し、ダイアログボックスが表示される 様になりました。

その他の回答 (3)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

先の回答で誤りがありました。 "CSVファイル" & Chr(0) & "*.csv" & Chr(0) & "全てのファイル" & "*.*" & String(2, Chr(0))        ↓ "CSVファイル" & Chr(0) & "*.csv" & Chr(0) & "全てのファイル" & Chr(0) & "*.*" & String(2, Chr(0))

n_c63amg
質問者

お礼

有り難う御座います。 助かりました。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

(1)以下の後方のChr(0)×2は不要です。 dlg.lpstrTitle = Title & Chr(0) & Chr(0) dlg.lpstrFileTitle = Space(256) & Chr(0) & Chr(0) dlg.lpstrInitialDir = DefaultDirectory & Chr(0) & Chr(0) dlg.lpstrFilter = DefaultFilter & Chr(0) & Chr(0) (2)Space(256)はString(256, Chr(0))が正しい。 dlg.lpstrFile = DefaultFilter & Space(256) & Chr(0) & Chr(0) ※後方のChr(0)×2も不要です。 (3)フラグは? dlg.flagsは0でも動きますが、普通はOFN_xxxの定数を組み合わせます。 (4)フィルタの使い方が違います。 フィルタは「表示名1x実フィルタ1x表示名2x実フィルタ2x・・・xx」 x=Chr(0) 正しくは "CSVファイル" & Chr(0) & "*.csv" & Chr(0) & "全てのファイル" & "*.*" & String(2, Chr(0)) (5)Lenについて Lenは文字数を返します。nMaxFile等はバイト数なので漢字を含むパス名では正しくありません。 dlg.lpstrFile = DefaultFilter & String(256, Chr(0))なら dlg.nMaxFile = lstrlen(DefaultFilter) + 256です。 lstrlenはWndowsAPIにあります。

n_c63amg
質問者

お礼

細かくご指導いただき有り難う御座いました。 くだらない質問ばかりですが、 今後ともよろしくお願いします。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

lpstrFilterメンバーに与えるデータを "CSVファイル(*.csv)|*.csv" といった具合に変更しても同じでしょうか …

n_c63amg
質問者

お礼

2度のご回答有り難う御座いました。 また宜しくお願いします。

n_c63amg
質問者

補足

早速のご回答有り難うございます。 dlg.lpstrFilter = "CSVファイル(*.csv)|*.csv"にしましたが、 変わらないです。 strLookupFileName = "abcms_E000_H*.csv;"といった形 ファイルを探しているみたいです。 ファイル名を任意の形にしてやったらどうなのかと思い、 strLookupFileName = "abc明細.csv"にすると、 「キャンセルされました。」のメッセージボックスが表示されます。 どこが悪いのでしょうか?

関連するQ&A