とあるサイトで、下記のようにして、フォルダを指定するダイアログを表示させるコードを見つけました。
Set objKng = CreateObject("Shell.Application")
Set dirKng = objKng.BrowseForFolder(0, "フォルダを選択してください。", 0)
上記2行についてどなたか解説して頂けないでしょうか?
特に、("Shell.Application")の""内の意味・他に何ができるのか、(0,"・・・",0)のゼロが分かりません。
また、このダイアログで、IF文を使って条件分岐させるにはどうすればいいのでしょうか?
以下のような感じで作りたいのですが。
If キャンセル押下時 then
Exit Sub
Else
実行
End If
宜しくお願いします。
No.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との橋渡し的存在だと思っています。違っていたらご指摘ください。
No.2
- 回答日時:
Set objKng = CreateObject("Shell.Application") でobjKngにShellオブジェクトをセットします。
これでエクスプローラーの機能を使用する事ができます。>(0,"・・・",0)のゼロが分かりません。
最初の方はウインドのハンドルです。ここに指定したハンドル(ウインドに付けられた識別番号)のウインドがフォルダ選択ダイアログボックスの親ウインドになります。例えばここにExcelのハンドルを指定すると、ダイアログボックスを閉じるまでExcelの操作に戻れなくなります。0はデスクトップを表します。
後の方はフォルダ選択ダイアログボックスのオプションです。これでダイアログボックスのスタイルを設定します。
条件分岐は、
If dirKng Is Nothing Then
Exit Sub
Else
'実行
end if
で良いと思います。
お礼が大変遅くなり申し訳ありませんでした。
大変よく分かりました。
手元にファイルがないので、後日試してみます。
Nothingは試したつもりだったのですが・・・。
isではなく=にしてたのかも。(^^ゞ
ありがとうございました。
No.1
- 回答日時:
こんにちは
ご質問の内容とは全く関係ないかもしれませんが、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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/06 17:46
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) InputBoxでキャンセルボタンを押したらファイル自体を閉じたい 3 2022/07/23 17:52
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Windows10でコマンドプロンプト...
-
ファイル名と同名のフォルダを...
-
EXPLORERで開いているフォルダ...
-
C ファイル出力で、フォルダが...
-
ファイル名から該当フォルダへ移動
-
VBA:特定の文字を含むフォルダ...
-
多量のファイルをフォルダに自...
-
サーバ内のフォルダ名と各フォ...
-
条件に合うフォルダが存在する...
-
パス名に2バイト文字(マルチバ...
-
カレントフォルダって?
-
Excel VBA 同じ名前のフォルダ...
-
フォームを最前面に表示したい...
-
フォルダ配下のファイル作成日...
-
Hitachi Embedded Workshop (HE...
-
vbsで選択ダイアログを表示した...
-
VS2005で"定義へ移動"ができません
-
VBA フォルダ名に特定の文字を...
-
バッチファイルで指定フォルダ...
-
フォルダ内のPDFファイル名を変...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Windows10でコマンドプロンプト...
-
パス名に2バイト文字(マルチバ...
-
ファイル名と同名のフォルダを...
-
VBA 最新のフォルダ取得
-
Excelのハイパーリンクについて...
-
デスクトップの画像をhtmlに表...
-
ディレクトリ名変更してコピー...
-
VBA フォルダ名に特定の文字を...
-
バッチファイルで指定フォルダ...
-
フォルダ内のPDFファイル名を変...
-
Access VBA で フォルダ権限...
-
excelマクロ 冒頭3文字が一致す...
-
【マクロ】ファイル名の日付に...
-
フォルダにリンクを貼りたい
-
会社のネットワーク上のファイ...
-
多量のファイルをフォルダに自...
-
C ファイル出力で、フォルダが...
-
保存先のフォルダ名を指定した...
-
vbsで選択ダイアログを表示した...
-
Excel VBA 同じ名前のフォルダ...
おすすめ情報