Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Professional : Excel 2016)
フォルダのフルパス取得について
投稿日時: 18/02/24 17:19:45
投稿者: shirai

フォルダ名の所得する方法として下記を作成しました
Sub fold()
    Dim fold As FileDialog
    Dim fold_path As String
    Set fold = Application.FileDialog(msoFileDialogFolderPicker)
    fold.InitialFileName = ActiveWorkbook.Path 'ファイル現在のパス取得
    
   'キャンセルボタンクリック時にマクロを終了
    If fold.Show = False Then Exit Sub
 
    'フォルダーのフルパスを変数に格納
    fold_path = dlg.SelectedItems(1)
     
    MsgBox fold_path
 
End Sub
 
実行すると、ダイヤログからフォルダを選択すると、フォルダのフルパスが取得できますが、実行時にダイヤログで「OK」を選択すると
「パスが存在しません パスを確認して再実行して下さい」
のメッセージがでます(フォルダを選択していないためと思います)
最初のダイヤログで「OK」を選択した場合に、フォルダ名(N):に表示されているフォルダ名のフルパスを取得することはできるのでしょうか?

回答
投稿日時: 18/02/24 17:42:01
投稿者: WinArrow
投稿者のウェブサイトに移動

> fold_path = dlg.SelectedItems(1)
の「dig」って、何?
 
モジュールの先頭に
Option Explicit
を記述しましょう。

回答
投稿日時: 18/02/24 17:45:12
投稿者: WinArrow
投稿者のウェブサイトに移動

Option Explicit
 
を自動挿入する設定
VBEの「ツール」-「オプション」-「編集」タブー「変数の宣言を強制する」にチェックをいれます。

投稿日時: 18/02/24 18:12:22
投稿者: shirai

[quote="shirai"]フォルダ名の所得する方法として下記を作成しました
 
WinArrow 様
回答ありがとうございました。
 
ご指摘のとおり
 'フォルダーのフルパスを変数に格納
 fold_path = dlg.SelectedItems(1)
は記述ミスでした
fold_path = fold.SelectedItems(1)
に修正し、Option Explicit を自動挿入する設定で
実行してみましたが、やはり
実行直後のダイヤログで「OK」を選択すると
「パスが存在しません パスを確認して再実行して下さい」  
と表示され、他のフォルダまたはキャンセルを選択しないとダイヤログが終了しません
 
最初のダイヤログで「OK」を選択した場合に、フォルダ名(N):に表示されているフォルダ名のフルパスを取得することはできないのでしょうか?
 

回答
投稿日時: 18/02/24 20:37:27
投稿者: WinArrow
投稿者のウェブサイトに移動

ステップ実行して、
どの時点で、どの変数に、どのような「値」が入っているのか?
確認してみましょう。

回答
投稿日時: 18/02/24 20:39:38
投稿者: WinArrow
投稿者のウェブサイトに移動

あっ
申し添えますと、最初のレス時、こちらでは問題なかったと思います。

回答
投稿日時: 18/02/24 21:59:56
投稿者: WinArrow
投稿者のウェブサイトに移動

もう一つ
 
>Option Explicit を自動挿入する設定
これは、実行には関係ありません。
未宣言の変数があると、プロシジャ実行前に、チェックされる・・・」つまり、実行できない
という状態になるだけです。
 
それから、次回、新しいモジュールを作成したとき、
自動で、Option Explicit を挿入してくれるので、変数名の入力ミスを防ぐことができます。
 
 

投稿日時: 18/02/24 22:43:58
投稿者: shirai

[quote="shirai"]

shirai さんの引用:
フォルダ名の所得する方法として下記を作成しました
 
WinArrow 様
回答ありがとうございました。
 
実行してみましたが、やはり
If fold.Show = False Then Exit Sub
の項を実行後
ダイヤログが表示されて、その状態で「OK」を選択すると
「パスが存在しません パスを確認して再実行して下さい」  
と表示され、他のフォルダまたはキャンセルを選択しないとダイヤログが終了しません
ダイヤログが終了しないため
どの時点で、どの変数に、どのような「値」が入っているのかの確認ができませんでした
 

回答
投稿日時: 18/02/25 08:33:15
投稿者: MMYS

shirai さんの引用:
 
と表示され、他のフォルダまたはキャンセルを選択しないとダイヤログが終了しません
ダイヤログが終了しないため

shirai さんの引用:

ダイヤログが表示されて、その状態で「OK」を選択すると

説明が矛盾しています。
 
 ダイヤログ表示 → (なにもせずに)「OK」をクリック
 
shiraiさん自身がこれは出来ない。と説明しています。
 
もしかして、ダイアログ内でキーボードから手打ちしてるのですか。
その際、存在するフォルダを指定してますか。
存在するフォルダを指定しないと、パスが存在しないのでダイアログが上記エラーを出します。
 
ダイアログは存在するフォルダを指定するかキャンセル以外では終了出来ません。
 
 
 

回答
投稿日時: 18/02/25 08:42:02
投稿者: i-brown

