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

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

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

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

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

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

宜しくお願いします。

A 回答 (3件)

>しかし、使い方が分かりません。

(^^ゞ
すいません。説明不足でした。

まず、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との橋渡し的存在だと思っています。違っていたらご指摘ください。
    • good
    • 0
この回答へのお礼

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

手元にファイルがないので、後日試してみます。
ありがとうございました。

お礼日時:2002/01/11 13:15

Set objKng = CreateObject("Shell.Application") でobjKngにShellオブジェクトをセットします。

これでエクスプローラーの機能を使用する事ができます。

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

条件分岐は、
If dirKng Is Nothing Then
 Exit Sub
Else
 '実行
end if
で良いと思います。
    • good
    • 0
この回答へのお礼

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

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

ありがとうございました。

お礼日時:2002/01/11 13:14

こんにちは


ご質問の内容とは全く関係ないかもしれませんが、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
    • good
    • 0
この回答へのお礼

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

APIって何?
そこからちょっと勉強してみます。

お礼日時:2001/12/27 13:52

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