| 
    
     |  | ▼初心者M さん: 
 >このファイルの場合、「試作品」と「製品」「特別版」は別々に作るので、8行目に数字が入っている場合は9,10行目には何も入りませんし、その逆の場合も同じです。「試作品」だけのシート、「製品版(特別版)」だけのシート、というように、別物になります。
 >
 なるほど、そういうことでしたか。これについては了解です。
 
 >>「繰り上げが必要なのは1個だけです。」というのは、サンプルデータで
 >>「IJK列の9,10行の」データということですよね?
 >
 >その通りです。ここをバラバラの数値にすると、上手く動いてくれるようなのですが・・・
 ここがやはり分りません(ToT)
 
 記号の出現回数のカウントを 1つにしましたので、
 これを使って流すとどうなりますか?
 
 Sub test72() '品名 出現回数をカウント
 Dim n As Long
 Dim y As Long, x As 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") '特別品グループ
 Dim nc As Object
 Set nc = CreateObject("Scripting.Dictionary")
 Dim NCMAX As Long
 
 ActiveSheet.UsedRange.Interior.ColorIndex = xlNone
 NCMAX = [X1].Value
 NCMAX = Val(InputBox$("最大出現回数", , NCMAX))
 If NCMAX < 1 Then Exit Sub
 
 '◆まず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
 nc(ss) = nc(ss) + 1 '出現回数のカウント
 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
 If nc(ss) > NCMAX Then
 c.Interior.Color = vbRed '制限数超過
 End If
 End If
 End If
 Next i
 Next y
 Next x
 
 Dim v
 For Each v In nc.Keys()
 Debug.Print v, nc(v)
 Next
 
 MsgBox "持ち上げが完了しました。" & vbCr _
 & "掛け数の設定されている台は、手集計して下さい"
 
 End Sub
 
 
 |  |