[[20230410012428]] 『ThisWorkbook.Pathをフォルダ選択ダイアログ設定氏x(山川海湖) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ThisWorkbook.Pathをフォルダ選択ダイアログ設定時のエラーを解消させたいです。』(山川海湖)

失礼いたします。どうぞよろしくお願いいたします。

以下のコードを実行し、開いた「フォルダ選択ダイアログボックス」のOKを押すと、
「パスが存在しません。パスを確認して再実行してください。」
のエラーダイアログが出てしまいます。


Dim myFolder As Variant

With Application.FileDialog(msoFileDialogFolderPicker) 'ユーザがフォルダを選べる

    .InitialFileName = ThisWorkbook.Path
    If .Show <> 0 Then '×やキャンセルがされた時のエラー対策
        myFolder = .SelectedItems(1) '選択されたフォルダパスを(1個だけ)取得
        With CreateObject("WScript.Shell")
            .CurrentDirectory = myFolder
        End With
    Else
        MsgBox "キャンセルされました"
        Exit Sub
    End If
End With


「フォルダ選択ダイアログボックス」のフォルダパスには、
ThisWorkbookが存在しているフォルダがきちんと選択されていますが、
実は、OKボタンの上側の「フォルダー名(N):」の欄にも、
その最後の(そのパスの最下位の)のフォルダ名が(再度のように)自動表示されていまして、
つまり、「最下位フォルダ名内の最下位フォルダ名」を選択みたいな意味となっているようで
前述でのエラー内容の意味としましては、
「最下位フォルダ名」内に「最下位フォルダ名」が存在しないエラーのようです。

その「フォルダー名(N):」に入っているフォルダ名を
Deleteなどで消してOKを押すと問題なくマクロを作動できますが、
できることならば、そのDeleteの一手間を(毎回なので)無くしたいです。

なぜ、このようになり、どうすれば可能でしょうか?
「.InitialFileName = ThisWorkbook.Path」などの記述方法(や活用方法)が正しくないのでしょうか?

お分かりになられましたら、ご教授いただけましたらありがたい次第です。
お手数で誠に恐縮ですが、どうぞよろしくお願いいたします。

< 使用 Excel:Microsoft365、使用 OS:Windows10 >


前述内容が分かりにくいかもしれませんので補足させていただきますと
例えば、ThisWorkbook.Pathが、「C:\\aaa」に存在していると仮定しますと
前述のコードでは、開いた「フォルダ選択ダイアログボックス」のフォルダとして
「C:\\aaa」がきちんと開かれているのですが、
ダイアログ下部のOKボタンの上側の「フォルダー名(N):」にも、初期値として
(この場合に)「aaa」が初期設定されていますので、このままOKを押しますと、
おそらく、「C:\\aaa\aaa」の意味となり、エラーが出ると思われます。

つまり、前述のとおり、ダイアログ下部のOKボタンの上側の「フォルダー名(N):」
にも初期表示される「aaa」をDeleteなどで削除してからOKボタンを押しますと
問題なく、正しくフォルダが選ばれるのですが、できましたら
毎回のことになりますから、この「手動で削除する手間を省略させたい」のです。

「.InitialFileName = ThisWorkbook.Path」の使い方が下手か誤りでしょうか?
お手数で誠に恐縮ですが、ご教授いただけましたらありがたいです。
お分かりになられましたら、何卒どうぞよろしくお願いいたします。
(山川海湖) 2023/04/10(月) 01:39:14


 >おそらく、「C:\\aaa\aaa」の意味となり、エラーが出ると思われます。

 やってから質問しましょう
(推測?) 2023/04/10(月) 02:36:44

 .InitialFileName = ThisWorkbook.Path を
 .InitialFileName = ThisWorkbook.Path & "\" 
 として下さい。

 # >そのDeleteの一手間を(毎回なので)無くしたいです。
 # それなら、ダイアログすら必要なく、単に
 # myFolder = ThisWorkbook.Path
 # として、それをカレントフォルダに変更すればよいのでは?

(xyz) 2023/04/10(月) 06:11:56


推測?さん、ご回答ありがとうございます。
パスを省略して書いたのと、意味合いとしてそのようなパスとして扱われているイメージ
でしたので、紛らわしい書き方となってしまいました。
ダイアログで最下位パスまで開かれているのに、そのパスの中で更に、
最下位フォルダ名も再度、初期入力されていましので、
まるで、前述の意味合いとして扱われていることを示したかったのですが、
かえって紛らわしい表現となってしまい申し訳ございませんでした。
(山川海湖) 2023/04/11(火) 07:01:19

