[[20171004103330]] 『任意のフォルダ取得方法』(万年じじい) ページの最後に飛ぶ

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

 

『任意のフォルダ取得方法』(万年じじい)

任意のフォルダを検索する手段の1つとしてダイアログをオープンして

Application.Dialogs(xlDialogOpen).Show  と記述する方法を取っていますが、

ファイル名をクリックするかキャンセルしないと閉じることができず、又閉じる時、
そのPath名を記録できない?のでファイルを開けないでそのファイルが入っているフォルダ名を取得する方法があったら、教えて下さいますか?

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 色んなフォルダパス取得の方法がありますが、ダイアログ形式だと
 何らかのクリックが必要になると思います。

 どういう作業でフォルダパスを取得したいのでしょう?
(カリーニン) 2017/10/04(水) 10:44

取得したフォルダ内全ファイルの一覧をセルに記述するのが目的です。
(万年じじい) 2017/10/04(水) 10:57

 Application.GetOpenFilename
 だとパス名+ファイル名は取得するが実際には開かないのでそこからパス名を取り出してはどうか。
 フォルダ内のファイルを確認する必要がない(フォルダだけわかればいい)場合は下記を参考に

http://officetanaka.net/excel/vba/tips/tips39.htm
(ねむねむ) 2017/10/04(水) 11:22


ご使用のダイアログは、ファイル選択するためのものです。だからファイル選択しないと、選択が終わらないのです。
フォルダを選択したいならば、例えば以下のようにもできます。

 Sub test()
    Dim cPath As String
    Dim cFile As String
    Dim iR As Long

    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = True Then
            cPath = .SelectedItems(1)
            If Right(cPath, 1) <> "\" Then
                cPath = cPath & "\"
            End If
        Else
            Exit Sub
        End If
    End With

    cFile = Dir(cPath & "*.*")
    While cFile <> ""
        iR = iR + 1
        ActiveSheet.Cells(iR, "A").Value = cPath & "\" & cFile
        cFile = Dir
    Wend
 End Sub
(???) 2017/10/04(水) 11:28

ねむねむさん、色々な情報ありがとうございます。時間を作ってそれぞれのパターンを勉強させていただきます。

???さん、高尚な事例、ありがとうございます。まさにこれが欲しかったのです。今回はこれを即実行させて頂きます。(少し修正)→Pathを省いてfile名のみ記述
(万年じじい) 2017/10/04(水) 13:39


cFileを分割してB列にcFileの名前,C列に拡張子を記述したく
GetBaseName,GetExtensionNameメソッドを入れたところ、エラーになりました。
どこに問題があるのかわかりません。

   cFile = Dir(cPath & "*.*")
    While cFile <> ""
        iR = iR + 1
        ActiveSheet.Cells(iR, "A").Value = cFile
        cFile = Dir
        ActiveSheet.Cells(iR, "B").Value = GetBaseName(cPath)
        ActiveSheet.Cells(iR, "C").Value = GetExtensionName(cPath)
    Wend

(万年じじい) 2017/10/04(水) 15:02


 "Scripting.FileSystemObject"
 のSetが行われてないのでは?
(カリーニン) 2017/10/04(水) 15:14

恥ずかしながら、目下、FSOの取り扱いについて勉強中です。
参照設定で Microsoft Scripting Runtimeを設定した場合は
Dim Tmm as New FileSystemObject の記述は不要ですか?それとも必要ですか?

Dim fn,kt as string と定義した上で

Set Tmm=CreateObject("Scripting.FileSystemObject")
Set fn=Tmm.GetBaseName(cPath)
Set kt=Tmm.GetExtensionName(cPath)

と記述したところ、「コンパイルエラー:オブジェクトが必要です」と表示されました。
増々わからなくなりました。

(万年じじい) 2017/10/04(水) 16:12


 Setはオブジェクト変数にオブジェクトをセットするもの。
 >Set fn=Tmm.GetBaseName(cPath) 
 >Set kt=Tmm.GetExtensionName(cPath)
 は結果の値を変数に入れるのだから単純な代入でいい。
 fn=Tmm.GetBaseName(cPath) 
 kt=Tmm.GetExtensionName(cPath
(ねむねむ) 2017/10/04(水) 16:15

 あと、本題とは関係ないが
 Dim fn,kt as string
 はktは文字列型になるがfnはバリアント型になる。
 両方文字列型とするには
 Dim fn As String, kt As String
 で。
(ねむねむ) 2017/10/04(水) 16:22

ねむねむさん、うまくできました。ありがとうございます。
 m(_ _)m m(_ _)m
(万年じじい) 2017/10/04(水) 16:40

自己レスです。
参照設定で Microsoft Scripting Runtime のチェックをはずしたら、エラーになり、チェックを入れたら
うまく機能しました。何故かは小生の浅薄な知識ではわかりませんが・・・

(万年じじい) 2017/10/04(水) 17:16


FileSystemObjectというデータ型は、Excel標準ではないので、エラーになります。参照設定することで、オブジェクトが追加されてメモリに載るようになり、FileSystemObject型が使えるようになります。このように、実行する前に追加オブジェクトを明示することを、アーリーバインドと呼びます。

もうひとつの、CreateObject("Scripting.FileSystemObject") を使う方法は、この Set文を実行した際に FileSystemObject がメモリに載ります。 事前に型はわからないので、汎用オブジェクト型の Object型として配列宣言すれば良いです。 こっちの方法は、レイトバインドと呼びます。

いずれにせよ、Excel標準ではないオブジェクトなので、使いたいならば、他人には頼らずに、ご自身で調べきることを覚悟して使ってください。 標準ではDir関数があるのですから、そちらを使うべきですよ。
(???) 2017/10/04(水) 18:06


???さん、解説ありがとうございます。言われてみればExcel標準ではないですね。本屋でVBA辞典を
片っ端から探してみても最新の本にしか載っていないし、FSO以外にもDictionaryObjectとか高級な概念の
オブジェクトがたまに出てくるのでこういう概念はどこから得るのか?VBA以外にどんな言語ソフト開発をすれば
こういう知識が得られるのか、参考としてご教示頂けませんか?

(万年じじい) 2017/10/05(木) 11:08


オブジェクト名でWeb検索すれば出てきますが、windowsの機能を使うためのオブジェクトなので、Microsoftが仕様を公開しています。 ご質問の2点は、HTML表現をリッチにする、スクリプト言語用に開発されたもののようですね。
https://msdn.microsoft.com/ja-jp/library/cc428071.aspx
https://msdn.microsoft.com/ja-jp/library/cc428065.aspx

ご覧の通り、Excelの話なんて出てこないのですが、windowsのアプリ構造は共通性のある仕組みになっているので、使える訳ですね。(プロパティとかメソッドとあるものが重要な情報です) 他にも、調べると .NETやC#用のフレームワークにたどり着く事も多いです。 ツリーをさかのぼってみると、いろいろ小難しい用語が沢山でてきて、さっぱり判らない事でしょう。 難しい内容が多すぎて、こういう技術をいちいち質問・回答していたのでは、答えきれない訳です。 だから自力で捜せない人、試さない人には、使わない事をお薦めするのですよ。

といっても、これらのオブジェクトを使う人が全員Microsoftのドキュメントに目を通しているのではなく、誰かが有効利用したコードを見つけて、それを真似たり応用したりして広まっている感じです。 自力でWeb検索して解決できるならば、完全理解せずとも使える、という訳ですね。 これはアリだと思っています。
(???) 2017/10/05(木) 11:36


言わんとする事、よーくわかりました。
(万年じじい) 2017/10/05(木) 11:44

どうりでExcelの守備範囲を超える分野(Windowsのアプリ関連)はVBA辞典からはスパッと切り捨てているんですな〜。
(万年じじい) 2017/10/06(金) 10:10

どうりで➡どおりで(通りで)
(国語適正化委員会) 2017/10/06(金) 10:54

「どうりで」で正しかったですね。失礼しました。
「道理で」ですね。
(国語適正化委員会) 2017/10/06(金) 10:57

コメント返信:

[ 一覧(最新更新順) ]


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