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

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

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

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

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Q&A

解決済

1回答

638閲覧

VBA 処理を軽くしたい 【シート間データ移行】

ppss

総合スコア40

VBA

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

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

0グッド

0クリップ

投稿2021/04/16 00:54

編集2021/04/16 02:30

Excelでシート間のデータ移行プログラムをVBAで書いていますが処理が遅く
Excelアプリが落ちてしまうことがあります。
処理を軽くするにはどのようなコードに変更すると良いでしょうか。
ご教示お願いいたします。

やりたいことは以下の通りです。
Sheet1に膨大なデータ(5万行ほど)がありその中から
必要なデータをSheet2に移行します。

Sheet1のデータの内、【品物】→冷蔵庫  【番号】→A007 というデータの担当・室温をSheet2に移行する。
移行先の行の指定はSheet1の時間と比較し、同じ時間が入力されている行とする。

生データと移行後のサンプル画像とコードを添付いたしましたのでご参照ください。
何卒宜しくお願いいたします。

質問投稿後コメント欄にアドバイスをいただき
【For文を1つにまとめる】【dictionary活用】2方法を教えて頂きました。現在変更中です・・・・
その他アドバイスありましたら引き続き教えて頂けますと幸いです。

イメージ説明
イメージ説明

VBA

1コード 2Application.ScreenUpdating = False 3 4Dim 時間 As String 5Dim 品物 As String 6Dim 番号 As String 7Dim 室温 As String 8Dim 担当 As String 9 10Dim 品物A As String 11Dim 番号A As String 12Dim 時間A As String 13品物A = "冷蔵庫" 14番号A = "A007" 15 16 17Dim LASTROW As Long 18Dim LASTROW2 As Long 19LASTROW = Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row 20LASTROW2 = Worksheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Row 21 22Dim i As Long 23Dim k As Long 24 For i = 2 To LASTROW 25 時間 = Worksheets("Sheet1").Cells(i, 1).Value 26 品物 = Worksheets("Sheet1").Cells(i, 2).Value 27 番号 = Worksheets("Sheet1").Cells(i, 3).Value 28 室温 = Worksheets("Sheet1").Cells(i, 4).Value 29 担当 = Worksheets("Sheet1").Cells(i, 5).Value 30 31 If 品物 = 品物A And 番号 = 番号A Then 32 33 For k = 2 To LASTROW2 34 時間A = Worksheets("Sheet2").Cells(k, 1).Value 35 36 If 時間 = 時間A Then 37 Worksheets("Sheet2").Cells(k, 2).Value = 室温 38 Worksheets("Sheet2").Cells(k, 3).Value = 担当 39 End If 40 Next k 41 End If 42 Next i 43 44Application.ScreenUpdating = True

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

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

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

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

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

meg_

2021/04/16 01:17

> 処理が遅く Excelアプリが落ちてしまうことがあります 遅いこととExcelが異常終了することは関係あるのでしょうか?
sousuke

2021/04/16 01:33

全体をシート2にコピーして該当以外の室温と担当者を消してはどうですか?
ppss

2021/04/16 01:53

sousuke様  ご回答ありがとうございます。 シート2にはこの前後も行っている処理がありまして 様々なデータが入力されている & 入力予定です そのため今回の転記データのみを残して他を削除するというのは困難です。
ppss

2021/04/16 01:57

meg様 質問ありがとうございます。 今回のプログラムは ①毎回処理が遅い ②アプリが落ちてしまうことが5回に1回ほど 上記のような状況です。 ①、②に関係があるかはわかりません
meg_

2021/04/16 02:01

メモリの使用状況は確認されましたか?
tatsu99

2021/04/16 02:05

Sheet1とSheet2の時刻の並びが同じであり、今後もかわらないという前提ですが、 Sheet1の行番号を示すiとSheet2の行番号を示すkとの間には、 k=i+1という関係があります。 従って、 for k=2 to LASTROW2で該当時刻を探すのではなく、 k=i+1とし、 Worksheets("Sheet2").Cells(k, 2).Value = 室温 Worksheets("Sheet2").Cells(k, 3).Value = 担当 としては、いかがでしょうか。 今後、時刻の並びが変わる可能性があるなら、その旨補足ください。 その場合は、dictionaryを使用する方法があります。
ppss

2021/04/16 02:15

tatsu99様 コメントありがとうございます。 1つのFor文にまとめる方法 可能なので挑戦してみます。 dictionaryはあまり使用経験がないので調べて活用してみます。 ありがとうございます。
ppss

2021/04/16 02:20

meg 様 メモリの使用状況については確認していません。 確認する理由があまりわからないのですが どういった理由でしょうか? 質問に質問を返す形で申し分けありません。
meg_

