タイトル 「名前を付けてファイルを保存」コモンダイアログを呼び出す
対象言語 VB4.0, Access95以降
動作確認OS Windows95,98,NT4.0
使用関数 ShellExecute
改築日 1998/05/17
Source Download

「名前を付けてファイルを保存」コモンダイアログを呼び
出します。


CommonDialogコントロールが無い Accessでも使えます。

ダイアログの表示位置はこの関数は呼び出し元のフォーム
の位置によって決まります。
ダミーの非表示のフォームを作成し、うまく配置してやると
画面の真中に表示したり、左下等に表示できると思います。

1. フォームを作成し、コマンドボタン(Command1)、テキストボックス(Text1)を貼り付けてください。

Option Explicit

Private Sub Command1_Click()

   Dim tag As OpenFileName2
   Dim text As TextBox

'ダイアログのパラメータ設定
   With tag
     .DefaultExt = "txt"
     .DialogTitle = "ファイルを選択して下さい。"
     .FileName = vbNullString
     .FilePath = vbNullString
     .FileTitle = vbNullString
     .Filter = "テキスト(*.txt)|*.txt|データベース(*.mdb)|*.mdb|全てのファイル(*.*)|*.*"
     .FilterIndex = 1
     .flags = OFN_HIDEREADONLY
     .InitDir = "c:\"
     .MaxFileSize = MAX_PATH
   End With

'ダイアログ呼び出し
   If Y_GetOpenFileDialog(Me.hWnd, tag) Then
     Set text = Me!Text1
     text = "選択したフルパス名 = " & tag.FileName & vbCrLf
     text = text & "選択したフォルダ名 = " & tag.FilePath & vbCrLf
     text = text & "選択したファイル名 = " & tag.FileTitle
   Else
     Call MsgBox("選択をキャンセルされました。(ToT)")
   End If

End Sub



3.モジュールウインドウを作成し、下のソースを入力してください。

Option Explicit

'「名前を付けてファイルに保存」コモンダイアログを呼び出す
Declare Function GetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" _
(pOpenfilename As OPENFILENAME) As Long

Type OPENFILENAME
   lStructSize As Long 'この構造体の長さ
   hwndOwner As Long '呼び出し元ウインドウハンドル
   hInstance As Long 'モジュールのインスタンスハンドル
   lpstrFilter As String 'フィルタ文字列
   lpstrCustomFilter As String 'ユーザー定義のフィルタ文字列のペア
   nMaxCustrFilter As Long 'lpstrCustomFilterのバッファサイズ
   nFilterIndex As Long 'フィルタコンボボックスの初期インデックス値
   lpstrFile As String '選択されたファイル名のフルパス
   nMaxFile As Long 'lpstrFileのバッファサイズ
   lpstrFileTitle As String '選択されたファイル名のタイトル
   nMaxFileTitle As Long 'lpstrFileTitleのバッファサイズ
  lpstrInitialDir As String '初期フォルダ名
   lpstrTitle As String 'ダイアログボックスのタイトル名
   flags As Long '以下のFlagsの値の組み合わせ
   nFileOffset As Integer 'lpstrFileの最後の \までのオフセット値
   nFileExtension As Integer '拡張子までのオフセット値
   lpstrDefExt As String 'ファイル名の入力時、拡張子が省略された時の拡張子
   lCustrData As Long 'OSがlpfnHookで指定されたフック関数に渡すアプリ定義のデータ
   lpfnHook As Long 'ダイアログに送られるメッセージを処理するフック関数のポインタ
   lpTemplateName As String
End Type

'Flagsに設定する値
Public Const OFN_ALLOWMULTISELECT = &H200 'ファイル名リストボックスで複数選択を可能にする
Public Const OFN_CREATEPROMPT = &H2000 '現在存在しないファイルを作成するかを確認する
Public Const OFN_EXTENSIONDIFFERENT = &H400 'ファイル名の拡張子とlpstrDefExtで指定された拡張子が異なる
Public Const OFN_FILEMUSTEXIST = &H1000 '既存のファイルだけ入力できるようにする
Public Const OFN_HIDEREADONLY = &H4 '[読み取り専用]チェックボックスを表示しない
Public Const OFN_NOCHANGEDIR = &H8 'ダイアログボックスを開いたときに現在のディレクトリを表示する
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_SHAREAWARE = &H4000 '共有違反エラーを無視する
Public Const OFN_SHOWHELP = &H10 'ダイアログ ボックスに [ヘルプ] ボタンを表示する
Public Const OFN_EXPLORER = &H80000 'エクスプローラに似たダイアログボックスにする
Public Const OFN_NODEREFERENCELINKS = &H100000 'ショートカットを実行しない
Public Const OFN_LONGNAMES = &H200000 '長いファイル名を使用する


