以下のコードが行数が多くなると固まってしまいます。
(10万行ほど)
構成シートのA列と、集計画面のJ列が一致したら、集計画面のT列に構成シートのC列を出力したいのです。
この構成シートのA列にあたる部分が固定されている他のマクロでは上手く動きましたが、今回は変動有のリストなので最終行まで見ようとしています。
※最初の変動がないリストに関しては無事動作しました
VBA
1Sub 構成反映2() 2 3 4 Dim Sh1, Sh2 As Worksheet 5 Dim rM, rH, rMy, rFirst, rU As Range 6 7 Set Sh1 = ThisWorkbook.Worksheets("集計画面") 8 Set Sh2 = ThisWorkbook.Worksheets("構成") 9 10 Application.ScreenUpdating = False 11 Application.Calculation = xlManual 12 13 '最終行の取得 14 Dim lastrow As Long 15 Dim lastrow2 As Long 16 lastrow = Sh1.Cells(Rows.Count, 10).End(xlUp).Row 17 lastrow2 = Sh2.Cells(Rows.Count, 1).End(xlUp).Row 18 19 '検索 20 For Each rM In Sh2.Range("A2:A" & lastrow2) 21 Set rH = Sh1.Range("J2:J" & lastrow) 22 Set rMy = rH.Find(What:=rM.Value) 23 24 If rMy Is Nothing Then 25 Exit For 26 Else 27 Set rFirst = rMy 28 rMy.Offset(, 10).Value = rM.Offset(, 2).Value 29 End If 30 Do 31 Set rMy = rH.FindNext(rMy) 32 If rMy.Address = rFirst.Address Then 33 Exit Do 34 Else 35 rMy.Offset(, 10).Value = rM.Offset(, 2).Value 36 End If 37 Loop 38 Next 39 40 41 Sh1.Range("T1").Value = "構成" 42 43 Application.Calculation = xlAutomatic 44 Application.ScreenUpdating = True 45 46End Sub
↓Esc押せば結果がなぜか出てくるコードはこちら↓
VBA
1 2Sub 構成反映() 3 Dim Sh1, Sh2 As Worksheet 4 Set Sh1 = ThisWorkbook.Worksheets("集計画面") 5 Set Sh2 = ThisWorkbook.Worksheets("材料構成") 6 '------最終行の取得 7 8 Dim lastrow As Long 9 lastrow = Sh2.Cells(Rows.Count, "A").End(xlUp).Row 10 11 Dim prefRng, cityRng As Range 12 Set prefRng = Range(Sh2.Cells(2, 1), Sh2.Cells(40000, 1)) 13 14 Dim workEndR, workTmpR As Long, tmpStr As String 15 workEndR = Sh1.Cells(Rows.Count, 1).End(xlUp).Row 16 17 Dim x As Long 18 Application.ScreenUpdating = False 19 20 For x = 0 To workEndR 21 For workTmpR = 2 To workEndR 22 tmpStr = Sh1.Cells(workTmpR, 10).Value 23 On Error Resume Next 24 Sh1.Cells(workTmpR, 20).Value = Sh2.Cells(Application.WorksheetFunction.Match(tmpStr, prefRng, 0) + 1, 3) 25 Next 26 Next 27 Sh1.Range("T1").Value = "構成" 28 29End Sub
"構成"ワークシートのA列に入っているデータの数が固定でない件については、"lastrow2 = Sh2.Cells(Rows.Count, 1).End(xlUp).Row"というコードで最後のデータの行を探すことで問題解決しているはずです。 それでもうまくいかないのは、"構成"ワークシートのA列の途中に空白のセルが存在している等、ワークシートのデータに問題があるためだと思われます。 プログラムを疑う前に、データを疑ってみてはどうでしょうか? "構成"ワークシートでフィルターをかけて、A列に空白セルが含まれていないかどうかを確認してみてください。
構成ワークシートのA列の値と、C列の値を辞書(Dictionary)にして、RangeのFindではなくDictionaryの検索を使うと、相当実行速度が上がると思います。
空白やエラー値はありません。教えていただいた方法でもう少し頑張ってみます。
「最初の変動がないリストに関しては無事動作しました」と書いてあるという事は、「変動有のリスト」では動作しない(無事には終わらない?)などの問題があるのですよね? 何が問題なのですか???
95列固定の場合だと値が入力されてましたが、提示しているマクロだと入力されずに終わってしまいます。
回答6件
あなたの回答
tips
プレビュー