Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1509 / 13645 ツリー ←次へ | 前へ→

【73927】フォルダ個数計算方法 candle 13/3/22(金) 12:52 質問[未読]
【73928】Re:フォルダ個数計算方法 UO3 13/3/22(金) 16:21 発言[未読]
【73943】Re:フォルダ個数計算方法 candle 13/3/23(土) 1:32 質問[未読]
【73944】Re:フォルダ個数計算方法 UO3 13/3/23(土) 6:43 発言[未読]
【73950】Re:フォルダ個数計算方法 candle 13/3/23(土) 14:28 質問[未読]
【73951】Re:フォルダ個数計算方法 UO3 13/3/23(土) 15:13 発言[未読]
【73952】Re:フォルダ個数計算方法 UO3 13/3/23(土) 15:19 発言[未読]
【73953】Re:フォルダ個数計算方法 candle 13/3/23(土) 15:45 お礼[未読]

【73927】フォルダ個数計算方法
質問  candle  - 13/3/22(金) 12:52 -

引用なし
パスワード
   任意のフォルダ内におけるフォルダ個数をExcel VBAで計算したいのですが、

(例)
C:\フォルダ個数\Aa001
C:\フォルダ個数\Ai002
C:\フォルダ個数\Au003
・・・・・・
C→「フォルダ個数」フォルダ内に、任意のフォルダ(都度変わる)が複数存在し、
任意のフォルダ内(上記例ではAa001,Ai002,Au003)にあるフォルダ数をExcelに出力したい。

<出力結果Excel(例)>
A列   B列
Aa001  10
Ai002  5
Au003  2

※A列に任意のフォルダ名、B列に任意フォルダ名内のフォルダ個数
※出力先のExcelシート名は、「フォルダ数」とした場合

以上お手数おかけいたしますが、ご教授の程よろしくお願いいたします。

【73928】Re:フォルダ個数計算方法
発言  UO3  - 13/3/22(金) 16:21 -

引用なし
パスワード
   ▼candle さん:

この要件なら再帰を使わずベタベタなコードでも。

Sub Sample()
  Dim fso As Object
  Dim x As Long
  Dim pfold As Object
  Dim cfold As Object
  Dim cnt As Long
  
  Columns("A:B").ClearContents
  Set fso = CreateObject("Scripting.FileSystemObject")
  For Each pfold In fso.getfolder("c:\フォルダ個数").subfolders
    x = x + 1
    cnt = 0
    Range("A" & x).Value = pfold.Name
    For Each cfold In pfold.subfolders
      cnt = cnt + 1
    Next
    Range("B" & x).Value = cnt
  Next
  
End Sub

【73943】Re:フォルダ個数計算方法
質問  candle  - 13/3/23(土) 1:32 -

引用なし
パスワード
   ありがとうございます。(確かにできました。すごい。)

早速ご回答いただき大変恐縮なのですが、実は私の勘違いで、フォルダ階層が間違っておりました。本当にすいません。。

以下の通り変更したいのですが、可能でしょうか?


(例)
C:\フォルダ個数\Aa001\C0001
C:\フォルダ個数\Aa001\C0002
C:\フォルダ個数\Ka001\C0003
・・・・・・

C→「フォルダ個数」フォルダ内に、任意のフォルダ(都度変わる)が複数存在します。

上記例では
○C→「フォルダ個数」→「Aa001」フォルダ内に「C0001、C0002」フォルダ2つ存在する。

○C→「フォルダ個数」→「ka001」フォルダ内に「C0003」フォルダ1つ存在する。


そこで、上記任意のフォルダ内(上記例ではC0001,C0002,C0003)にあるフォルダ数をExcelに出力したい。
※「Aa001」、「ka001」内のフォルダ数ではございません。


<出力結果Excel(例)>
A列   B列
Aa001  10
Ka001  5


○セルA1、B1の説明
→A1(Aa001)フォルダ内の「C0001」「C0002」フォルダ内にあるフォルダ個数の合計をB1に表示する。


○セルA2、B2の説明
→A2(Ka001)フォルダ内の「C0003」フォルダ内にあるフォルダ個数の合計をB2に表示する。

※出力先のExcelシート名は、「フォルダ数」とした場合


自分の勘違いから、ややこしくなってすいません。

お手数おかけいたしますが、どうかよろしくお願いいたします。

