[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『合計した数分だけ色付けしたいです。』(まつ)
エクセルで
シートを2つ使います。
シート1では数字の記号があり(種類多い)
AさんBさんそれぞれ
個数を記号ごとに手入力するシートです。 シート2では
順番バラバラに記号が
縦方向に並んだ一覧のあるシートです。
したいことは
2のシートで
記号の一致するセルを
それぞれの個数分だけ
AさんとBさんが被らないように
色分けしていきたいです。
(例)シート1
| A | B
12 | 1 | 3
16 | 7 | 0
11 | 1 | 2
•
•
•
↑ ↑数字手入力
(例)シート2
記号
12←Aさんの色
12←Bさんの色
19
16
12←Bさん
11
16
14
12←Bさん
12←色付けなし
13
•
•
•
↑手入力した分色付け
補足 シート1は毎日使い回すので 個数記入の欄は 1日の終わりに0に戻します。 2は色付けしたまま残したいです。
< 使用 Excel:Excel2016、使用 OS:Windows7 >
2.その通りです。
3.シート2は発注書の貼り付け場所なので
ソートOKです。
記号列は新しいシートを増やすとかでならOKです。
(まつ) 2020/10/25(日) 12:10
> 時間差があるので色分けしたいと思ってます。 これは少し納得する要素でした。
> 入力はそれぞれAさんBさんでシート2での > 消し込みと漏れがないかの確認目的です。 入力者を入れる列などはないんですか?普通はそうしません? そうすれば、あとはシート2で個数だけを再集計して比較するだけだと思いますが。
もしそういう入力者判別情報があれば、 下記のようなマクロでA,Bそれぞれ別の色を付けると、 それぞれが一致しないことになりますよ。
まあ、一応、コードを書いてみたので、参考にして下さい。
Sub test()
Dim ws1 As Worksheet, ws2 As Worksheet
Dim dicAmax As Object
Dim dicBmax As Object
Dim dicA As Object
Dim dicB As Object
Dim k As Long
Dim r As Range
Dim v As Variant
Set dicAmax = CreateObject("Scripting.Dictionary")
Set dicBmax = CreateObject("Scripting.Dictionary")
Set dicA = CreateObject("Scripting.Dictionary")
Set dicB = CreateObject("Scripting.Dictionary")
Set ws1 = Worksheets("Sheet1")
Set ws2 = Worksheets("Sheet2")
'個数を取り込む
For k = 2 To ws1.Cells(Rows.Count, "A").End(xlUp).Row
dicAmax(ws1.Cells(k, 1).Value) = ws1.Cells(k, 2).Value
dicBmax(ws1.Cells(k, 1).Value) = ws1.Cells(k, 3).Value
Next
'上から順に処理(枠内であれば着色。完了済み個数をカウントアップ)
For k = 1 To ws2.Cells(Rows.Count, "A").End(xlUp).Row
Set r = ws2.Cells(k, 1)
v = r.Value
If dicA(v) < dicAmax(v) Then
r.Interior.Color = vbRed '色は適当に修正
dicA(v) = dicA(v) + 1
ElseIf dicB(v) < dicBmax(v) Then
r.Interior.Color = vbYellow '色は適当に修正
dicB(v) = dicB(v) + 1
End If
Next
End Sub
(γ) 2020/10/25(日) 12:26
コードありがとうございます。
入力してみましたが再生しても
何も起きなかったです。
シート1でBC列に手入力とか
シート2のABC列に反映させたい
とかの情報不足でしょうか?
(まつ) 2020/10/25(日) 16:19
(γ) 2020/10/25(日) 16:39
意味不明です。
B,C列に履歴を残す運用ではだめですか。
Option Explicit
Sub test()
Dim dic As Object
Dim r As Range, c As Range
Dim k As Long, i As Long
Dim 記号
Set dic = CreateObject("Scripting.Dictionary")
Set r = Worksheets("Sheet1").Cells(1).CurrentRegion
For Each c In Intersect(r.Columns(1), r.Offset(1))
記号 = c.Value
If Not dic.exists(記号) Then
Set dic(記号) = CreateObject("system.collections.queue")
End If
For i = 1 To c.Offset(, 1).Value
dic(記号).enqueue "A"
Next
For i = 1 To c.Offset(, 2).Value
dic(記号).enqueue "B"
Next
Next
Set r = Worksheets("Sheet2").Cells(1).CurrentRegion
For Each c In r.Columns(2).SpecialCells(xlCellTypeBlanks)
記号 = c.Offset(, -1).Value
If dic.exists(記号) Then
If dic(記号).Count > 0 Then
c.Value = dic(記号).dequeue
c.Offset(, 1).Value = Now
End If
End If
Next
End Sub
(マナ) 2020/10/25(日) 17:52
(マナ) 2020/10/25(日) 17:56
このコードももちろん確認済みのものです。
気安く「何も起きない」などと言われたくない。
あなたが内容をまったく理解していないからだと思う。
(γ) 2020/10/25(日) 22:48
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.