93本目 複数ブックを連結して再分割

VBA100本ノック

VBA100本ノック 93本目を動画で解説しています。Excelの神髄さんの模範解答はコチラ


問題

#VBA100本ノック 93本目
「月別」フォルダには、同一フォーマット(1シートのみ)の
年月別のファイルがあります。
全データを集め、支店別に分割し直し、
「支店別」フォルダに、「支店CD.xlsx」で出力してください。
フォーマットは画像及びサンプルファイルにて。
※「月別」、「支店別」フォルダのパスは任意

解答

Sub ノック93本目()

    Dim wb As Workbook: Set wb = ThisWorkbook
    Dim ws As Worksheet: Set ws = wb.Sheets(1)
    Dim inPath As String: inPath = wb.Path & "\月別\"
    Dim outPath As String: outPath = wb.Path & "\支店別\"
    Dim fso As New FileSystemObject
    Dim f As File, wb元 As Workbook, ws元 As Worksheet, lastrow As Long
    For Each f In fso.GetFolder(inPath).Files '月別フォルダの全ファイルをループ
        Set wb元 = Workbooks.Open(f.Path, , True) ' ファイルを読み取り専用で開く
        Set ws元 = wb元.Sheets(1)
        If ws.Range("A1") = "" Then 'もしこのwsのA1セルが空白なら
            ws元.Range("A1").CurrentRegion.Copy ws.Range("A1") '先頭含めてコピー
        Else
            lastrow = ws.Cells(Rows.Count, 1).End(xlUp).Row  'wsの最終行を取得
            ws元.Range("A1").CurrentRegion.Offset(1).Copy ws.Range("A" & lastrow + 1) '最終行の一つ下へ
        End If
        wb元.Close False ' 最後は閉じる
    Next
    
    Dim wsリスト As Worksheet: Set wsリスト = Worksheets.Add(after:=Sheets(1)) '支社リスト用シート
    ws.Range("A:A").AdvancedFilter xlFilterCopy, , wsリスト.Range("A1"), True '重複を削除しつつコピー
    
    Dim wb先 As Workbook
    Dim ws先 As Worksheet
    Dim i As Long
    For i = 2 To wsリスト.Cells(Rows.Count, 1).End(xlUp).Row
        Set wb先 = Workbooks.Add
        Set ws先 = wb先.Sheets(1)
        ws.Range("A1").CurrentRegion.AutoFilter 1, wsリスト.Cells(i, 1).Value
        ws.Range("A1").CurrentRegion.Copy ws先.Range("A1")
        wb先.SaveAs outPath & wsリスト.Cells(i, 1).Value & ".xlsx"
        wb先.Close
        ws.AutoFilterMode = False
    Next i
        
End Sub

■考え方・流れ
0:00 冒頭・問題確認
2:20 月別フォルダの全ファイルをまとめる
6:50 支店のリストを作成する
9:04 支社ごとに新規ブックに保存

過去の復習の内容が多かったので一つの章が結構ボリューミーだぞ!

新人君
新人君

これがサクッと書けると
カッコいいですよね!

ブチョ
ブチョ

ゆっくりじゃダメなんですか?
2番じゃダメなんですいか?

新人君
新人君

古い…

月別フォルダの全ファイルをまとめる

まずは月別のフォルダの中の全ファイルを、1シート目にまとめていくよ!
今までの総復習だね!

パスとかは任意だから、時と場合と職場の都合によって書き換えてくれ!!

もちろんフォルダやファイル操作は、FSOさんを使ってやっていくよ!

FSO参でファイル名を取得できるから、あとは
Workbook.Openメソッドを使ってExcelを開く!!

1回目のみ先頭行のも含めてコピー。
2回目以降は2行目以降をコピーしたいから、IFで条件分岐を入れてるぞ!

素直に貼り付け先のシートのA1セルが空白かどうかで分岐だ!

このコードを実行するとこんな感じだ!!

支店のリストを作成する

続いては支店のリストを作成していくぞ!!
まずは↓の画像の様に、A列の支店CDの中からユニークなリストを別シートに作る!

それさえできれば、そのリストを使って、フィルター→新規ブック起動→保存 をループさせればいいだけだね!

このリストのシートについては、wsリストとでも定義して扱おう!

ちなみにユニークなリストを作るには、AdvancedFilterメソッドを使えば簡単だぞ!!
手動でやるなら「フィルターの詳細設定」ってやつだね!

これを実行すると、なんと!見事!すばら!
wsリストにユニークなリストを作ることができたぞ!!

支社ごとに新規ブックに保存

よし!最後だ!
完成したシートを支社ごとに新規ブックに保存していくぞ!

※フォルダだけは先に作りました。

出力するためにブックとシートもしっかり変数にしておかないとね!

後は、ユニークなリストのあるwsリストの2行目から最終行までをループして…

出力先のブックは、新規ブック!(Workbooks.Addメソッドの返り値)
出力先のシートは、そのブックの1シート目を格納!

そして!フィルター→コピー→解除を繰り返していく…。。んだけどあれ?
これって…AdvancedFilterでよくね??(疑惑)

え、AdvancedFilterでよくね??
どうなんだろ…(疑惑疑惑)

うーん…。
なんでこう書いたか忘れたけど…
アドバンスでいいような気がしてきた…。
なんか理由あったっけ…??
この動画作ったのもう5か月ぐらい前だからなぁ…

もし誰か理由わかったら教えてwwww

すまん!
よく分からんがお疲れんこん~~~!!

ブチョ
ブチョ

単純に忘れてただけだと見た!

新人君
新人君

たぶんそうっス!

あとがたり

おはこんばんちは。uぷ主です。
93本目!!ブックを分割したりまとめたりなんやかんやしたりする問題でした!

ファイルをまとめる部分のコード(1章部分)だけで、1つの問題ぐらい量あって草。
FSOさんとかForEachさんとかどんだけ使うねんって感じ。

FSOさんは20本目でかな~り濃い目に動画にしたつもりなんですけど…
ForEachさんももっと濃く濃く動画化したほうが良かったかな(今更)
2周目ではちょっとここ検討します。

あと…もしかしたら…AdvancedFilterってノックでは初見?だったかな?
実務で最近使いまくってるんで…初めての気は全くしなかったんですが…

使用シーンは…基本的にはxlFilterCopy+Uniqueをやりたい時。
それ以外は普通にCopyかFilterで何とかしてる気がします。

最近疲れてるのもあり…実務と動画での内容がごっちゃになってて草。
Youtubeが副業に活きてるというか…Youtubeに私生活を殺されてるというか…

とにかく、今回は草生えまくりの解説でしたな~。
申し訳ない。

あと7本。もうちょっとのんびりいきましょうか~。もう年末ですし。

コメント

タイトルとURLをコピーしました