[[20191111110431]] 『フォルダ名の全ファイル名を取得する』(りんご) ページの最後に飛ぶ

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

 

『フォルダ名の全ファイル名を取得する』(りんご)

尾張生まれさんの過去ログを参考にしてフォルダ内の
全ファイルのリンクを一覧表示してます。

[[20150419182815]]

表示の仕方を変更したいけど どうやったらいいか
分かりません。

(分からないこと)
・前のデータを削除するコードの挿入場所
 
 ActiveSheet.Cells.Clear

・処理日、フォルダまでのフルパス、フォルダ名
 検索件数の表示する場所をB列からA列に変更したい

・6行目を見出しにしたい
 A列:ナンバー、B列:フォルダ名、C列:ファイル名
 D列:リンク先

・A列に自動でナンバリングしたい

・B列にフォルダ名を表示したい

・C列にファイル名を表示したい
 
・リンク先の表示をB6からD7に変更したい

  A             B        C       D   
1 処理日: 
2 フォルダまでのフルパス:
3 ファオダ名:
4 検索件数:
5
6 ナンバー         フォルダ名  ファイル名  リンク先

Sub test()

    Dim FSO As Object
    Dim cFiles As Variant
    Dim cPath As String
    Dim i As Long
    Dim iSt As Long

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    Set FSO = CreateObject("Scripting.FileSystemObject")

    cPath = ActiveWorkbook.Path & "\"
    iSt = Len(cPath) + 1
    cFiles = Split(CreateObject("WScript.Shell").Exec("CMD /C DIR /A:-D/B/S """ & cPath & "*.*""").StdOut().ReadAll(), vbNewLine)
    For i = 0 To UBound(cFiles) - 1
        ActiveSheet.Hyperlinks.Add Anchor:=Cells(i + 6, "B"), Address:=cFiles(i), TextToDisplay:=Mid(cFiles(i), iSt)
    Next i

    Set FSO = Nothing

    Range("B1") = "処理日: " & Format(Now, "yyyy/mm/dd (aaa) hh:mm")
    Range("B2") = "フォルダまでのフルパス: " & ActiveWorkbook.Path
    Range("B3") = "フォルダ名:" & Dir(ActiveWorkbook.Path, vbDirectory)
    Range("B4") = "検索件数: " & UBound(cFiles) & " ファイル"

    With ActiveSheet.Sort
        .SetRange Range("B6:B" & UBound(cFiles) + 6)
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
 End Sub

 

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


んー、幾つかあった案のうち、私のコードそのまんまですね。