【73944】Re:フォルダ個数計算方法
発言  UO3  - 13/3/23(土) 6:43 -

引用なし
パスワード
   ▼candle さん:

アップしたコードは親フォルダ->子フォルダの関連での処理をしていますが
これを、親フォルダ->子フォルダ->孫フォルダに、コード的にも階層を1つ追加すればよろしいかと。
実際の環境をつくっての確認はしていませんのでバグあればご容赦ください。

Sub Sample2()
  Dim fso As Object
  Dim x As Long
  Dim pfold As Object
  Dim cfold As Object
  Dim mfold As Object
  Dim cnt As Long
 
  Columns("A:B").ClearContents
  Set fso = CreateObject("Scripting.FileSystemObject")
  For Each pfold In fso.getfolder("c:\フォルダ個数").subfolders
    For Each cfold In pfold.subforders
      x = x + 1
      cnt = 0
      Range("A" & x).Value = cfold.Name
      For Each mfold In cfold.subfolders
        cnt = cnt + 1
      Next
      Range("B" & x).Value = cnt
    Next
  Next
 
End Sub

【73950】Re:フォルダ個数計算方法
質問  candle  - 13/3/23(土) 14:28 -

引用なし
パスワード
   早速、ご回答いただきありがとうございます。

試してみたのですが、

出力結果が孫フォルダ内の合計値ではなく、
孫フォルダ内の個数別に出力されてしまいます。

<出力結果>
A列   B列
Aa001  4
Aa001  6
Ka001  5


上記結果でいうと「Aa001」がそれぞれ「C0001」と「C0002」フォルダ内のフォルダ個数を表示されているため、下記のように合計値で表示させたいです。

<出力結果>
A列   B列
Aa001  10
Ka001  5

集計すればよさそうですが、上手くいかなかったので、
ご教示の程よろしくお願いいたします。

【73951】Re:フォルダ個数計算方法
発言  UO3  - 13/3/23(土) 15:13 -

引用なし
パスワード
   ▼candle さん:

こんにちは

まずアップしたコード、一ヶ所 subfolders とすべきところ
subforders とスペルミスがありましたね。そちらで修正いただいたと思います。
やはり、ちゃんと実行して確認してから回答しなくちゃいけませんね。ごめんなさい。

ところで、そちらの実行結果ですが

Aa001  4
Aa001  6
Ka001  5


こんなようになりました?

C0001 nn
C0002 xx



こんなように孫フォルダ毎の表示になっていると思いますが?

いずれにしても、そちらの要件を誤解していました。
表示すべき数は【孫フォルダ内のフォルダ数】であっても、表示の単位は
【子フォルダ】ごとということだったんですね?
のちほど、修正版アップします。

今度はちゃんと動かしてからアップしますので、今からフォルダ環境をつくります。

【73952】Re:フォルダ個数計算方法
発言  UO3  - 13/3/23(土) 15:19 -

引用なし
パスワード
   ▼candle さん:

一応、実行して確認しましたのでアップします。
まだ要件を取り違えていれば指摘願います。

Sub Sample3()
  Dim fso As Object
  Dim x As Long
  Dim pfold As Object
  Dim cfold As Object
  Dim mfold As Object
  Dim cnt As Long

  Columns("A:B").ClearContents
  Set fso = CreateObject("Scripting.FileSystemObject")
  For Each pfold In fso.getfolder("c:\フォルダ個数").subfolders
    x = x + 1
    Range("A" & x).Value = pfold.Name
    cnt = 0
    For Each cfold In pfold.subfolders
      For Each mfold In cfold.subfolders
        cnt = cnt + 1
      Next
      Range("B" & x).Value = cnt
    Next
  Next

End Sub

【73953】Re:フォルダ個数計算方法
お礼  candle  - 13/3/23(土) 15:45 -

引用なし
パスワード
   早速ご回答頂き誠にありがとうございます。

できました!すごいです。
ありがとうございます。

ご連絡頂きました下記内容ですが

>ところで、そちらの実行結果ですが

>こんなようになりました?

>C0001 nn
>C0002 xx
>・
>・

>こんなように孫フォルダ毎の表示になっていると思いますが?

こちらは、手探りで修正(Range("A" & x).Value = cfold.Nameの箇所)し、親フォルダを表示させておりました。
特に連絡しなかったので、失礼いたしました。

この度はありがとうございました。

1509 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free