• ベストアンサー

エクセルVBAについて

最近、いろいろな質問をしています。今度はエクセルVBA(Excel2003)に関する質問です。 最近、在庫管理を任せられるようになり在庫管理表をエクセルで作成しています。わが社に何日に荷物が入荷し、何日に取引先に納入した、などの表です。その中で、すでに条件付書式が3つ作成済みなのですが、新たに1つ追加する必要が出てきました。 J:弊社納期予定日 K:客先納入日 L:客先納品・・・Kに日付が入ると、「済み」と表示される M:弊社コメント用 O:弊社入庫数 P:弊社納入日 Q:弊社独自の設定 R:弊社独自の設定 S:Jの日付より遅れた場合、「遅延」と表示 条件付書式は、 条件1=AND((TODAY()+3)>$K***,ISBLANK($P***)) →Kが客先納入日で、Pが弊社納品日、遅れたらセルの色を黄にしてフォントを赤にする設定 条件2=AND(MOD(ROW(),2)=0,NOT(AND((TODAY()-5)>$K***,ISBLANK($P***)))) →1行おきにセルの色を緑にする、もしくはPの弊社納入日が遅れていない場合。フォントはデフォルトの黒 条件3=AND(MOD(ROW(),2)=0,NOT(ISBLANK($P***))) →1行おきにセルの色を白にする、もしくはPの弊社納入日が遅れていない場合。フォントは茶。 これに、今回追記事項として、 T列に、弊社からの請求書が「未発行」となった場合、セルの色がライトブルー、フォントが青になるよう設定します。 自分なりに、マクロを組んで、 Private Sub Worksheet_Change(ByVal ActiveCells As Excel.Range) Select Case ActiveCells '内容を比較 Case "未発行" r = ActiveCells.Row Rows(r).Interior.ColorIndex = 20 '塗りつぶしをライトブルー ActiveCells.Font.ColorIndex = 5 '文字色を青 Case "発行済み" r = ActiveCells.Row Rows(r).Interior.ColorIndex = xlNone ActiveCells.Font.ColorIndex = 1 Case "未請求" r = ActiveCells.Row Rows(r).Interior.ColorIndex = xlNone ActiveCells.Font.ColorIndex = 1 Case "" r = ActiveCells.Row Rows(r).Interior.ColorIndex = xlNone Case Else End Select End Sub としました。 そうすると、条件3に合致する行は、上記のマクロが実行されるのですが、条件1,2のときは、上記マクロが実行されません。 条件付き書式とマクロの併用は不可能でしょうか? それとも条件が4つ以上ある場合は、マクロで組むべきなのでしょうか? 希望としては、条件付書式を活かしつつ、マクロも実行させたい。 無理であれば、全部マクロで組みなおしたい。 もし、何か良い方法をご存知の方がいらっしゃいましたら、是非ご教授の程宜しくお願い致します。

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

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.2

こんにちは。 >条件2=AND(MOD(ROW(),2)=0,NOT(AND((TODAY()-5)>$K***,ISBLANK($P***)))) >→1行おきにセルの色を緑にする、もしくはPの弊社納入日が遅れていない場合。フォントはデフォルトの黒 この条件を少し整理すると、 AND(TRUE,NOT(FALSE))が 真 です。 NOT(FALSE)の中味は、(AND(TRUE,TRUE))以外はFALSE、 つまり、ISBLANK($P***)がFALSE(P列がブランクでない)の時は NOT(FALSE) を満たします。 なので、偶数行かつP列がブランクでない場合は 真 です。 ...という事は >条件3=AND(MOD(ROW(),2)=0,NOT(ISBLANK($P***))) この条件3は条件2に内包されています。 上の方の条件が優先されるので、条件3の書式は設定されません。 書込み例はあくまで例示であり、実際の条件は違うという事であればハズしてますが 条件を整理する事で、条件付き書式の3条件内で設定できるのであれば、 それにこした事はないと思います。 条件が4つ以上の場合、例えば設定するセル範囲を行全体ではなく、特定の列だけ変更するなど、 範囲ごとに条件を設定して妥協する事も考えられます。 >希望としては、条件付書式を活かしつつ、マクロも実行させたい。 という事に対しては、nda23 さんが既に書いてらっしゃいますが、 通常の[セルの書式設定]より[条件付き書式]が優先されますので、 設定したい条件が4つある場合は、条件の優先順位1~3を[条件付き書式]で設定し、 優先順位4番目をマクロで設定すると可能だと思います。