消去なんて、結果表示する前なら、どこでも好きな場所でやれば良いです。 そんな事くらい自分で判断してください。 B列をA列に変えるのだって、"B" の部分を "A" にするだけでしょう? それもご自分で好きに変えてください。 他だってそうです。 自分で好きに追加すればよろしい。 質問するなら、自分で変えたコードと、思ったように行かない状況と、正常時の動作を詳細に書いて欲しいです。 もう二度と自分で直したコードの提示なしに質問しないようにしてください。

 Sub test()
    Dim FSO As Object
    Dim cFiles As Variant
    Dim cPath As String
    Dim i As Long
    Dim iSt As Long
    Dim iw As Long

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    Set FSO = CreateObject("Scripting.FileSystemObject")

    Cells.Clear
    Range("A6:D6") = Array("No.", "フォルダ", "ファイル", "リンク")
    cPath = ActiveWorkbook.Path & "\"
    iSt = Len(cPath) + 1
    cFiles = Split(CreateObject("WScript.Shell").Exec("CMD /C DIR /A:-D/B/S """ & cPath & "*.*""").StdOut().ReadAll(), vbNewLine)
    For i = 0 To UBound(cFiles) - 1
        iw = InStrRev(cFiles(i), "\")
        Cells(i + 7, "A").Value = i + 1
        Cells(i + 7, "B").Value = Mid(cFiles(i), iSt - 1, iw - iSt + 1)
        Cells(i + 7, "C").Value = Mid(cFiles(i), iw + 1)
        ActiveSheet.Hyperlinks.Add Anchor:=Cells(i + 7, "D"), Address:=cFiles(i), TextToDisplay:=Mid(cFiles(i), iSt)
    Next i

    Set FSO = Nothing

    Range("A1") = "処理日: " & Format(Now, "yyyy/mm/dd (aaa) hh:mm")
    Range("A2") = "フォルダまでのフルパス: " & ActiveWorkbook.Path
    Range("A3") = "フォルダ名:" & Dir(ActiveWorkbook.Path, vbDirectory)
    Range("A4") = "検索件数: " & UBound(cFiles) & " ファイル"

    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
 End Sub
(???) 2019/11/11(月) 13:31

マクロ初心者でどこがどうなっているかほとんど分かりません
ネット検索で修正をこころみましたがエラーばかりで過去ログ
のコードに戻したんです

次からは恥ずかしいけどコードをのせます

今後のため教えてください
過去ログのコードと???さんのコードを見比べて分からないことが
あります

このコードはどんなことをしているのですか
調べ方などあったら教えてくれませんか
今はひとつひとつ単語をネットで検索してます

  iw = InStrRev(cFiles(i), "\")
  Cells(i + 7, "A").Value = i + 1
  Cells(i + 7, "B").Value = Mid(cFiles(i), iSt - 1, iw - iSt + 1)
  Cells(i + 7, "C").Value = Mid(cFiles(i), iw + 1)

それと過去ログでは下のコードがあったけどなくてもいいの
ですか

    With ActiveSheet.Sort
        .SetRange Range("B6:B" & UBound(cFiles) + 6)
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

(りんご) 2019/11/11(月) 14:16


???さん

過去ログのコードで直し方が分からないところが全部思って
たとおりにできました

感謝いたします

(りんご) 2019/11/11(月) 14:18


 >  iw = InStrRev(cFiles(i), "\")
これは、フルパスの後ろから\を探してます。知らない命令は、まずヘルプを読んで、理解してください。
(ネットを探すより前に、キーワード上にカーソルを置いて、F1キーを押すだけ)

 >  Cells(i + 7, "A").Value = i + 1
A列なんだから、番号振ってるだけ〜。 これも簡単すぎるから聞かないで欲しいです。
(いい歳した大人に1桁の足し算を教えている気分になるので…)

 >  Cells(i + 7, "B").Value = Mid(cFiles(i), iSt - 1, iw - iSt + 1)
こういうのは、イミディエイトウィンドウやローカルウィンドウを活用して変数の中身を調べ、
何文字目から何文字取り出しているのかデバッグして理解してください。 
iStは自分のブックがあるパスを除いたパスを得るための位置です。 
元のコードには無かった列なので、フォルダ名としてどういう出力が欲しいのか
想像して決めてます。(次からは何がしたいのかしっかり書くように!)

 >  Cells(i + 7, "C").Value = Mid(cFiles(i), iw + 1)
これも出力結果から判る通り、ファイル名だけ取り出してます。 
VBAは何文字取り出すのか省略すると、後ろ全部が返ってきます。

そして、ソート部分をすっぱり削ったのは、元は1つのフォルダに含まれるファイルをソートするのが目的でしたが、今回はフォルダ情報を1行毎に出力しており、想像するに複数のサブフォルダが存在しているのではないかと思いました。 それだと、ファイル名でソートしてしまうとフォルダがごちゃ混ぜになってしまうので、むしろ不要と判断しました。 ソートしたいなら、マクロの記録機能を使って、手作業で好きにソートする様を記録すれば、今回必要なコードは判ると思いますので、ご自身で処理追加してください。

余談ながら、判らない事を人に聞くのは恥じゃないですが、判らないからといって他人にやらせる行為の方が恥だと思いますよ。(正しく動かないコードを見せるのは、質問するために必要な事であり、恥ずかしがるものではありません)
(???) 2019/11/11(月) 15:04


???さん

分かりやすく説明してくださり感謝いたします
もう少し理解には時間がかかりそうです
今後のため教えてもらったことを試してみます

それと、次からしたいことをきちんと説明するようします

(りんご) 2019/11/11(月) 17:23


コメント返信:

[ 一覧(最新更新順) ]


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