まず、Win Arrowさんのアドバイスに従ってから追加質問してみてはどうでしょうか?
 

Option Explicit ' 常識!

Sub fold()
    Dim fold As FileDialog
    Dim fold_path As String
    Set fold = Application.FileDialog(msoFileDialogFolderPicker)
    fold.InitialFileName = ActiveWorkbook.Path 'ファイル現在のパスを「既定値に設定」
    
    'キャンセルボタンクリック時にマクロを終了
    If fold.Show = False Then Exit Sub
    
 
    'フォルダーのフルパスを変数に格納
    fold_path = fold.SelectedItems(1)   ' 変数名間違い。サンプルコード丸写し?
     
    MsgBox fold_path
End Sub

 

回答
投稿日時: 18/02/25 09:57:46
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:
「パスが存在しません パスを確認して再実行して下さい」
のメッセージがでます(フォルダを選択していないためと思います)

 
この意味がようやく分かりました。
 
Thisworkbook.Path ・・・・このフォルダ内に「サブフォルダ」が存在しないからです。
 
>fold.InitialFileName
を指定する際、別のフォルダを選択させたいなら、
Thisworkbook.Pathを変える必要があるのでは?

回答
投稿日時: 18/02/25 09:57:52
投稿者: simple

えーとですね、これはちょっとした不具合のように思います。
私の環境(Win7,Excel2010)で再現しました。(環境依存かもしれません)
i-brownさんの提示頂いたコードでも、該当なしになります。
 
ただし、ダイアログが表示されてただちにOKを押すのではなく、
いったん左側のツリー表示の目標のフォルダ部分を
ダブルクリックする
という操作を挟むと、
正常にフォルダ名が表示されます。
コーディングの問題ではないように思います。
(当初の質問コードにはミスがありましたが)
 
原因は今のところ私には不明です。

回答
投稿日時: 18/02/25 10:08:54
投稿者: WinArrow
投稿者のウェブサイトに移動

使用しているダイアログは、フォルダを選択するものですが、
Thisworkbook.Path内に、サブフォルダが存在するならば、問題ありません。
ダイアログの選択したフォルダ名のボックスには、
自ブックのフォルダ名が表示されているもに関わらず、エラーが表示されますね?
simpleさん同様、原因はわかりませんが、
 
自分のフォルダを選択させたいのでしたら
なにも、ダイアログを表示させる必要もないでしょう。
 
そして、本当の目的が自ブックのフォルダ内のファイルを選択させたいのでしたら、
ファイルを選択させるダイアログを使うほうがよいでしょう。

回答
投稿日時: 18/02/25 10:15:42
投稿者: WinArrow
投稿者のウェブサイトに移動

自ブックのフォルダを選択させる方法(あまり意味がないとおもうが・・・)
 
  fold.InitialFileName = Left$(ActiveWorkbook.Path, InStrRev(ActiveWorkbook.Path, "\") - 1)
 
'むりやり、上位のフォルダを初期値にセットする。

回答
投稿日時: 18/02/25 10:28:38
投稿者: んなっと

 fold.InitialFileName = ActiveWorkbook.Path & "\"

回答
投稿日時: 18/02/25 10:45:31
投稿者: simple

表示してすぐにOKを押すというケースにこだわるとすると、
WinArrowさんの方式でもエラーになりますね。
fold.InitialFileName = Left$(ActiveWorkbook.Path, InStrRev(ActiveWorkbook.Path, "\") - 1) & "\"
と尻尾に"\"を足すとエラーになりません。
前のものでいえば、
fold.InitialFileName = ActiveWorkbook.Path & "\"
ですね。(フォルダ選択の場合の初期値は¥を必要とするんだろうか)
 
ただ、ご指摘のとおり、初期設定をそのまま返すのでは意味がないのもごもっともで、
普通はなんらかの選択行為が途中で入るわけで、問題であるとまでは言えないでしょう。
そもそもの使い方ということなんでしょうか。

回答
投稿日時: 18/02/25 10:52:44
投稿者: simple

んなっとさんの発言を見ておりませんでした。重複、失礼しました。
折角書いたのでそのままにさせてもらいます。

回答
投稿日時: 18/02/25 10:56:59
投稿者: WinArrow
投稿者のウェブサイトに移動

>尻尾に"\"を足すと
simpleさん、情報ありがとうございます。
 
これで、思い出したのが
Application.UserLibraryPath
です。
取得すると、末尾に"\"が付いています。
Application.LibraryPath
には、"\"が付いていません。
意図的なのかわかrませんが、統一性がないような感じ・・・・
 
 
 

投稿日時: 18/02/25 12:37:34
投稿者: shirai

[quote="shirai"]

shirai さんの引用:
フォルダ名の所得する方法として下記を作成しま
 
回答頂いた皆様ありがとうございました。
 
尻尾に"\"を足すと
(fold.InitialFileName = ActiveWorkbook.Path & "\")
認識できるようになりました
 
ありがとうございます。