エクセルVBAに関する質問です.

「表があったとして,
その各列ごとに
各列の平均以上のものに,色(例えば灰色)をセルに塗る.」
というのはどのようにかくのでしょうか?
できれば,どんな列数,行数が来ても
良いようにしたいです.
(行列は左上につめて入力してあります)

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2007/05/03 10:32:29
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:taknt No.4

回答回数13539ベストアンサー獲得回数1198

ポイント90pt

あ、先の回答は 行単位でした。

列単位に変更しました。

A列の中で 平均を出し、対象となるセルは 水色で ならなかったら

塗りつぶしなしにしています。

選択した範囲で 実行するように修正しました。



Sub Macro1()
'
' Macro1 Macro
'

a1 = Selection.Row              '開始行
a2 = a1 + Selection.Rows.Count - 1   '終了行
a3 = Selection.Column           '開始列
a4 = a3 + Selection.Columns.Count - 1 '終了列

   
For a = a3 To a4
    aa = 0
    ab = 0
    For b = a1 To a2
        If Cells(b, a) > 0 Then
            aa = aa + Cells(b, a)
            ab = ab + 1
        End If
    Next b
    
    c = 0
    If ab > 0 Then
        c = aa / ab
    End If
    For b = a1 To a2
        If Cells(b, a) > c Then
            With Cells(b, a).Interior
                .ColorIndex = 34
                .Pattern = xlSolid
            End With
        Else
            Cells(b, a).Interior.ColorIndex = xlNone
        End If
    Next b
Next a
    
End Sub
id:gauchon

すばらしいです.ありがとうございます.

2007/05/03 10:30:27

その他の回答4件)

id:SALINGER No.1

回答回数3454ベストアンサー獲得回数969

条件付書式を使います。

A列全体を選択して

セルの値が 次の値より大きい =AVERAGE(A:A)

として書式で灰色にします。

次にB列以降にA列をコピーします。

id:SALINGER No.2

回答回数3454ベストアンサー獲得回数969

ポイント5pt

間違いです。

シート全体を選択して

上の条件付書式を設定するだけでした。

id:gauchon

ありがとうございます.

でも,マクロを使いたいのです..

2007/05/02 17:42:40
id:taknt No.3

回答回数13539ベストアンサー獲得回数1198


Sub Macro1()
'
' Macro1 Macro
'
   
a1 = 1  '開始行
a2 = 5  '終了行
a3 = 1  '開始列
a4 = 10 '終了列
    
For a = a1 To a2
    aa = 0
    ab = 0
    For b = a3 To a4
        If Cells(a, b) > 0 Then
            aa = aa + Cells(a, b)
            ab = ab + 1
        End If
    Next b
    
    If ab > 0 Then
        c = aa / ab
        For b = a3 To a4
            If Cells(a, b) > c Then
                With Cells(a, b).Interior
                    .ColorIndex = 34
                    .Pattern = xlSolid
                End With
            Else
                Cells(a, b).Interior.ColorIndex = xlNone
            End If
        Next b
    End If
Next a
    
End Sub

表のサイズは

a1 = 1 '開始行

a2 = 5 '終了行

a3 = 1 '開始列

a4 = 10 '終了列

を変更してください。

id:gauchon

ありがとうございます.

表のサイズの部分を,

変更せずとも認識できるようにしたいのですが,

可能でしょうか?

2007/05/02 18:06:06
id:taknt No.4

回答回数13539ベストアンサー獲得回数1198ここでベストアンサー

ポイント90pt

あ、先の回答は 行単位でした。

列単位に変更しました。

A列の中で 平均を出し、対象となるセルは 水色で ならなかったら

塗りつぶしなしにしています。

選択した範囲で 実行するように修正しました。



Sub Macro1()
'
' Macro1 Macro
'

a1 = Selection.Row              '開始行
a2 = a1 + Selection.Rows.Count - 1   '終了行
a3 = Selection.Column           '開始列
a4 = a3 + Selection.Columns.Count - 1 '終了列

   
For a = a3 To a4
    aa = 0
    ab = 0
    For b = a1 To a2
        If Cells(b, a) > 0 Then
            aa = aa + Cells(b, a)
            ab = ab + 1
        End If
    Next b
    
    c = 0
    If ab > 0 Then
        c = aa / ab
    End If
    For b = a1 To a2
        If Cells(b, a) > c Then
            With Cells(b, a).Interior
                .ColorIndex = 34
                .Pattern = xlSolid
            End With
        Else
            Cells(b, a).Interior.ColorIndex = xlNone
        End If
    Next b
Next a
    
End Sub
id:gauchon

すばらしいです.ありがとうございます.

2007/05/03 10:30:27
id:junkman2 No.5

回答回数1ベストアンサー獲得回数0

ポイント5pt

VBAを使用するよりエクセルの機能を活用してはどうでしょうか?

VBAとエクセル標準機能はお互いの良い部分を共存させるのが良いかと。

id:gauchon

そうですね,ありがとうございます.

どんな列数,行数が来ても使えるようにすると汎用性が高いだと思ったので^^;

2007/05/03 10:30:13
  • id:SALINGER
    1行目にVBAと書いてたのを見逃してました。
    2回しか回答できなかったので修正できず。すいません。
    条件付書式を使った方が、数値が変わったときにすぐに反映されるので汎用性は高いといい訳しておきます。
    4の回答ですが数値が0か-のときは意図した動作はしないようです。
    汎用性を考えてそれを回避するには
    16行目と27行目をそれぞれ

    If IsNumeric(Cells(b, a)) And (Cells(b, a) <> "") Then

    If IsNumeric(Cells(b, a)) And (Cells(b, a) > c) Then

    にするといいですね。(ついでに数値以外が入っていたときにも対応)
  • id:gauchon
    >SALINGERさん
    本当にありがとうございます!!
    質問を終了してしまったので,
    せっかくのコメントにポイントで返せず,
    申し訳ないです..
    非常に参考になり,汎用性が高まりました.

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません