|
▼初心者M さん:
>1.このC9からE16までの「3×9」のブロックが基本で、これが数十個、縦横に並んでいます。今つくろうとしているファイルでは、横27,縦84個あります(右下がCF1344)が、他の、数が違うファイルでも使う可能性があります。これはSTEP数を変えれば良いかと思います。
>
>2.C列の数字が製造ライン台の記号で、E列の番号が必要製造数。ラインごとに、一番大きい数にまとめて作ってしまうイメージです。
> ただし、同じライン「ア」の中でも、たとえばE8の数は試作品、E9は製品、E10は特別版、のように内容が違うので、別々に集計する必要があります。また、D9、D12、D15列に数字が入っていた場合は特別な処理が入るので、この場合は無視して飛ばす必要があります。この時、色を付けたいです。
>3.「ア」と同じラインがあれば、E8・E9・E10に対応する数値を、それぞれシートの中で探してきて最大値にまとめる。
>
ここまでの処理ですが、
最大値はグループの1行目「試作品」用、2行目の「製品」用、3行目の「特別版」
用別々に求める必要があるということですから、
目的別に Dictionary を用意します。
→ dic でなくて、 dic(1) dic(2) dic(3)↓の3つを用意してやります。
元表をコピーしたダミーシートで、以下を試してみてください。
そのとき、
> Const Y0 = 8, YY = 84, Ystp = 16 '縦方向 最初の行番・Loop回数・Step数
> Const X0 = 3, XX = 27, Xstp = 3 '横方向 最初の列番・Loop回数・Step数
は実情に合わせて、変更願います。
Sub test6()
Dim n As Long
Dim y As Long, x As Long '整数型は特別な場合を除いて Long がよい
Dim i As Long, k As Long
Dim ss As String
Dim c As Range
Const Y0 = 8, YY = 84, Ystp = 16 '縦方向 最初の行番・Loop回数・Step数
Const X0 = 3, XX = 27, Xstp = 3 '横方向 最初の列番・Loop回数・Step数
Dim dic(1 To 3) As Object
Set dic(1) = CreateObject("Scripting.Dictionary") '試作品グループ
Set dic(2) = CreateObject("Scripting.Dictionary") '製品グループ
Set dic(3) = CreateObject("Scripting.Dictionary") '特別品グループ
ActiveSheet.UsedRange.Interior.ColorIndex = xlNone
'◆まずC列のキー別に、1段目、2段目、3段目別に、最大値を求める
For x = X0 To X0 + (XX - 1) * Xstp Step Xstp
For y = Y0 To Y0 + (YY - 1) * Ystp Step Ystp
For i = 2 To 8 Step 3 '[C8]セルを1行目として
Set c = Cells(y, x).Item(i, 1) '2,5,8行目
'ただし D列に数字が入っていたら
If WorksheetFunction.IsNumber(c(1, 2)) Then
'「何もしない」塗りつぶすだけ
c.Resize(, 2).Interior.Color = vbGreen
Else
ss = c.Value
If Len(ss) > 0 Then
For k = 1 To 3 '記号のある行の-1行〜2行までの3行
n = WorksheetFunction. _
RoundUp(c.Offset(k - 2, 2).Value, -2)
If Not dic(k).Exists(ss) Then 'keyが無ければ登録
dic(k)(ss) = n 'その行の数値を登録
ElseIf dic(k)(ss) < n Then 'すでにキーのあるとき
'この行のnがこれまでの最大値より大きければ
dic(k)(ss) = n '最大値の更新
End If
Next k
End If
End If
Next i
Next y
Next x
'◆求まったキー別最大値で元表の数値列を更新
For x = X0 To X0 + (XX - 1) * Xstp Step Xstp
For y = Y0 To Y0 + (YY - 1) * Ystp Step Ystp
For i = 2 To 8 Step 3 '[C8]セルを1行目として
Set c = Cells(y, x).Item(i, 1) '2,5,8行目
'ただし D列に数字が入っていたら
If WorksheetFunction.IsNumber(c(1, 2)) Then
'「何もしない」
Else
ss = c.Value
If Len(ss) > 0 Then
For k = 1 To 3 '記号のある行の-1行〜2行までの3行
c.Offset(k - 2, 2).Value = dic(k)(ss)
Next k
End If
End If
Next i
Next y
Next x
MsgBox "持ち上げが完了しました。" & vbCr _
& "掛け数の設定されている台は、手集計して下さい"
End Sub
あと、
>4.物によってラインに取り込める数が「4」や「8」と決まっているので(シートごとに固定)、もし「ア」が5個有るなどそれ以外の数値だった場合、エラー表示を出したい。
これについては処理してませんが、「物によってラインに取り込める数」という
のは、どこに書いてあるのですか?
|
|