2021/04/16 02:40

> Excelアプリが落ちてしまうことがあります 上記の原因がメモリ不足にあるのではないか?と疑ったからです。
ppss

2021/04/16 02:51 編集

meg様 メモリ不足が原因だとわかった場合どのような対処になるのでしょうか? プログラムの実行がアプリ落ちのトリガーなのは明白なので プログラムの内容を変更し、処理を軽くする方向の改善しかないと考えていました。 ※今回投稿したプログラム以外のプログラム実行は問題なく処理されています また質問で申し訳ありません。
sazi

2021/04/16 03:57

> 移行先の行の指定はSheet1の時間と比較し、同じ時間が入力されている行とする。 「Sheet2の時間の並びおよび個数はSheet1と同じとは限らない」でしょうか?
meg_

2021/04/16 04:12

> プログラムの内容を変更し、処理を軽くする方向の改善しかないと 「処理を軽く」とはどういう意味でしょうか?文言からは"メモリ使用量を少なく"と解釈しましたが、質問者さんの意図とは違うようなので確認したいです。 > メモリ不足が原因だとわかった場合どのような対処になるのでしょうか? アプリが落ちる原因を特定しないと分かりません。
ppss

2021/04/16 04:39

meg様 ① >「処理を軽く」とはどういう意味でしょうか?文言からは"メモリ使用量を少なく"と解釈しましたが について →処理を軽くは【メモリ使用量を少なく】という解釈でオッケーです。 ② >アプリが落ちる原因を特定しないと分かりません。 について meg様から【アプリが落ちる原因はメモリ不足にあるのではないか?】 という趣旨の助言を頂いたと思います。 そこで私は アプリが落ちる原因がメモリ不足だと特定できた場合、どのような対処が考えられますか? と質問させて頂いた次第です。
meg_

2021/04/16 06:54 編集

>>アプリが落ちる原因を特定しないと分かりません。 どこでメモリ不足が発生しているのか?によって具体的な方法は変わると思います。仮定を重ねた質問への回答は難しいです。
ppss

2021/04/16 09:20

今回の結論としては 皆様のアドバイスを参考にプログラムの内容を変更することで 処理が速くなり、アプリが落ちる現象もなくなりました。 ありがとうございます
guest

回答1

0

ベストアンサー

dictionaryを使用した例です。一応、動作確認しています。

VBA

1Public Sub 室温担当者設定() 2 Application.ScreenUpdating = False 3 Dim dicT As Object 4 Dim 時間 As String 5 Dim 品物 As String 6 Dim 番号 As String 7 Dim 室温 As String 8 Dim 担当 As String 9 10 Dim 品物A As String 11 Dim 番号A As String 12 Dim 時間A As String 13 Dim i As Long 14 Dim k As Long 15 品物A = "冷蔵庫" 16 番号A = "A007" 17 Set dicT = CreateObject("Scripting.Dictionary") 18 19 20 Dim LASTROW As Long 21 Dim LASTROW2 As Long 22 LASTROW = worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row 23 LASTROW2 = worksheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Row 24 For k = 3 To LASTROW2 25 時間A = worksheets("Sheet2").Cells(k, 1).Value 26 dicT(時間A) = k 27 Next 28 29 30 For i = 2 To LASTROW 31 時間 = worksheets("Sheet1").Cells(i, 1).Value 32 品物 = worksheets("Sheet1").Cells(i, 2).Value 33 番号 = worksheets("Sheet1").Cells(i, 3).Value 34 室温 = worksheets("Sheet1").Cells(i, 4).Value 35 担当 = worksheets("Sheet1").Cells(i, 5).Value 36 37 If 品物 = 品物A And 番号 = 番号A Then 38 If dicT.exists(時間) = True Then 39 k = dicT(時間) 40 worksheets("Sheet2").Cells(k, 2).Value = 室温 41 worksheets("Sheet2").Cells(k, 3).Value = 担当 42 End If 43 End If 44 Next i 45 46 Application.ScreenUpdating = True 47End Sub 48

投稿2021/04/16 02:26

編集2021/04/16 02:34
tatsu99

総合スコア5438

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

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

ppss

2021/04/16 02:32

tatsu99様 素早い回答ありがとうございます。 実践してみます!!
tatsu99

2021/04/16 02:34

worksheets("Sheet2").Cells(k, 2).Value = 室温 worksheets("Sheet2").Cells(k, 3).Value = 担当 のインデントがずれてましたので、修正しておきました。
ppss

2021/04/16 02:37

tatsu99様 丁寧に添削頂きありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問