[[20210126122934]] 『複数ブックのエクセルの表を統合したい』(お魚) >>BOT

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『複数ブックのエクセルの表を統合したい』(お魚)

ひとつのエクセルに表を統合したいのですが、マクロでの一括処理について教えていただけますでしょうか。

ファイル名で日ごとにファイルが分かれております。
2021016統計.xlsx
2021017統計.xlsx

シート名は同じ(統計)

こちらをひとつのエクセルに表を統合したいのですが、マクロでの一括処理について教えていただけますでしょうか。
何卒よろしくお願い申し上げます。

【イメージ図】

 A B C D
1・・・・
2・・・・
3・・・・
4・・・・

↑↓統合

 A B C D
1●●●●
2●●●●
3●●●●
4●●●●
5●●●●

統合後↓

 A B C D
1・・・・
2・・・・
3・・・・
4・・・・
5●●●●
6●●●●
7●●●●
8●●●●
9●●●●

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


 こんにちは ^^
様々な方法があるかと思いますが
何ファイルで、一ファイル当たり何行×何列。。。くらいなの
でしょうかね。列は4列なのですね?? ^^;、日付情報は含ん
でいます? ^^; 一寸気になった点だけですみません。
とりあえず、ループ処理、とかファイル読込みのエラー対策等が
メインかと。
お困りの箇所等、御座いましたら、さらに具体的に、個別に、
ご説明、賜ればお手伝い出来ることも、有るかもしれません
。。。← 多分 ^^;
私が解らなくとも、諸先生から、アドバイスが有ると思いま
すです。m(__)m
(隠居じーさん) 2021/01/26(火) 13:00

ご丁寧にご返信いただきありがとうございます。
下記、詳細をお伝えいたします。

・ファイル数は月ごとなので最大でも30ファイル
・列はB〜F (B:日付 C:名前 D:顧客番号 E:ID番号 F:TEL番号)
・行の開始は2行目からですが、終わりは日のデータによって異なります。

出来上がったコードをなんとなく理解することはできるのですが(英語を辞書引きながら読むレベル)、一から作ることが出来ません。
ネットをみていろいろためしましたが、どうもうまく作用しないためお力をお借りできればと思いご質問いたしました。

(お魚) 2021/01/26(火) 14:28


>>・行の開始は2行目からですが、終わりは日のデータによって異なります。
過去実績最大件数、若しくは予測最大件数を教えて下さい ← だいたいで OK
です。← 処理速度勘案の為。^^;
行開始は2行目が項目名との理解でよろしいですか。

(隠居じーさん) 2021/01/26(火) 15:20


この手の話はよく見るので、過去ログを調べてみると参考になる物がたくさん見つかると思います。(途中で話が終わっちゃってるのもありますが・・・・
 ▼参考になりそうな例
[[20200415114844]] 『VBAのマクロがうまく動かない』(ノブ)
[[20210121161257]] 『A列のファイル名を参照してフォルダ内のファイルを順にOPENして特定名のシートを1つのファイルに集約するマクロ』(ゲゲル)
[[20201225110230]] 『掲載したマクロ【貼り付け方法の変更】ご教示願います。』(れん)
[[20200613152818]] 『VBA:コピーした行を別ファイルの最終行に張り付けるコード』(じょあ)

>ネットをみていろいろためしましたが、どうもうまく作用しない
無理にとは言いませんが、とりあえずそちらのコードを示して、どのようにうまく作用しないのか説明されてどうでしょうか
(●▲のところで、実行時エラー×× ×××というエラーがでるとか、✕✕になるはずが○○になってしまうなど)

また、いきなり複数のブックを処理しようとすると混乱すると思いますから、まずは1つのブックを

 (1)開く
 (2)必要な範囲をコピーする
 (3)(集約用の(ブックの)シートに貼付する
 (4)閉じる

というのを考えてみてはどうでしょうか。
こちらなら、手作業を【マクロの記録】でコード化することにより、必要な命令を調べることが出来ます。

こちらが完成してから、複数のブックを相手にすることを考えるとよいと思います。
(複数を相手にする場合、ループ処理というものが関わってきますが、マクロの記録では得られないので、少し難易度があがるように感じられるとおもいます。)

余談ですが「英語を辞書引きながら読むレベル」とのことですが、あくまで命令の1つだったりしますので、英単語としての意味にとらわれるより、プログラムとしてどういう意味であるのか研究されたほうがよいと思います。
なお、ネットで見つけたり、質問掲示板で回答のあったコードを研究される際には、「ステップ実行」と呼ばれる方法で1行ずつ実行して動きを確認してみるというのも非常に有効だとおもいます。

VBAの学習をする上で、必須とも言える技術なので、「ステップ実行」という言葉を聞いたことがなければ↓を読んでみてください。

 【ステップ実行】
https://www.239-programing.com/excel-vba/basic/basic023.html
http://plus1excel.web.fc2.com/learning/l301/t405.html

ついでに↓も覚えてしまいましょう。

 【イミディエイトウィンドウ】
https://www.239-programing.com/excel-vba/basic/basic024.html
https://excel-ubara.com/excelvba1/EXCELVBA486.html

 【ローカルウィンドウ】
https://excel-ubara.com/excelvba4/EXCEL266.html
http://excelvba.pc-users.net/fol8/8_2.html

(もこな2) 2021/01/26(火) 16:18


隠居じーさん
ありがとうございます。

最大数は30行ほど
1行目がタイトルで2行目からがデータになります。
(お魚) 2021/01/26(火) 17:03


 こんばんは ^^
新規でマクロ使用可能ブックを作成後 IJ00193.xlsm として保存
シート名が 統計 のシートを作成してください。
ブック読込先フォルダ名とパスは実際の物にご変更してください。
ブックの読込み順は保証されませんので、最終的に読み込んだもの
を日付で並び替えしています。←良いかどうかは解りません。
読込み順を制御する必要が御座いましたら、もう一工夫必要です。
エラー処理、有ったらいいな。。。的なものは御座いません。^^;
もこな2さんのご案内も勘案されると、これくらいのマクロでしたら
ご自分で作成出来るようになると思いますです。でわ。。。m(_ _)m
Option Explicit
Sub OneInstanceMain()
    Const zProgramID  As String = "IJ00193.xlsm"
    Dim zTb           As Workbook
    Dim wB            As Workbook
    Dim wS            As Worksheet
    Dim r             As Range
    Dim i             As Long
    Dim lr            As Long
    Dim fD            As String
    Dim fNm           As String
    Dim v()           As Variant
    Dim t             As Date
    t = Timer
    Set zTb = Workbooks(zProgramID)
    With zTb.Worksheets("統計")
        .UsedRange.Clear
        .Cells(1, 2).Resize(, 5) = Array("日付", "名前", "顧客番号", "ID番号", "TEL番号")
    End With
    fD = zTb.Path & "\myd\"
    fNm = Dir(fD & "*統計.xlsx")
    Do Until fNm = ""
        i = i + 1
        Set wB = Workbooks.Open(fD & fNm)
        Set wS = wB.Worksheets("統計")
        Set r = wS.Cells(1, 2).CurrentRegion
        v = r.Offset(1).Resize(r.Count - 1).Value
        Set r = Nothing
        With zTb.Worksheets("統計")
            lr = .Cells(.Rows.Count, 2).End(xlUp).Row + 1
            .Cells(lr, 2).Resize(UBound(v, 1), UBound(v, 2)) = v
        End With
        Erase v
        wB.Close False
        Set wS = Nothing
        Set wB = Nothing
        fNm = Dir()
        If i Mod 10 = 0 And i >= 10 Then DoEvents
    Loop
     With zTb.Worksheets("統計")
        .Cells(1, 2).CurrentRegion.Sort Key1:=.Range("B1"), Order1:=xlAscending, Header:=xlYes
        .UsedRange.Columns.AutoFit
    End With
    Set zTb = Nothing
    MsgBox "終了 " & Format(Int(Timer - t) / 24 / 60 / 60, "hh : mm : ss") & _
                      Format((Timer - t) - Int(Timer - t), ".000") & " 秒"
End Sub
(隠居じーさん) 2021/01/26(火) 18:32

 追伸 ^^;
すみません。配列を使いましたので、値貼付けです。
読込対象フォルダには読み込む必要のあるブック以外の拡張子
がxlsxのブックは無い前程です。
書式等必要でしたら別途考えます。[直接レンジオブジェクト
操作でコピペかな ^^v]もっとスマートな方法は他の回答者様
のご案内をお待ちくださいね。でわ。。。m(__)m
18:52 変更^^;
(隠居じーさん) 2021/01/26(火) 18:39

隠居じーさん

ありがとうございます。
確認してみたいと思いま!!!!
(お魚) 2021/01/27(水) 11:48


コメント返信:

[ 一覧(最新更新順) ]


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