| 
    
     |  | 今、在庫と仕掛品の引当表を作っています。 現在のコードでは、とてもじゃないけど、莫大な時間を要してしまって、
 使いものにならない状態です。
 なんとか、処理が高速化するようにコードを変えたいのですが、
 いまいち、良い方法が思いつきません
 
 [シート1] 部品の在庫数と仕掛数の一覧です
 部品名  在庫数  仕掛数
 AAA     10    10
 BBB     15    12
 CCC     13    20
 DDD     20    16
 EEE     10     7
 FFF     40    20
 
 上記のようなデータが8000件ほどあります
 
 [シート2]から10シートほどに渡って、総計で6万件のデータが下記のように
 あります
 
 列数は、100列程度あります
 部品名 必要数 A車  B車  C車  D車  E車…以降、まだ続きます
 AAA    2  ●   ●   ●   ● ←セルを引当可能なら塗りつぶす
 CCC    2      ●   ●   ●
 AAA    2         ●   ●
 BBB    4  ●   ●
 AAA    3      ●
 EEE    7         ●      ●
 ・
 ・
 ・
 行数は各シート毎でバラバラですが、多いシートで38000件あります
 引当の順としては、A車のAAA、A車のCCC、A車のAAA、A車のBBB、A車のAAA、A車のEEE、B車のAAA…、といったように、列毎から順に見ていきます
 これを、A車から、順に在庫と仕掛を引当していくのですが、
 在庫引当可能なら、緑色に塗りつぶす
 在庫が不足してる場合は、黄色に塗りつぶす
 在庫が引当できなくて、仕掛引当可能ならピンクに塗りつぶす
 
 今のコードはこんな感じです
 
 Dim TARGET() As Variant
 Dim MyItem As String
 Dim 必要数 As Long
 Dim 最終C As Long
 Dim 最終R As Long
 
 Dim st As Single
 st = Timer()
 
 Sheets("シート1").Activate
 
 i = 0
 
 ReDim TARGET(Range("A" & Rows.Count).End(xlUp).Row, 2)
 For i = 0 To Range("A" & Rows.Count).End(xlUp).Row
 If i > 3 Then
 ’在庫表のデータを全て配列に格納します
 TARGET(i - 4, 0) = Range("A" & i).Value
 TARGET(i - 4, 1) = Range("B" & i).Value
 TARGET(i - 4, 2) = Range("C" & i).Value
 End If
 Next i
 
 '*********************************
 '全シートに在庫仕掛を引当する
 '在庫=緑、仕掛=ピンク、不足=黄色
 '*********************************
 最終C = Sheets(2).Cells(1, Columns.Count).End(xlToLeft).Column
 
 For r = 0 To UBound(TARGET)
 For x = 3 To 最終C
 For y = 2 To Sheets.Count
 
 Worksheets(y).Activate
 
 最終R = Range("A" & Rows.Count).End(xlUp).Row
 
 For i = 2 To 最終R
 If TARGET(r, 0) = Cells(i, "A").Value Then
 MyItem = Cells(i, 1).Value 'A列
 必要数 = Cells(i, 2).Value 'B列
 'もし、空白でなかったら、
 If Cells(i, x).Value <> "" then
 '必要数が在庫より少ない場合は緑(引当)
 If 必要数 <= TARGET(r, 1) Then
 Cells(i, x).Interior.ColorIndex = 4
 TARGET(r, 1) = TARGET(r, 1) - 必要数
 '必要数が在庫より多くて、在庫がゼロより多い場合は数不足の為、黄色
 ElseIf TARGET(r, 1) <= 必要数 And TARGET(r, 1) > 0 Then
 Cells(i, x).Interior.ColorIndex = 6
 TARGET(r, 1) = 必要数 - TARGET(r, 1)
 TARGET(r, 2) = TARGET(r, 2) - TARGET(r, 1)
 TARGET(r, 1) = 0 '完成引当の終了
 '必要数が仕掛より少ない場合はピンク(引当)
 ElseIf TARGET(r, 1) = 0 Then
 If 必要数 <= TARGET(r, 2) Then
 Cells(i, x).Interior.ColorIndex = 38
 TARGET(r, 2) = TARGET(r, 2) - 必要数
 '必要数が仕掛より多く、仕掛がゼロより多かったら数不足の為、黄色
 ElseIf TARGET(r, 2) <= 必要数 And TARGET(r, 2) > 0 Then
 Cells(i, x).Interior.ColorIndex = 6
 TARGET(r, 2) = 0
 '仕掛がゼロだったらループ抜ける
 ElseIf TARGET(r, 2) = 0 Then GoTo 抜ける
 End If
 End If
 End If
 'End If
 Else
 GoTo 抜ける
 End If
 Next i
 Next y
 Next x
 抜ける:
 
 Next r
 
 End Sub
 
 分かりにくいかもしれませんが、どうか良きアドバイスがありましたらお願いします
 
 
 |  |