OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

フォルダ指定ダイアログ(Excel97VBA)

  • 困ってます
  • 質問No.191271
  • 閲覧数144
  • ありがとう数4
  • 気になる数0
  • 回答数3
  • コメント数0

とあるサイトで、下記のようにして、フォルダを指定するダイアログを表示させるコードを見つけました。

Set objKng = CreateObject("Shell.Application")
Set dirKng = objKng.BrowseForFolder(0, "フォルダを選択してください。", 0)

上記2行についてどなたか解説して頂けないでしょうか?
特に、("Shell.Application")の""内の意味・他に何ができるのか、(0,"・・・",0)のゼロが分かりません。

また、このダイアログで、IF文を使って条件分岐させるにはどうすればいいのでしょうか?
以下のような感じで作りたいのですが。

If キャンセル押下時 then
Exit Sub
Else
実行
End If

宜しくお願いします。
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.3
レベル10

ベストアンサー率 61% (75/121)

>しかし、使い方が分かりません。(^^ゞ
すいません。説明不足でした。

まず、EXCELのVBEから「挿入」「標準モジュール」を選択します。
Module1というウインドウが表示されます。
そこに#1で回答した<標準モジュール>以下<呼び出し側>以前までコピーして貼り付けます。

貼り付けた下の行に以下のサンプルコードをコピーして貼り付けます。
<サンプルコード>
Sub test()
Dim FolderStr As String
FolderStr = ComdlgGetFolderStr("フォルダを指定してください。")
If FolderStr = "" Then
  Exit Sub
Else
  Debug.Print FolderStr
End If
End Sub

イミディエイトウインドウに"test"と入力し、エンターを押します。

すると見たことのあるフォルダー選択画面が出てきますので選択して「OK」をクリックします。

イミディエイトウインドウに選択したフォルダーのパスが表示されます。

>APIって何?
私も詳しくないのですが、OSとの橋渡し的存在だと思っています。違っていたらご指摘ください。
お礼コメント
noname#1997

お礼が大変遅くなり申し訳ありませんでした。

手元にファイルがないので、後日試してみます。
ありがとうございました。
投稿日時 - 2002-01-11 13:15:36
-PR-
-PR-

その他の回答 (全2件)

  • 回答No.1
レベル10

ベストアンサー率 61% (75/121)

こんにちは ご質問の内容とは全く関係ないかもしれませんが、APIを使うことで 実現できます。 実は私もAPIについてはほとんど知らないのですが、他の人が作った 以下のサンプルがありますので、参考になればと思いレスします。 一応WIN2000の環境では動きます。 <標準モジュール> 'フォルダ指定ダイアログ表示の宣言部 Public Type BROWSEINFO   ...続きを読む
こんにちは
ご質問の内容とは全く関係ないかもしれませんが、APIを使うことで
実現できます。
実は私もAPIについてはほとんど知らないのですが、他の人が作った
以下のサンプルがありますので、参考になればと思いレスします。
一応WIN2000の環境では動きます。


<標準モジュール>
'フォルダ指定ダイアログ表示の宣言部
Public Type BROWSEINFO
  hwndOwner As Long
  pidlRoot As Long
  pszDisplayName As String
  lpszTitle As String
  ulFlags As Long
  lpfn As Long
  lParam As Long
  iImage As Long
End Type

Public Const C_RF_DESKTOP = &H0 'デスクトップ
Public Const C_RF_PERSONAL = &H5& 'My Documents
Public Const C_RF_DRIVES = &H11& 'マイコンピュータ

Public Const BIF_BROWSEFORCOMPUTER = 1

Public Declare Function SHBrowseForFolder Lib "shell32.dll" _
  Alias "SHBrowseForFolderA" (lpBROWSEINFO As BROWSEINFO) As Long

Public Declare Function SHGetPathFromIDList Lib "shell32.dll" _
  Alias "SHGetPathFromIDListA" _
  (ByVal pidl As Long, ByVal pszPath As String) As Long

Public Declare Function FindWindow Lib "user32" _
  Alias "FindWindowA" _
  (ByVal lpClassName As String, ByVal lpWindowName As Long) As Long

Public Declare Function CoTaskMemFree Lib "OLE32.dll" _
  (ByVal pv As Long) As Long

'フォルダ指定ダイアログ表示
Function ComdlgGetFolderStr(msgStr As String) As String
  Dim typBROWSEINFO As BROWSEINFO
  Dim lngFoldPointer As Long
  Dim strPathName As String
  Dim m As Long
  Dim n As Long
  Dim tmp As String

  ComdlgGetFolderStr = ""

  With typBROWSEINFO
   .hwndOwner = FindWindow("XLMAIN", 0)
   .pidlRoot = C_RF_DESKTOP
   'ルートフォルダを変更したいときは
   '.pidlRoot = C_RF_PERSONAL のように書き換える
   .lpszTitle = msgStr
   .ulFlags = BIF_BROWSEFORCOMPUTER
  End With

  lngFoldPointer = SHBrowseForFolder(typBROWSEINFO)

  strPathName = String$(128, vbNullChar)
  SHGetPathFromIDList lngFoldPointer, strPathName

  If Left(strPathName, 1) <> vbNullChar Then
   m = Len(strPathName)

   For n = m To 1 Step -1
    If Asc(Mid(strPathName, n, 1)) <> 0 Then Exit For
   Next n
   strPathName = Mid(strPathName, 1, n)
   ComdlgGetFolderStr = CStr(strPathName)
  End If

  Call CoTaskMemFree(lngFoldPointer)
End Function

<呼び出し側>
FolderStr = ComdlgGetFolderStr
お礼コメント
noname#1997

ありがとうございます。
しかし、使い方が分かりません。(^^ゞ

APIって何?
そこからちょっと勉強してみます。
投稿日時 - 2001-12-27 13:52:32

  • 回答No.2
レベル9

ベストアンサー率 50% (37/73)

Set objKng = CreateObject("Shell.Application") でobjKngにShellオブジェクトをセットします。これでエクスプローラーの機能を使用する事ができます。 >(0,"・・・",0)のゼロが分かりません。 最初の方はウインドのハンドルです。ここに指定したハンドル(ウインドに付けられた識別番号)のウインドがフォルダ ...続きを読む
Set objKng = CreateObject("Shell.Application") でobjKngにShellオブジェクトをセットします。これでエクスプローラーの機能を使用する事ができます。

>(0,"・・・",0)のゼロが分かりません。
最初の方はウインドのハンドルです。ここに指定したハンドル(ウインドに付けられた識別番号)のウインドがフォルダ選択ダイアログボックスの親ウインドになります。例えばここにExcelのハンドルを指定すると、ダイアログボックスを閉じるまでExcelの操作に戻れなくなります。0はデスクトップを表します。
後の方はフォルダ選択ダイアログボックスのオプションです。これでダイアログボックスのスタイルを設定します。

条件分岐は、
If dirKng Is Nothing Then
 Exit Sub
Else
 '実行
end if
で良いと思います。
お礼コメント
noname#1997

お礼が大変遅くなり申し訳ありませんでした。

大変よく分かりました。
手元にファイルがないので、後日試してみます。
Nothingは試したつもりだったのですが・・・。
isではなく=にしてたのかも。(^^ゞ

ありがとうございました。
投稿日時 - 2002-01-11 13:14:37
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
このやり方知ってる!同じこと困ったことある。経験を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