Excel (VBA) |
![]() ![]() |
(指定なし : 指定なし)
赤色のセルの文字列を格納してそのセルがあるシートの文字列を赤くしたい
投稿日時: 23/08/30 22:41:32
投稿者: yama1006
|
---|---|
やりたいこと
|
![]() |
投稿日時: 23/08/31 09:12:47
投稿者: 半平太
|
---|---|
配列にこだわりがあるような印象を受けますが、
'一例: Dim dicT As Object, WsPR As Worksheet, ws As Worksheet, rng As Range Set dicT = CreateObject("Scripting.Dictionary") Set WsPR = Worksheets("給与") With Intersect(WsPR.Rows(1), WsPR.UsedRange) For r = 2 To .Columns.Count If .Cells(1, r).Interior.Color = vbRed Then '給与のタイトルが赤なら dicT(.Cells(1, r).Value) = Empty '赤の項目名を登録 End If Next End With For Each ws In ThisWorkbook.Worksheets If ws.Name <> "給与" Then Set rng = Intersect(ws.Rows(1), ws.UsedRange) rng.Offset(, 1).Interior.Color = xlNone '事前無色化 For c = 2 To rng.Columns.Count If dicT.exists(rng(1, c).Value) Then '給与の赤見出しと各シート見出しが一致 If rng4 Is Nothing Then Set rng4 = rng(1, c) Else Set rng4 = Union(rng4, rng(1, c)) End If End If Next c rng4.Interior.Color = vbRed Set rng4 = Nothing End If Next ws |
![]() |
投稿日時: 23/08/31 10:01:48
投稿者: Suzu
|
---|---|
提示されたコードは、
引用: から、察すると 以下の様な感じかしら。 Sub Sample() Dim wst As Worksheet Dim rng As Range Dim rngs As Range Dim i As Long Dim Ary As Variant 'ワークシート給与 ' 1行目中 背景 赤 セルの値を 配列 ary に代入 With Application.FindFormat .Clear .Interior.Color = vbRed End With With Worksheets("給与").Rows(1) Set rng = .Find(what:="", SearchFormat:=True) If Not rng Is Nothing Then i = rng.Column Do If IsArray(Ary) Then ReDim Preserve Ary(UBound(Ary) + 1) Ary(UBound(Ary)) = rng.Value Else ReDim Ary(0) Ary(0) = rng.Value End If Set rng = .Find(what:="", after:=rng, SearchFormat:=True) Loop While rng.Column <> i End If End With Application.FindFormat.Clear 'ワークシート 給与 以外 ' 1行目中 セル値が、ary の値と合致したセル を ' rngs に代入し、背景色を赤に設定 For Each wst In ThisWorkbook.Worksheets If wst.Name <> "給与" Then Set rngs = Nothing For i = LBound(Ary) To UBound(Ary) Set rng = wst.Rows(1).Find(what:=Ary(i)) If Not rng Is Nothing Then If rngs Is Nothing Then Set rngs = rng Else Set rngs = Application.Union(rngs, rng) End If Set rng = wst.Rows(1).FindNext(after:=rng) End If Next i End If If Not rngs Is Nothing Then rngs.Interior.Color = vbRed End If Next wst End Sub 書いている間に、半平太さんから回答がありましたが 書いちゃってので載せておきます。 考え方としては同じですが、 半平太さん 1行目のセルに対し色を総当たりで判定、値に対し、dicionary の Existsで判定 当方 Findを使って赤色と、セル値を検索 列の総数と、色がついているセル数 に依っては 処理速度が変わるでしょうけど、 大概は、半平太さんの方が有利そうですね。 |
![]() |
投稿日時: 23/09/01 07:35:53
投稿者: yama1006
|
---|---|
|
![]() |
投稿日時: 23/09/01 10:11:35
投稿者: 半平太
|
---|---|
見込み と 手抜きで書いてしまいました。
For Each ws In ThisWorkbook.Worksheets If ws.Name <> "給与" Then Set rng = Intersect(ws.Rows(1), ws.Range("A1:B1", ws.UsedRange.Address)) rng.Offset(, 1).Resize(1, rng.Columns.Count - 1).Interior.Color = xlNone '無色化 For c = 2 To rng.Columns.Count If dicT.exists(rng(1, c).Value) Then '給与の赤見出しと各シートの見出しが一致 If rng4 Is Nothing Then Set rng4 = rng(1, c) Else Set rng4 = Union(rng4, rng(1, c)) End If End If Next c If Not rng4 Is Nothing Then rng4.Interior.Color = vbRed Set rng4 = Nothing End If End If Next ws |
![]() |
投稿日時: 23/09/04 07:23:02
投稿者: yama1006
|
---|---|
rng.Offset(, 1).Resize(1, rng.Columns.Count - 1).Interior.Color = xlNone '無色化
|
![]() |
投稿日時: 23/09/04 08:59:51
投稿者: 半平太
|
---|---|
>wsのシートの中には見出しも入っていないシートもあります。
|
![]() |
投稿日時: 23/09/04 22:52:52
投稿者: yama1006
|
---|---|
[quote="半平太"]>wsのシートの中には見出しも入っていないシートもあります。
|
![]() |
投稿日時: 23/09/05 11:57:46
投稿者: 半平太
|
---|---|
>”a1:b1"とwsの使われているrangeを格納しているという認識で合っておりますか。
|
![]() |
投稿日時: 23/09/05 14:20:43
投稿者: simple
|
---|---|
引用: Application.Intersect メソッドを正確に理解されていますか? ・ws.Rows(1) ・ws.Range("A1:B1", ws.UsedRange.Address) この二つのセル範囲の共通部分を返してくれるのです。 >初めて知りました。 前のスレッドで、 Intersect(Rows(1), rng.EntireColumn).Interior.Color = vbRed というコードがありましたが、その理解は大丈夫だったのでしょうか? 複数のセル範囲が返ってきますけど? # 回答があったら、きちんと返事をする(試行して結果の成否等を返事する)のが # 礼儀だと思いますが、いかがですか? # Suzuさんも時間を割いて、ボランティアであなたに回答されています。 |
![]() |
投稿日時: 23/09/09 16:46:45
投稿者: yama1006
|
---|---|
お返事が遅くなってしまい申し訳ございません。
|
![]() |
投稿日時: 23/09/09 16:48:53
投稿者: yama1006
|
---|---|
お忙しい中、ご説明いただきありがとうございます。
|
![]() |
投稿日時: 23/09/09 16:55:09
投稿者: yama1006
|
---|---|
# 回答があったら、きちんと返事をする(試行して結果の成否等を返事する)のが
|