質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

879閲覧

シート別高速処理VBA

jabe

総合スコア43

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2022/08/09 01:26

実現したいこと

集計表.xlsmからVBAを実行し、工程表_2022年4月.xlsmの所定シート(04から始まるシート名)の所定項目を集計表.xlsmへ全て転記したい。

●集計表.xlsm※完成状態
イメージ説明
●工程表_2022年4月.xlsm
イメージ説明
●フォルダ構成
イメージ説明

条件

・工程表_2022年4月.xlsmシート数は、0401~0428まで存在する。※1日1シート存在
・上記各シートは、添付画像と同じデータが入っている。

試した事・発生している問題・エラーメッセージ

現状、for文、if文で一行ずる処理コードしか出来ていない為、処理時間にかなり時間をようしてしまっているので、高速処理できるように解消したくご協力をお願いします。
→連想配列も考えたのですが、データ自体が重複している為キーを設定する事が出来ませんでした。※私の知識の中ですが。

エラーメッセージ

該当のソースコード

VBA

1Sub シート集約() 2Dim source As String '転記元ファイル保管パス 3Dim cWb As Workbook '転記先ファイル変数 4Dim cWs As Worksheet '転記先シート変数 5Dim cWc As Range '転記先該当ファイル名 6Dim cWc1 As Range '転記先該当シート名月 7Dim cWc2 As Range '転記先該当シート名年 8Dim rowAc As Long '転記先A列行番号 9Dim sWb As Workbook '転記元ファイル変数 10Dim sWs As Worksheet '転記元シート変数 11Dim sWc As String '転記元ファイル名 12Dim sWc1 As String '転記元シート名 13Dim sWc2 As String '転記元シート名頭2桁 14Dim rowA As Long '転記元A列行番号 15 16Application.ScreenUpdating = False '画面チラツキ防止 17 18source = "C:\Users\xxx\Desktop\共通\50_VBA\シート別高速処理" 'パスは身バレの為、xxxと表現 19Set cWb = ThisWorkbook 20Set cWs = cWb.Worksheets("Sheet1") 21Set cWc = cWs.Range("A1") 22Set cWc1 = cWs.Range("A2") 23Set cWc2 = cWs.Range("C2") 24Set sWb = Workbooks.Open(source & "\" & cWc, UpdateLinks:=False) 25cWs.Rows("3:" & Rows.Count).ClearContents 'データ削除 26 27For Each sWs In Worksheets 28 If Left(sWs.Name, 2) = cWc1 Then 29 maxrowA = sWs.Cells(Rows.Count, "A").End(xlUp).Row 30 For rowA = 5 To maxrowA 31 maxrowAc = cWs.Cells(Rows.Count, "A").End(xlUp).Row 32 cWs.Cells(maxrowAc + 1, 1) = sWs.Cells(rowA, 1) '型 33 cWs.Cells(maxrowAc + 1, 2) = sWs.Cells(rowA, 2) '品番 34 cWs.Cells(maxrowAc + 1, 3) = sWs.Cells(rowA, 3) '品名 35 cWs.Cells(maxrowAc + 1, 4) = sWs.Cells(rowA, 6) '組立着手日 36 cWs.Cells(maxrowAc + 1, 5) = sWs.Cells(rowA, 7) '組立完了日 37 cWs.Cells(maxrowAc + 1, 6) = cWc2 & "年" & cWc1 '転記元シート年月 38 Next 39 End If 40Next 41 42sWb.Close 43Application.ScreenUpdating = True '画面チラツキ防止 44 45End Sub 46 47

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Usirow

2022/08/09 01:45

連想配列を使うなら、Keyは適当な連番にして、Itemにデータを入れればいいのではないでしょうか。
jabe

2022/08/09 08:38

回答ありがとうございます。 ユニークキーを持つ必要があるってことですね。
guest

回答2

0

ベストアンサー

そのまま転記するだけなら連想配列とか不要です。

vba

1 maxrowA = sWs.Cells(Rows.Count, "A").End(xlUp).Row 2 For rowA = 5 To maxrowA 3 maxrowAc = cWs.Cells(Rows.Count, "A").End(xlUp).Row 4 cWs.Cells(maxrowAc + 1, 1) = sWs.Cells(rowA, 1) '型 5 cWs.Cells(maxrowAc + 1, 2) = sWs.Cells(rowA, 2) '品番 6 cWs.Cells(maxrowAc + 1, 3) = sWs.Cells(rowA, 3) '品名 7 cWs.Cells(maxrowAc + 1, 4) = sWs.Cells(rowA, 6) '組立着手日 8 cWs.Cells(maxrowAc + 1, 5) = sWs.Cells(rowA, 7) '組立完了日 9 cWs.Cells(maxrowAc + 1, 6) = cWc2 & "年" & cWc1 '転記元シート年月 10 Next

上記のループで1行ずつ転記しているところを、まとめて転記するようにすれば高速化されるでしょう。

vba

1 maxrowA = sWs.Cells(Rows.Count, "A").End(xlUp).Row - 4 2 maxrowAc = cWs.Cells(Rows.Count, "A").End(xlUp).Row 3 cWs.Cells(maxrowAc + 1, 1).Resize(maxrowA, 3) = sWs.Cells(5, 1).Resize(maxrowA, 3) 4 cWs.Cells(maxrowAc + 1, 4).Resize(maxrowA, 2) = sWs.Cells(5, 6).Resize(maxrowA, 2) 5 cWs.Cells(maxrowAc + 1, 6).Resize(maxrowA, 1) = cWc2 & "年" & cWc1

追記

cWs.Cells(maxrowAc + 1, 1).Resize(maxrowA, 3) = sWs.Cells(5, 1).Resize(maxrowA, 3)は省略せずに記述すると、
cWs.Cells(maxrowAc + 1, 1).Resize(maxrowA, 3).Value = sWs.Cells(5, 1).Resize(maxrowA, 3).Valueとなります。
セル範囲のValueプロパティは二次元配列を返します。
今回のように何も加工せずに転記する場合は、そのまま代入すれば、セル範囲が一度に転記できます。
セル範囲の値を加工して転記したい場合は、二次元配列の変数に代入してから、それを加工して、転記先のValueに代入するということをします。
加工せずに転記する場合は、二次元配列の変数を使う必要はないです。

投稿2022/08/09 02:24

編集2022/08/09 13:53
hatena19

総合スコア33699

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jabe

2022/08/09 08:36

対応ありがとうございました。 早く処理できるようになりました。 resizeでコピー貼付なるほどです、使わせていただきます。
guest

0

ループでまわすと遅くなります。
各シート先頭行は決まっていて、データの最終行の情報だけ入手して
そのデータ範囲を二次元配列に格納します
二次元配列に格納したデータを集計表に貼り付け・・・で
既存の処理より早く処理できます

投稿2022/08/09 02:20

okakemetal

総合スコア261

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jabe

2022/08/09 08:38

回答ありがとうございます。 hatena19さんのやり方で取得したデータを配列に格納するって事ですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問