• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセル VBAで色塗りについて教えてください)

Excel VBAで色塗りについて教えてください

このQ&Aのポイント
  • VBA初心者の方がExcelで番号によって行に色を塗りたい場合、どのようなプログラムを書けば良いか教えてください。
  • 指定された範囲の行に、番号に応じた色を塗るためには、VBAの組み込み関数を使用することが必要です。
  • 番号と行の対応を設定し、その対応に基づいて色を塗るプログラムを作成することで、効率的に色塗りを行うことができます。

質問者が選んだベストアンサー

  • ベストアンサー
  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.4

NO2です。 文字列(仮にa~g)の対応例と入力ミスした場合はB列のDeleteでは行を確定できないのでC列に「x」を入力でリセットするようにしています。 Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("B2:B8")) Is Nothing Then For Each ap In Target Select Case ap Case "a": clr = 6: arow = 0 Case "b": clr = 5: arow = 1 Case "c": clr = 3: arow = 2 Case "d": clr = 4: arow = 3 Case "e": clr = 2: arow = 4 Case "f": clr = 1: arow = 5 Case "g": clr = 9: arow = 6 Case Else: Exit Sub End Select For i = 0 To Columns("BD").Column - 6 With Range("F11").Offset(arow, i).Interior If IsNull(.ColorIndex) Or .ColorIndex < 0 Then .ColorIndex = clr Exit For End If End With Next Next Else If Intersect(Target, Range("C2:C8")) Is Nothing Then Exit Sub For Each ap In Target If ap = "x" Then Select Case ap.Offset(0, -1) Case "a": arow = 0 Case "b": arow = 1 Case "c": arow = 2 Case "d": arow = 3 Case "e": arow = 4 Case "f": arow = 5 Case "g": arow = 6 End Select For i = Columns("BD").Column - 6 To 0 Step -1 With Range("F11").Offset(arow, i).Interior If .ColorIndex > 0 Then .ColorIndex = xlNone Application.EnableEvents = False ap.Offset(0, -1).Resize(, 2).ClearContents Application.EnableEvents = True Exit For End If End With Next End If Next End If End Sub

hirok_
質問者

お礼

今回も本当にありがとうございます。 文字列入力についてはバッチリ問題のないものでした。 すごいです。助かりました。 ただクリアになった時が"X”入力で、うまく作動せず…。 結果、文字列の入力回数をワークシートのCOUNTIF関数で計算し その数字分のセルだけ右に色塗りした方がいいのでは?と思い 3/15「VBA 右へ1セルずつ色塗りするには」で再質問させていただきました。 もしよろしければ、そちらでの回答をいただけますと (かなりずうずうしいですが)大変ありがたく思います。 頼りっぱなしで申し訳ありませんが、よろしくお願いします。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

No.1です。 >しかしやってみましたが、上手くいかず…。 とありますので・・・ 当方の説明不足だと思います。 もう一度画像をUPしてみます。 今回はダミーではなくB2~B8セルに入れるデータをE列に表示しておきます。 色サンプルは同じ行のB列セルを塗りつぶしておくとして。 Private Sub CommandButton1_Click() Dim i, j, k As Long Application.ScreenUpdating = False For i = 2 To 8 For k = 11 To 17 j = Cells(k, Columns.Count).End(xlToLeft).Column If Cells(i, 2) = Cells(k, 5) And j <= 55 Then With Cells(k, j + 1) .Value = Cells(k, 5) .Font.ColorIndex = Cells(k, 2).Interior.ColorIndex .Interior.ColorIndex = Cells(k, 2).Interior.ColorIndex End With End If Next k Next i Application.ScreenUpdating = True End Sub こんな感じではどうでしょうか? 今回もダメならごめんなさいね。m(_ _)m

hirok_
質問者

お礼

今回もありがとうございます。 ただコマンドボタン作成もよくわかっていない初心者のため 有効に使えず…申し訳ありません。 勉強不足です。ありがとうございました。

すると、全ての回答が全文表示されます。
  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.2

イベントプロシージャ例です。 対象シートタブ上で右クリック→コードの表示→サンプルコードを貼り付けてお試しください。 Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("B2:B8")) Is Nothing Then Exit Sub For Each ap In Target If ap <> "" Or ap > 0 And ap < 8 Then Select Case ap Case 1: clr = 6 Case 2: clr = 5 Case 3: clr = 3 Case 4: clr = 4 Case 5: clr = 2 Case 6: clr = 1 Case 7: clr = 9 End Select ap = ap - 1 For i = 0 To Columns("BD").Column - 6 With Range("F11").Offset(ap, i).Interior If IsNull(.ColorIndex) Or .ColorIndex < 0 Then .ColorIndex = clr Exit For End If End With Next End If Next End Sub

hirok_
質問者

補足

ありがとうございました。 貼り付けで上手く作動できました。 ただ2点、追加でおききしたいことがあります。 1 Case1~7の入力が数字ではなく文字になった場合、どうしたらよいでしょうか。 文字を別の列で数字におきかえようとしましたが、うまくできませんでした。 2 入力をクリアにした場合、色塗りもクリアにしたい場合は、どうしたらよいでしょうか。   今の状態ですと間違って入力した場合も、カウントされて色塗りになってしまうようです。 申し訳ありませんが、もう少しお力を貸してください。

すると、全ての回答が全文表示されます。
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんばんは! 一例です。 ↓の画像のようにコマンドボタンを配置し、 色サンプルとしてB11~B17セルを塗りつぶしています。 (「白」は判らないので、灰色にしてみました) ダミー(ストッパー)としてE11~E17セルにデータを入れています。 尚、色付とデータを入れるようにしています(塗りつぶしと同じフォント色)ので 最初からやる場合はデータをDeleteし(ダミーは残す)なおかつ色も消してください。 Private Sub CommandButton1_Click() Dim i, j, k As Long For i = 2 To 8 For k = 11 To 17 j = Cells(k, Columns.Count).End(xlToLeft).Column If Cells(k, j + 1) = "" And j <= 55 Then If Cells(k, 2) = Cells(i, 2) Then With Cells(k, Columns.Count).End(xlToLeft).Offset(, 1) .Value = 1 .Font.ColorIndex = Cells(k, 2).Interior.ColorIndex .Interior.ColorIndex = Cells(k, 2).Interior.ColorIndex End With End If End If Next k Next i End Sub こんな感じでどうでしょうか? 他に良い方法があればごめんなさいね。m(_ _)m

hirok_
質問者

お礼

ありがとうございました。 しかしやってみましたが、上手くいかず…。 でも勉強になりました。 ありがとうございます。

すると、全ての回答が全文表示されます。

関連するQ&A