xyzさん、別質問でもご教授下さいましてどうもありがとうございました。
またこちらの質問でもご教授頂けましてとても助かっております。

「& "\" 」と語尾を付け加えて動作を試してみましたら
私が作りたかった様に上手くできました。ありがとうございます。
(ちなみに、これの有る無しで、どんな意味の違いになるのでしょうか?)

また、「myFolder = ThisWorkbook.Path」の書き方の場合、
処理は勝手に始めてくれましたが、私が作りたかった構造は、
「ユーザーがフォルダを探さなくても良い、かつ、自由に設定・変更できる」
を実現させたかったですので、前述の「& "\" 」を末尾に追加することで
それが実現できましたので解決できました。

ただ、今回は私はこのように作りたかったですが、今後の何かで
フォルダを操作させずに作る必要がある場合には、
今回ご教授頂けました方法で作る為の引き出しが1つ増えました。

xyzさん、色々とご教授頂けましてどうもありがとうございました。
またよろしければどうぞよろしくお願いいたします。
(山川海湖) 2023/04/11(火) 07:06:14


 FileDialog.InitialFileName プロパティは、
 Application.FileDialog(msoFileDialogFilePicker)
 というファイル選択などとも共用で使われます。

 その関係もあって、
 .InitialFileName = "D:\aaa\bbb\ccc"
 とすると
 cccというファイルと解釈されて、表示されるのでしょう。

 .InitialFileName = "D:\aaa\bbb\ccc\"
 とすると、
 "D:\aaa\bbb\ccc\"フォルダが対象で、
 表示するものは "" という解釈がされるのでしょう。

 MS社が定めた仕様なので、ユーザーが変更はできないですね。
 仕様に応じた使い方をするほかありません。 
(xyz) 2023/04/11(火) 08:23:38

xyzさん、またまたご教授下さりありがとうございます。

FileにもFolderにも対応できるということは、良く解釈しますと、
ある意味、万能なのかもしれませんが、万能であるがゆえにこそ、
具体的に役割を明確に書くことが重要ということですかね。

この学びを通して、理解途上かもしれません私なりにも思えたことは、
確かに、フォルダーを指定したいのであれば、\マークまでを
明確に書くのが筋なのかなとも思えました。

実際に、「.InitialFileName = ThisWorkbook.Path & "\"」まで書くことで
私の想定する動作をしてくれていますから、やはり、書き手となる自分自身が
きっちりとしたコードを正確に書くことが大切だと学べた気がします。

ただ、ワークブックのパスというのは、ブック名までは入らないのですね。
私の勝手な第一印象では、ブック名まで入るのかと思っていました。
パスというのは、その前のフォルダまでなのですかね。
とはいえ、xyzさんも書いて下さいました様に、
単なる文字列では、フォルダ名かファイル名か、あいまいになる余地を
残してしまうので、フォルダならば、「\まで明記」が確実ということですかね。

「仕様に応じた使い方をするほかありません。」とのことですが、
フォルダだと明記する必要があるという筋としても間違えてはいない気もしました。

xyzさん、ご教授やアドバイスやフォローを誠にありがとうございます。
またよろしければどうぞよろしくお願いいたします。
(山川海湖) 2023/04/12(水) 00:14:36


 >ただ、ワークブックのパスというのは、ブック名までは入らないのですね。
 >私の勝手な第一印象では、ブック名まで入るのかと思っていました。

 本当に勝手な第一印象ですな
 フルパスと言うのがある。
 聞いてばかりでなく、本でも買ってもっと勉強しな。
(あきれ顔) 2023/04/12(水) 00:25:57

 FullName の方が良いか
(あきれ顔) 2023/04/12(水) 00:29:32

あきれ顔さん、ご指摘やご助言をありがとうございます。
私の返信がかなり遅くなり申し訳ございませんでした。

私なりに調べてみたりして、.FullName、.Path、.Nameの違いを
認識できました。ヒントを頂けましてどうもありがとうございました。

Sub フォルダやファイルやパス()

    With ThisWorkbook
        MsgBox "ThisWorkbook.FullName = " & .FullName _
            & vbCrLf & "ThisWorkbook.Path = " & .Path _
            & vbCrLf & "ThisWorkbook.Name = " & .Name
    End With
End Sub

あきれ顔さん、ご教授やアドバイスやフォローを誠にありがとうございました。
またよろしければどうぞよろしくお願いいたします。
(山川海湖) 2023/04/16(日) 22:04:05


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.