質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

5029閲覧

VBA 最大値と最小値のセルに色を付けたい

kuraris

総合スコア10

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2021/07/01 08:51

前提・実現したいこと

VBAのマクロを使用して、表の範囲の中の最大値と最小値のセルに色を付けたいと考えています。
この表は、HLOOKUP関数で別シートからデータを取ってきていると仮定。
||1月|2月|3月|4月|5月|6月|7月|8月|9月|10月|11月|12月|
|:--|:--:|--:|
|2019|542|543|532|516|491|491|529|498|504|496|493|495|
|2020|490|487|427|351|264|339|402|377|391|402|431|351|
|2021|306|298|331|323|346|310|

マクロを実行すると、最大値(例の場合は2019年の2月)と最小値(例の2021年1月)のセルに色が付くというものです。

発生している問題・エラーメッセージ

最大値のセルに色を付けることは出来たのですが、最小値だと空白のセル(この場合2021年7月~12月)に色が塗られてしまう状態です。

該当のソースコード

Sub paintMaxAndMin() Dim ansmax As Variant Dim ansmin As Variant Dim tRange As Range Dim actRow As Long Dim actCol As Long actRow = ActiveCell.Row actCol = ActiveCell.Column Set tRange = Range(Cells(actRow, actCol), Cells(actRow, actCol).Offset(2, 11)) tRange.Interior.ColorIndex = xlColorIndexNone '値を検索 ansmax = Application.WorksheetFunction.Max(tRange) ansmin = Application.WorksheetFunction.Min(tRange) 'ここで値が0で返ってきてしまう Dim iRow As Integer Dim iCol As Integer Dim tmp As Variant 'ループを回して、最大値と最小値を持つセルを検索。該当のセルに背景色を塗る。 For iRow = 0 To 2 For iCol = 0 To 11 tmp = Cells(actRow + iRow, actCol + iCol).Value If tmp = ansmax Then Cells(actRow + iRow, actCol + iCol).Interior.ColorIndex = 38 End If        If tmp = ansmin Then Cells(actRow + iRow, actCol + iCol).Interior.ColorIndex = 3 End If Next Next End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

neconekocat

2021/07/01 09:21

WorksheetFunction.Minは空欄は対象外とするはずです。 本当は空欄ではなく何らかの値が入っていませんか?
kuraris

2021/07/01 09:36

空欄セルにはHLOOKUPの関数が入っています。 =HLOOKUP(検索値,'シート名'!範囲, 行番号,FALSE)
neconekocat

2021/07/01 10:26

HLOOKUPは見つからない場合は#N/Aを、見つかったときの対象セルが空欄だと0を返すはずです。 Y.H.さんの回答の通り、実際には0が入っていませんか?
kuraris

2021/07/02 05:19

セルの書式設定で0が表示されないように設定されていました。 こちらの確認不足でした。
guest

回答2

0

ベストアンサー

HLOOKUPでもVLOOKUPでも空白取得時の値は0になるようなので
それを回避すれば問題は解消するのではないでしょうか。

で、その方法が記載されていたHPがあったのでリンクします。
ExcelのVLOOKUP関数でエラーや0を返さず空白で返す方法

=HLOOKUP("A",M1:O2,2,FALSE) & ""

既にわかっている内容だったらすみません。

あと色を付ける方法ですが
条件付き書式で、上位1に色を付ける。下位1に色を付ける。でいいのでないでしょうか。

投稿2021/07/01 22:08

編集2021/07/01 22:38
xail2222

総合スコア1508

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kuraris

2021/07/02 05:31

この年度の表は約30個近くあり、前任者もひとつひとつの条件付き書式の設定が面倒でマクロを組んだのだと思います。(しかも出来ていないまま引き継ぐことに…)後出しの条件になってしまってすみません。 皆さんの回答を伺って、さらには後々のことを考えると、条件付き書式を使用した方が良いと感じたので、時間はかかりますが、ひとつひとつ設定していこうと思います。 ありがとうございました!
guest

0

なんらかの設定(例えばセルの書式設定が「カスタム」で「#」とか指定)で、値が0の場合は表示しないようになってませんか?

0を書式設定などで見た目上非表示にしている場合は、MINIFSなどで0を無視して最小値を取得するしかないです。

VBA

1'ansmin = Application.WorksheetFunction.Min(tRange) 'ここで値が0で返ってきてしまう 2ansmin = Application.WorksheetFunction.MINIFS(tRange,tRange,">0")

投稿2021/07/01 10:08

編集2021/07/01 10:09
Y.H.

総合スコア7918

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kuraris

2021/07/02 05:33

セルの書式設定で0が表示されないように設定されていました。 表の見た目上、変更することは出来そうにないため、こちらのコードで試してみたいと思います。 後々のことを考えると条件付き書式を設定した方が良いという結論に至りましたが、マクロはマクロで完成させたいと思いますので、参考にさせて頂きます。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問