プロが教える店舗&オフィスのセキュリティ対策術

事情があり、使い慣れないMicrosoft Access97のVBAでアプリケーションを作成中です。
使用者がHDD上のファイルを選択できるようにしたいのですが、どうすれば良いのでしょうか?
イメージとしては、「ファイルを開く」ダイアログボックスのようなものでファイルを選択・指定できるようにしたいのです。
(Delphiなら、OpenDialogコンポーネントの機能です。)

A 回答 (2件)

 


Win32APIのGetOpenFileName関数を使用します。


[サンプルコード]

Option Compare Database
Option Explicit

'[ファイルを開く]と[ファイルを保存]ダイアログボックスの為の構造体宣言
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

'[ファイルを開く]ダイアログボックスを呼び出すAPI
Private Declare Function GetOpenFileName Lib "comdlg32.dll" _
             Alias "GetOpenFileNameA" (ByRef pOpenfilename As OPENFILENAME) As Long

Private Const OFN_READONLY       As Long = &H1    '[読み取り専用]チェックボックスをオンにする
Private Const OFN_OVERWRITEPROMPT    As Long = &H2    '選択したファイルが存在する場合の上書確認する
Private Const OFN_HIDEREADONLY     As Long = &H4    '[読み取り専用]チェックボックスを表示しない
Private Const OFN_NOCHANGEDIR      As Long = &H8    'ダイアログボックスを開いたときに現在のディレクトリを表示する
Private Const OFN_SHOWHELP       As Long = &H10   'ダイアログ ボックスに [ヘルプ] ボタンを表示する
Private Const OFN_NOVALIDATE      As Long = &H100   '無効な文字を含むファイル名を指定出来るようにする
Private Const OFN_ALLOWMULTISELECT   As Long = &H200   'ファイル名リストボックスで複数選択を可能にする
Private Const OFN_EXTENSIONDIFFERENT  As Long = &H400   'ファイル名の拡張子とlpstrDefExtで指定された拡張子が異なる
Private Const OFN_PATHMUSTEXIST     As Long = &H800   '無効なパスを入力したときに警告メッセージを表示する
Private Const OFN_FILEMUSTEXIST     As Long = &H1000  '既存のファイルだけ入力できるようにする
Private Const OFN_CREATEPROMPT     As Long = &H2000  '現在存在しないファイルを作成するかを確認する
Private Const OFN_SHAREAWARE      As Long = &H4000  '共有違反エラーを無視する
Private Const OFN_NOREADONLYRETURN   As Long = &H8000  '読み取り専用属性を持たず、読み取り専用フォルダにないファイルを取得する
Private Const OFN_EXPLORER       As Long = &H80000  'エクスプローラに似たダイアログボックスにする
Private Const OFN_NODEREFERENCELINKS  As Long = &H100000 'ショートカットを実行しない
Private Const OFN_LONGNAMES       As Long = &H200000 '長いファイル名を使用する

Public Function GetFileName(ByRef hwnd As Long, _
              ByVal strPath As String) As String
                
  Dim ofn     As OPENFILENAME
  Dim strFileName As String
  Dim strTmp   As String
  Dim lngRet   As Long
  Dim i      As Long
  
  ' ダイアログ ボックスのオプションを設定します。
  With ofn
    '親Windowの指定
    .hwndOwner = hwnd
    'アプリケーションのインスタンスを指定
    .hInstance = 0
    .lpstrCustomFilter = vbNullString
    .nMaxCustFilter = 0
    .lpfnHook = 0
    .lpTemplateName = 0
    .lCustData = 0
    'フィルタの種類を設定
    .lpstrFilter = "すべてのファイル (*.*)" & vbNullChar & "*.*" & vbNullChar
    'アクティブなフィルタの番号を設定
    .nFilterIndex = 1
    '最大ファイル長の設定
    .nMaxFile = 511
    'ファイルのタイトルを受け取るポインタ
    .lpstrFileTitle = String$(512, 0)
    'ファイル名の最大長を設定
    .nMaxFileTitle = 511
    'デフォルトディレクトリの設定
    .lpstrInitialDir = strPath
    .lpstrDefExt = ""
    'サイズの設定
    .lStructSize = Len(ofn)
    'ダイアログのタイトルを設定
    .lpstrTitle = "ファイルを選択してください。"
    '[ファイル名]ボックスの内容を設定
    .lpstrFile = String$(512, 0)
    'オプションの設定
    .flags = OFN_HIDEREADONLY  ' + OFN_PATHMUSTEXIST
  End With
  lngRet = GetOpenFileName(ofn)
  
  If lngRet = 0 Then
    GetFileName = ""
    Exit Function
  End If
  
  lngRet = InStr(ofn.lpstrFile, vbNullChar)
  
  If lngRet <> 0 Then
    ofn.lpstrFile = Left$(ofn.lpstrFile, InStr(ofn.lpstrFile, vbNullChar) - 1)
  End If
  
  ' パスとファイル名を返します。
  strFileName = Trim$(ofn.lpstrFile)
  
  GetFileName = strFileName
  
End Function
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
WindowsのAPIを使わないと駄目なんですね。
理解するには時間がかかりそうですが、とにかく使うことはできました。
とても助かりました。

お礼日時:2003/01/17 20:45

アクセスVBAで


(1)フォームを新規作成
(2)ツールボックスより
コマンドボタンを貼りつけ。キャプションを
ファイルを開くにする。(これは本質的ではない)
(3)ツールボックスアイコンをダブルクリック
(4)「参照設定」の一覧リストが出るので、その
なかから、MicrosoftCommonDialogContol,Version6.0
をクリック。アイコンがフォーム上に来ると+になるので
フォーム上に貼りつけ。
(5)コママンドボタンをダブルクリック。
Mojuleの画面になり
Private Sub コマンド0_Click()

End Sub
が出る。
Private Sub コマンド0_Click()
ActiveXコントロール1.showopen
End Sub
とコードを入れる。
(6)フォームのボタンをクリックすると、見覚えのある
ファイルを「開く」のウインドウが出ます。
(7)その開くウインドウで「ファイルの種類」を前もって指定する方法を勉強してください(ふぃlてr)
(8)指定したファイル名を文字列として取得する方法を
勉強してください。
(9)Private Sub コマンド0_Click()
Dim fn As String
ActiveXコントロール1.Filter = "CSV ファイル (.CSV)|*.CSV|すべてのファイル (*.*) |*.*"
ActiveXコントロール1.ShowOpen
fn = ActiveXコントロール1.FileName
MsgBox fn
End Sub
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
やってみました。((3)の「ツールボックスアイコン」は「コントロールの選択アイコン」をシングルクリックですよね?)
が、(4)のところで「このActiveXコントロールを使用するライセンスがありません。」と言われてしまい、残念ながらできませんでした。

お礼日時:2003/01/17 20:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!