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

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

エクセル VBAで色塗りについて教えてください

VBA初心者です。 例えばB列2行目から下に(1)~(7)までの番号を不規則に入力することにより F列11~17行目に1セルずつ右へ色塗りをしていくにはどうプログラムをかいたらよいでしょうか? 番号によって、色塗りの行と色は決まっています。 (1)→11行目、黄色 (2)→12行目、青色 (3)→13行目、赤色 (4)→14行目、緑色 (5)→15行目、白色 (6)→16行目、黒色 (7)→17行目、茶色 また色塗りはF列からBD列までで終了です。 番号の入力回数の多いものが色塗りを早く終了できることになります。 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

  • VBA 右へ1セルずつ色塗りするには 

    再質問です。 VBAでの色塗りに苦戦しています。 例えば、B列とD列にランダムに下記(1)~(7)の文字列が配列しています。 COUNTIF関数によって それぞれの文字列の数をカウントします。 (1)みかん  3 (2)サイダー 2 (3)いちご   6  (4)キウイ   8 (5)なし    1 (6)ぶどう   4 (7)チョコ   3 文字列の数によって、1セルずつ右に色塗りをしたいのです。 出発点、色は下記の通り、H列からBA列で色塗り終了です。 入力によって色塗りはどんどん右にのびていくことになりますが BA列に到達してからは、それ以上入力しても反映させません。 (1)みかん  →H列11行目、黄色 (2)サイダー →H列12行目、水色 (3)トマト   →H列13行目、赤色 (4)キウイ  →H列14行目、緑色 (5)なし   →H列15行目、白色 (6)ぶどう  →H列16行目、紫色 (7)チョコ  →H列17行目、茶色 以上、よろしくお願いします。

  • VBAで背景色

    以前にも同じような質問をしたのですが、応用できなかったので改めて質問させていただきます。申し訳ありません。 VBAを使って、入力された値によってセルの背景色を変更したいです。 C列からAF列までのセルに 「1」から始まる値が入力されたら背景を黄色 例:「1テスト」 「2」から始まる値が入力されたら背景を緑色 例:「2VBA」 「3」から始まる値が入力されたら背景を水色 例:「3教えて」 「4」から始まる値が入力されたら背景を赤  例:「4終了」 にするVBAが欲しいです。 例えば、C1に入力した「1テスト」という値を、D1~AF1にコピーすれば C1~AF1の背景が黄色になるようにしたいわけです。 かつ、B列にはその行で背景が黄色のセルの数を返せれば最高です。 どの部分が「C列からAF列」を指すのかをご説明いただけると大変ありがたいです。 よろしくお願いします。

  • エクセルで行内特定文字で色塗り、特定文字非表示。

    エクセルで行内特定文字で色塗り、特定文字非表示。 エクセル2000です。 B列30から10-50-01~20、11-51-01~30とかの連番番号、C列30から O列30までの行に各情報入力がしてあります。 行いたいのは、B列30以降に10-50-01~20と記入してあれば-01の行中の F、G、H、J、K、L、M、Oと、とびとびですが、文字表示をさせ、それ以外は (-02から-20まで)非表示(白色文字色)とし、かつ、K30以降のセル内に「OK」の文字が 入力されると、その行だけセルに色つけをしたいです。 書式でできますでしょうか? 現在、=RIGHT($B30,3)<>"-01"で-01を表示、それ以降は非表示させていましたが、K30以降のセル内に「OK」での行に色つけが必要になり、方法がわかりません。 よろしくお願いします。

  • エクセルVBAについて

    エクセルVBAについての質問です。A1、B1と順に入力していき、最終 F1列にカーソルがいったときに(F1を空欄のまま)エンターキーを押すと次の行のD2にカーソルが飛ぶ、そしてD2、E2に入力をして、G列にカーソルを動かしエンターキーで次の行のA列にカーソルが移動する、こんな操作をしたいのですが。つまりF列にカーソルがいったらカーソルは次の行のD列に飛び、G列にカーソルがいったら次の行の先頭つまりA列にカーソルが移動するように。VBA初心者でもつくれるかどうか、よろしくお願いします。

  • EXCEL(VBA)について質問です。

    EXCEL VBについてアドバイスお願い致します。 添付をご確認して頂きたいです。 内容といたしまして、F5~F100セルを文字の入力欄とします。 F5~F100に以下の文字が入ると条件付きで背景色を変えたいです。 赤: 背景(赤色) 白: 背景(白色) 桃: 背景(ピンク色) 黄: 背景(黄色) 橙: 背景(橙色) 紫: 背景(紫色) 緑: 背景(緑色) 上記の7条件にてセルの背景を自動で変更してくれるプログラムが知りたいです。 ご迷惑おかけしますがアドバイスお願い致します。

  • エクセル VBA

    既出でしたら、すみません。 方法を探して試行錯誤したうえで質問させていただきます。 添付の画像のように 1行目は見出しなので範囲外 2行目以降、A列をみて行を上に作り結合するといったものです。 どうにか、お力添えください。 宜しくお願いします。

  • Excel VBAで会員データをある条件で振り分けたい

    大変困っているので助けてください。 A列に「会員番号」、B列に「名前」、C列に「住所」・・・と言った感じのデータがあります。 Input BoxまたはUser Formを使って会員番号を入力し、該当したときにその隣(例えばD列)に「1」などの値を入力できる方法。 または、上記のデータと別のデータ(項目は同じ)を照合し一致しない物を別のシートに表示するという形でもいいです。 仕事で早急に必要なのですが、VBAの知識があまり無いのでいろいろ試行錯誤しましたができません。 お願いします。

  • エクセルVBAでの複数のオートシェイプの色塗り方法

    ネットから下記のコードを見つけたのですが、1つのシートに複数のオートシェイプの色塗りを変更する方法を教えてください。 例えばセル"A1"には数値の1と"A2"には数値2を入力したら、 オートシェイプAにはセル"A1"に対応した色塗り『赤色』を オートシェイプBにはセル"A2"に対応した色塗り『黄色』といった感じです。 下記のコードをいくつも繋げれば、複数のオートシェイプの色塗りが出来ると思ったのですが、コードを繋げる方法がわかりません。その他に何か良い方法がありましたら教えてください。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address(0, 0) <> "A1" Then Exit Sub With ActiveSheet.Shapes("ABC").Fill.ForeColor Select Case Target.Value Case Is = "赤" .SchemeColor = 2 Case Is = "黄" .SchemeColor = 5 Case Is = "緑" .SchemeColor = 3 Case Is = "青" .SchemeColor = 4 Case Else .SchemeColor = 1 End Select End With End Sub

  • エクセルVBA 複合 条件付き書式の方法

    いつもお世話になっております。 エクセルで条件付き書式を設定したいのですが、複数の条件で、複雑な条件なので、 通常の条件付き書式ではできないと判断しましたので、質問をさせて頂きます。 私自身、VBAを読み取れるほどの知識は御座いません… どなたか少しの解説とヒントなどを頂けませんでしょうか? よろしくお願いいたします((+_+)) 添付の画像のように D列に「個数」、H列に「完了個数」、I列に「キャンセル個数」(すべて数値、表示はユーザー定義で"個"を追加しているだけです) B列やFG列などに手動または条件付き書式で色がついております。 条件: 2行目 D列には個数が入力され、H列には個数がなければ「塗りなし」 3行目 D列に入力された個数とI列に入力された値が違う時、「塗りなし」 4、6行目 D列に入力されている個数とI列の値が同じであれば「薄い黄色」になる 5行目 D列に入力された個数とI列に入力された値が同じであれば「グレー」になる 尚且つ、B列やF4G4など、手動で色を付けてあるセルは、その色を残す このような条件で設定したいのですが、VBA記述はどのようにしたらよいのでしょうか? 類似の質問回答を沢山見ましたが、初心者なので応用が利きません… 条件が複雑なので、こんなことできるのだろうかと不安です… どなたかヒントだけでも教えていただけないでしょうか? 何卒、よろしくお願い申し上げますm(__)m

  • エクセル2003 VBAで セル内を 一発呼び出し

    エクセル2003 オートフィルタではなく VBAで セル内を 一発呼び出ししたいので。  よろしく お願いします。 表 列A~E(結合2行) :商品名と内容   列H~K(結合2行) 住所氏名電話番号を記載してます。 1年分を オートフィルターで  氏名 や 商品名で 探すのは 結構 時間がかかります。 同じものが ほぼ少ないため。。。 そこで  たまに 同じ氏名  同じような 品を 検索する セルを 2個ほど作って  そこへ セル1へ 商品名を入力すると  該当する 行のみ 表示される。 セル2に 名前をを入力すると  該当する 行のみ 表示される。 また、セルを赤色に塗った部分の結合行(2~3行)を 赤色に塗りつぶした行のみ 表示も できれば うれしいです。 コマンドボタン等を使ってもいいので お願いします。 そんな VBAを 作っていただけませんでしょうか^^; お手数おかけしますが どなたか よろしく お願いします。 

専門家に質問してみよう