Type OpenFileName2
   DefaultExt As String '拡張子を付けなかった時のデフォルト拡張子
   DialogTitle As String 'タイトルバーに表示するタイトル名
   FileName As String 'ダイアログを閉じた後、選択したファイルのフルパスが入る
   FilePath As String '選択したファイルが含まれるパスの名前
   FileTitle As String '選択したファイルのパスを含まない名前
   Filter As String 'フィルター
     FilterIndex As Long '複数フィルターを設定している時の表示するフィルターのインデックス番号
   flags As Long 'ダイアログボックスの作成フラグ
   InitDir As String '初期フォルダ名
   MaxFileSize As Long 'ファイル名の最大サイズを設定 (1〜 32768 既定値256)
   OKFlg As Integer '1:ファイルを選択した 0:選択をキャンセルした
End Type

Public Const MAX_PATH = 260


Public Function Y_GetSaveFileDialog(hWnd As Long, OpenInfo As OpenFileName2) As Boolean

'***********************************************************
'機能 : 「ファイル名を付けて保存」コモンダイアログを呼び出す
'引数 :  Fm  = 呼び出し元のフォームオブジェクト
'     OpenInfo = 「ファイル名を付けて保存」ダイアログの
'     初期設定値
'戻り値: ダイアログを閉じた後の設定値
'***********************************************************

  Dim getfile As OPENFILENAME
   Dim FilterBuf As String
   Dim StrBuf As String
   Dim i As Long
   Dim j As Long
   Dim cnt As Integer
   Dim filindex As Integer
   Dim longret As Long

'初期値設定
   If Left$(OpenInfo.DefaultExt, 1) = "." Then
     OpenInfo.DefaultExt = Mid$(OpenInfo.DefaultExt, 2)
   End If
   If OpenInfo.DialogTitle = vbNullString Then
     OpenInfo.DialogTitle = "ファイルを開く"
   End If
   If OpenInfo.MaxFileSize < 1 Or OpenInfo.MaxFileSize > 32768 Then
     OpenInfo.MaxFileSize = MAX_PATH
   End If
   If OpenInfo.FileTitle = vbNullString Then
     OpenInfo.FileTitle = String$(OpenInfo.MaxFileSize, 0)
   End If
   FilterBuf = OpenInfo.Filter
   j = 1
   cnt = 1
   Do While True
     i = InStr(j, FilterBuf, "|")
     If i = 0 Then
       Exit Do
     End If
     Mid$(FilterBuf, i, 1) = vbNullChar
     j = i + 1
     cnt = cnt + 1
   Loop

   If OpenInfo.FilterIndex < 1 Or OpenInfo.FilterIndex > cnt Then
     filindex = 0
   Else
     filindex = OpenInfo.FilterIndex
   End If

   StrBuf = String(OpenInfo.MaxFileSize, 0)

'コモンダイアログを呼び出す
   With getfile
     .lStructSize = Len(getfile)
     .hwndOwner = hWnd
     .hInstance = 0 'App.hInstance
     .lpstrFilter = FilterBuf
     .nMaxCustrFilter = 0&
     .nFilterIndex = filindex
     .lpstrFile = StrBuf
     .nMaxFile = OpenInfo.MaxFileSize
     .lpstrFileTitle = OpenInfo.FileTitle
     .nMaxFileTitle = Len(OpenInfo.FileTitle) + 1
     .lpstrInitialDir = OpenInfo.InitDir
     .lpstrTitle = OpenInfo.DialogTitle
     .flags = OpenInfo.flags
     .lpstrDefExt = OpenInfo.DefaultExt
   End With

   Y_GetSaveFileDialog = (GetSaveFileName(getfile) <> 0)

'戻り値セット
   With OpenInfo
     .FileName = EditBuf(getfile.lpstrFile)
     .FilePath = StrConv(LeftB$(StrConv(getfile.lpstrFile, vbFromUnicode), getfile.nFileOffset), vbUnicode)
     .FileTitle = EditBuf(getfile.lpstrFileTitle)
   End With

End Function


Public Function EditBuf(Buf As String) As String
'***********************************************************
'機能 : 引数 Bufの文字列中の Nullコードを検索し、Nullコードを
' 除いた文字列を返す
'引数 : Buf = Nullコードを含む文字列
'戻り値: Nullコードを除いた文字列
'***********************************************************

   Dim i As Long

   i = InStr(Buf, vbNullChar)
   If i <> 0 Then
     EditBuf = Left$(Buf, i - 1)
   Else
     EditBuf = Buf
   End If

End Function





Copyright (C)1997-2001 空耳工房 MY2Project All rights reserved.