blade5235
質問者

お礼

end-uさん こんにちわ。詳細なご回答、ありがとうございます。この回答を参考にし、条件3を削除してマクロも消して、条件付き書式に追加した結果、自分の思うとおりの結果となり、大成功でした!!! end-uさんの詳細なご回答が無ければ、1ヶ月は悩んでいたと思います・・・。 本当にありがとうございました!!!

その他の回答 (1)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

マクロは実行されているのではありませんか? T列を変更し、それが"未発行"の場合だけ、目立った変化になりますが、それ以外の場合、見た目の変化はほとんど無いと思われます。 尚、実験してみましたが、マクロで色を変えても、条件付書式の方が有効になるようです。

関連するQ&A

  • VBA セルの色を変更する

    VBA(エクセル2007使用)で、セルの背景色を変更する場合についての質問です。 マクロを実行する度に、セルの背景色を変更するマクロを作成しました。 オレンジ→水色→緑→灰色→無色  という風に変わっていくところまでは できたのですが、これだとマクロを実行するのにセルの状態が無色か、指定した カラーコードで塗りつぶされていないと実行できません。 下記、コードの一番最初の Case で ”背景色がどんな色の場合でも”という条件に したいのですが、どのように記載したらわからずにいます。。。 ---------------------------- Sub 色チェンジ() n0 = ActiveCell.Interior.ColorIndex Select Case n0 Case xlNone   ’ここを”どんな色の場合でも、、、という条件にしたいです。。” Selection.Interior.ColorIndex = 40 Case 40 Selection.Interior.ColorIndex = 34 Case 34 Selection.Interior.ColorIndex = 35 Case 35 Selection.Interior.ColorIndex = 15 Case 15 Selection.Interior.ColorIndex = xlNone End Select End Sub -----------------------------------

  • VBAでのセルの複数選択時の処理について

    現在EXCEL VBAである行の値が変わったときにその列の塗りつぶしの 色を変えるといった処理を作成しております。 そこで、複数選択して値を変えた場合の処理が変数の型が一致しません 的なエラーが表示されてしまいます。 どのように修正したらうまくいくでしょうか? 教えてください。 ソースは下記の通りとなります。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column <> 13 Then Exit Sub Application.EnableEvents = False MsgBox (Target.Rows.Count) Dim rngSelectRng As Range For Each rngSelectRng In Target If rngSelectRng.Value = "" Then rngSelectRng.Value = " " 'ステータス欄の入力の判断 'Select Case Target.Rows.Value MsgBox (Target.Row) Select Case rngSelectRng.Value Case "あああ" Worksheets("表1").Rows(Target.Row).Interior.ColorIndex = 24 Case "いいい" Worksheets("表1").Rows(Target.Row).Interior.ColorIndex = 35 Case "ううう" Worksheets("表1").Rows(Target.Row).Interior.ColorIndex = 38 Case "えええ" Worksheets("表1").Rows(Target.Row).Interior.ColorIndex = 36 Case "おおお" Worksheets("表1").Rows(Target.Row).Interior.ColorIndex = 16 Case Else Worksheets("表1").Rows(Target.Row).Interior.ColorIndex = 2 End Select Next Application.EnableEvents = True End Sub

  • Excelで選択しているセルの行を色づけしたい

    以前、このサイトでVBAを以下のように設定したのですが、 一度、ファイルを閉じてしまうと、無効になってしまいます。どうすれば、いいのでしょうか? Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) ActiveSheet.Rows.Interior.ColorIndex = xlNone Rows(Target.Row).Interior.ColorIndex = 15 End Sub

  • EXCELで4色の色をつけるVBA(既存)を最後のシートまで実行するには?

    エクセルのVBAで質問です。 現在、下記のVBAにて、エクセルに4色の色をつけています。 内容 ・処理範囲内(D5:AI50)の列の値が、 ・指定した行(4行目)の値から見て、 ・+5、+10、-5、-10の場合、それぞれ指定した色をつけています ・ただしC列の値が30未満の行は色付けなし 現状では、このマクロはアクティブシートのみで使えるため、 100シートあれば、それぞれのシートにおいて そのつどマクロを実行しています。 これを、一度の実行で最終シートまで実行できるようにしたいのです。 VBA初心者のため、見よう見まねでループを試してみたものの、 どうもうまく動きませんでした。 なにとぞご教授のほど、お願いいます。 ●以下、現在使用しているVBA Sub 条件付4色の標本数1() Dim 処理範囲 As Range Dim 先頭の行番号 As Long Dim 全体の行数 As Long Dim 各セル As Range Dim 差分 As Single Dim 標本数 As Single Set 処理範囲 = Range("D5:AI50") For Each 各セル In 処理範囲 標本数 = Cells(各セル.Row, "C").Value If 標本数 >= 30 Then 差分 = 各セル.Value - Cells(4, 各セル.Column).Value    Select Case 差分 Case Is <= -10 各セル.Interior.ColorIndex = 37 'ペールブルー 各セル.Font.ColorIndex = 1 Case Is <= -5 各セル.Interior.ColorIndex = 34 '薄い水色 各セル.Font.ColorIndex = 1 Case Is >= 10 各セル.Interior.ColorIndex = 6 '黄37 各セル.Font.ColorIndex = 1 Case Is >= 5 各セル.Interior.ColorIndex = 19 '薄い黄 各セル.Font.ColorIndex = 1 Case Else 各セル.Interior.ColorIndex = xlNone '無色 End Select End If Next End Sub

  • Excel VBA Interior.Color

    困っています。よろしくお願いします。 以下のマクロで、 値として「薄緑」(13172680)を入力したのに、その値が勝手に変わってしまいます。 13434828になってってしまいます。そのため、「色消し」が働きません。 また、colorとして「白」(16777215)を設定した場合と、colorindexとしてxlnoneを入力した場合、excelの表上での見た目が違います。なぜでしょうか。また、colorに何を入力するとcolorindexにxlnoneを入力したのと同じになるのでしょうか。 Option Explicit Public Const 薄緑 As Long = 13172680 '200,255,200 Public Const 白 As Long = 16777215 'rgb(255,255,255) Sub 色付け()  Cells(1, 1).Interior.Color = 薄緑 End Sub Sub 色消し()    If Cells(1, 1).Interior.Color = 薄緑 Then    Cells(1, 1).Interior.Color = 白    End If End Sub Sub test()    Cells(1, 1).Interior.ColorIndex = xlNone End Sub Sub test1()    Cells(1, 1).Interior.Color = 白 End Sub Sub test2()    MsgBox Cells(1, 1).Interior.Color End Sub

  • エクセルVBAについて

    エクセルVBAについて 下記のようなマクロで、選択したセルの、列の背景色の切り替えを行いたいと思っています。 が、写真のように、塗りつぶしを行いたいセルが結合しているところと、 そうでないところがあり、列全体に、うまく塗りつぶしができません。 '列の背景色を変更 Cells.Interior.ColorIndex = xlNone Dim i As Long i = Target.Column Columns(i).Interior.ColorIndex = 6   Columns(i + 1).Interior.ColorIndex = 6 また、選択するセルは、2行目で、2列が結合しています。 うまく、2列が結合しているセルにも、塗りつぶしを適用することは可能でしょうか? また、できれば列全体の塗りつぶしでなく、行の範囲も指定できればと思っています。 写真では、2列が結合していない部分のみ、塗りつぶしが適用されています。 表の構成上、結合しているセルとそうでないセルの変更ができないため、困っています。 どうぞ、よろしくお願いいたします。

  • エクセルVBA 前回のご回答で質問です

    http://oshiete1.goo.ne.jp/qa3764996.html 前回上の質問をさせていただき、お二方から大変よいご回答をいただきました。 これを勉強したいと思い、読み取ろうとしたのですが、理解できないところがあり、日本語にすればどのようになるのかお教えいただきたいと思い、質問にまた参りました。分からないところは、下の全コード中の、 r.Offset(0, -1).Resize(1, 2).Interior.ColorIndex = trg.Interior.ColorIndex '    r.Offset(0, -1).Resize(1, 2).Font.ColorIndex = trg.Font.ColorIndex の部分です。OffsetとResizeでの行、列の方向性が理解できないのです。よろしければコメントを着けていただければ助かります。 よろしくお願いします。 Sub Macro1() Dim r, trg As Range  For Each r In Range("B4:AD27")   If r.Value <> "" Then    Set trg = Range("B1:O1").Find(what:=r.Value, LookIn:=xlValues, lookat:=xlWhole)    If Not trg Is Nothing Then     r.Offset(0, -1).Resize(1, 2).Interior.ColorIndex = trg.Interior.ColorIndex '    r.Offset(0, -1).Resize(1, 2).Font.ColorIndex = trg.Font.ColorIndex    End If   End If  Next r End Sub

  • イベントマクロについて

    イベントマクロについて質問ですが まず、下記をご覧下さい。 過去にここで回答いただいたものを流用させてもらったものですが もうひとつ機能を追加したいと思います。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column >= 4 And Target.Column <= 34 Then If Target.Row >= 2 And Target.Row <= 100 Then Select Case Target Case "(5)GC" Target.Interior.ColorIndex = 34 Target.Font.ColorIndex = 0 Case "6OS", "6FC" Target.Interior.ColorIndex = 6 Target.Font.ColorIndex = 0 Case "(6)TA", "(6)C" Target.Interior.ColorIndex = 46 Target.Font.ColorIndex = 0 Case "6@BD", "6@C" Target.Interior.ColorIndex = 38 Target.Font.ColorIndex = 0 End Select End If End If End Sub 追加する機能とは、上記で指定した範囲以外のセルを参照して 色を付けるかどうかを区別するものです。 例えば、A2の値が色付けに該当する場合はD2からAH2の中で上記マクロに該当するセルに色を付け、もしA2が該当しない場合は色付けをしない というような感じです。 よろしくお願いします。

  • VBAで教えてください。

    以前ここで教えていただいたVBAで http://jisaku.155cm.com/src/1371930716_9b9006528605642980beed48a8998013b0731e4b.jpg のようにA列のテスト4をクリックしたときにC列のテスト4が一発で解るようにしたいです。 もちろん、テスト11をクリックしたときは、テスト4塗りつぶしは解除され、 テスト11が塗りつぶされるようにしたいです。 写真は塗りつぶししていますが、解るようにしたいだけなので、塗りつぶしにはこだわっていません。 あと、E、F、G列は解りやすく並べているだけで、実際はA、B、C列だけです。 それと、C列は関数を使って表示してあります。 という質問で Private Sub Worksheet_SelectionChange(ByVal Target As Range) 'この行から Dim i As Long Range("C:C").Interior.ColorIndex = xlNone If Application.Intersect(Target, Range("A:A")) Is Nothing Or Target.Count <> 1 Then Exit Sub On Error Resume Next Application.ScreenUpdating = False ActiveSheet.Cells.interio.ColorIndex = xlNone For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, "C") = Target Then Cells(i, "C").Interior.ColorIndex = 3 End If Next i Application.ScreenUpdating = True End Sub 'この行まで をシートのコードに張り付ければいいですよ。と教えてくれたものがあるのですが、 A列でクリックした文字をC列からすべて見つけて反転してくれないようです。何個か反転してくれない ものが出てきてしまいました。 C列が何百行とかなってしまうと、すべての同じ文字を検索してくれないのでしょうか? ちなみに列がここに掲載しているものと違うので Private Sub Worksheet_SelectionChange(ByVal Target As Range) 'この行から Dim i As Long Range("R:R").Interior.ColorIndex = xlNone If Application.Intersect(Target, Range("B:B")) Is Nothing Or Target.Count <> 1 Then Exit Sub On Error Resume Next Application.ScreenUpdating = False ActiveSheet.Cells.interio.ColorIndex = xlNone For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, "R") = Target Then Cells(i, "R").Interior.ColorIndex = 3 End If Next i Application.ScreenUpdating = True End Sub 'この行まで のCをRにAをBに変更して使ってます。 これがいけないのかな? よろしくお願いします。

  • マクロでの条件付書式について

    私は、下記のようなO列の値を変更するとそれに伴ってセルの色が変化するマクロを作成しました。 下記の通りで、色は変わるのですが、 (1)セルO8をコピー (2)セルO9:O10を範囲選択 (3)貼り付け とすると 「型が一致しません」 というエラーがでてしまいます。 いろいろと調べたのですが、原因が分かりませんでした。 マクロに関しては、初心者で初歩的な事かも知れないのですがご教授お願いいたします。 Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("O8:O5000")) Is Nothing Then Exit Sub Select Case Target.Value Case Is = "連絡待ち" Target.Interior.ColorIndex = xlNone Case Is = "取引連絡中" Target.Interior.ColorIndex = 23 Case Is = "取置き" Target.Interior.ColorIndex = 3 Case Is = "入金連絡あり" Target.Interior.ColorIndex = 4 Case Is = "発送準備中" Target.Interior.ColorIndex = 7 Case Is = "発送待ち" Target.Interior.ColorIndex = 17 Case Is = "発送済み" Target.Interior.ColorIndex = 16 Case Else Target.Interior.ColorIndex = xlNone End Select End Sub

専門家に質問してみよう