Excel VBA 質問スレッド №2103 (解決済)

図形の色変更について

投稿者 : あやぱぱ     投稿日時 : 2025/04/02(Wed) 09:38:23     OS : 未指定     EXCEL : 未指定
初心者です、よろしくお願いします。

セルO43とO44の数値の大きさにより二つある図形(矢印)の色を変えたいのですが上手くいきません。
O43の方が大きい場合は[矢1]を白色にして見えなくし、[矢2]は黒色にする。
044の方が大きい場合は逆にしたいです。

下が色々調べながら書いたコードですが、全く動きません。
ご教授お願い言い足します。

Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False

If Range("O43").Value - Range("O44").Value > 0 Then
  ActiveSheet.Shapes.Range(Array("矢1")).Select
  With Selection.ShapeRange.Line.ForeColor.ObjectThemeColor = msoThemeColorBackground1
  End With
  ActiveSheet.Shapes.Range(Array("矢2")).Select
  With Selection.ShapeRange.Line.ForeColor.ObjectThemeColor = msoThemeColorDark1
  End With
End If
If Range("O43").Value - Range("O44").Value < 0 Then
  ActiveSheet.Shapes.Range(Array("矢2")).Select
  With Selection.ShapeRange.Line.ForeColor.ObjectThemeColor = msoThemeColorBackground1
  End With
  ActiveSheet.Shapes.Range(Array("矢1")).Select
  With Selection.ShapeRange.Line.ForeColor.ObjectThemeColor = msoThemeColorDark1
  End With
End If

Range("O41").Select
End Sub

スポンサーリンク
[返信 1] Re : 図形の色変更について
投稿者 : さんこう     投稿日時 : 2025/04/02(Wed) 09:46:26
>下が色々調べながら書いたコードですが、全く動きません。

動いているとおもいますが、色を変えるコードが存在しないので希望する動作になっていないのでしょう。

[返信 2] Re : 図形の色変更について
投稿者 : tek     投稿日時 : 2025/04/02(Wed) 14:43:46
>下が色々調べながら書いたコードですが、全く動きません。
> With Selection.ShapeRange.Line.ForeColor.ObjectThemeColor = msoThemeColorBackground1
> End With
興味があるので教えてください。上記のコード何を参考にしましたか?

https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/with-statement
>Withobject [ statements ] End With
とありますが、
通常は
With object
[ statements ]
End With
と使います。

例えば、以下の例ではエラーにはなりませんが、セルA1の値は"a"のままで"B"にはなりません。
Sub sumple()
    Range("A1").Value = "a"
    With Range("A1").Value = "B"
'        .   'と打ってもなにも候補が出ない
        Debug.Print Range("A1").Value
    End With
End Sub

Range("A1").Value = "B" は
ユーザー定義型でもオブジェクトでもないので
"."と打ってもインテリセンス候補は何も出ません。
なぜなのかは、Copilotに聞いてみると以下のことを教えてくれます。
1. 式の評価とWith構文の適用範囲:
2. なぜエラーにならないか:
3. 設計上の注意点:

[返信 3] Re : 図形の色変更について
投稿者 : あやぱぱ     投稿日時 : 2025/04/02(Wed) 23:37:01
お二人大変ありがとうございます。
仰っている意味さえ解らないど素人で恐縮です。

コードは検索にヒットしたマクロコードのhpからが主です。
自分で書いてみたら多くが改行部分でエラーだらけになり、
行をまとめたり入れ替えたりして、やっとエラーにならなくなったコードがこれです。
基本が出来ていないので進みません。

[返信 4] Re : 図形の色変更について
投稿者 : てらてら     投稿日時 : 2025/04/03(Thu) 07:01:59
こんにちは。
参考にしてみてください。

ちなみに、Withを使わずに、以下のようにも書けます。(With内が1行だから)

 ActiveSheet.Shapes.Range(Array("矢印1")).Fill.ForeColor.ObjectThemeColor = msoThemeColorText1

Withを使えば、他のオプションも省略して書けるので便利という話。


Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    If Range("O43") > Range("O44") Then
    
        With ActiveSheet.Shapes.Range(Array("矢印1")).Fill
            .ForeColor.ObjectThemeColor = msoThemeColorText1
        End With
        
        With ActiveSheet.Shapes.Range(Array("矢印2")).Fill
            .ForeColor.ObjectThemeColor = msoThemeColorBackground1
        End With
    
    Else
    
        With ActiveSheet.Shapes.Range(Array("矢印2")).Fill
            .ForeColor.ObjectThemeColor = msoThemeColorText1
        End With
        
        With ActiveSheet.Shapes.Range(Array("矢印1")).Fill
            .ForeColor.ObjectThemeColor = msoThemeColorBackground1
        End With
    
    End If

End Sub

[返信 5] Re : 図形の色変更について
投稿者 : tek     投稿日時 : 2025/04/03(Thu) 09:50:43
回答ありがとうございます。
With a = b
End With
などと紹介しているページは無かったと解釈いたします。

以下参考にしてください。
>O43の方が大きい場合は[矢1]を白色にして見えなくし、[矢2]は黒色にする。
>044の方が大きい場合は逆にしたいです。

テーマ色はまず変えることが無いと思われますので、ObjectThemeColorを変える方法もあり得るでしょうが、
見えなくするのであれば、白色にすると枠線が設定されている場合は線が交差する枠線が消えますので見えなく(Visible=false)し、
黒色はRGB指定の方が合理的と私は思います。一旦黒にするに一回実行しておきます。

Private Sub Worksheet_Change(ByVal Target As Range)
    'もし該当セルが変っていないのであれば抜けさせます。いや他のセルの変更でも色変更するんだよの場合は削除
    If Intersect(Me.Range("o43:o44"), Target) Is Nothing Then Exit Sub

'    Application.ScreenUpdating = False     'この程度であれば画面更新をon/offするのは無駄です
    
    Select Case Me.Range("o43").Value - Me.Range("o44").Value
        Case Is > 0 ', Is = 0   'イコールの場合の処置をどちらかにする場合はどちらかで有効にする
                Me.Shapes("矢1").Visible = msoCTrue
                Me.Shapes("矢2").Visible = msoFalse
        Case Is < 0
                Me.Shapes("矢2").Visible = msoCTrue
                Me.Shapes("矢1").Visible = msoFalse
'        Case Is = 0             'イコールの場合の処置が異なる場合はここに書く
'                Me.Shapes("矢1").Visible = msoCTrue
'                Me.Shapes("矢2").Visible = msoCTrue
    End Select
'    Application.ScreenUpdating = true     '画面更新をoffしたのであれば必ずonに戻してください
End Sub

Sub 一旦黒にする()
    Me.Shapes("矢1").Line.ForeColor.RGB = vbBlack
    Me.Shapes("矢2").Line.ForeColor.RGB = vbBlack
End Sub

[返信 6] Re : 図形の色変更について
投稿者 : あやぱぱ     投稿日時 : 2025/04/04(Fri) 08:13:06
お二人さま、大変ありがとうございます。

てらてらさんのは、
「指定された値は境界を超えています」となり、
'.ForeColor.ObjectThemeColor = msoThemeColorText1
のところでエラーになりました。

tekさんのは最初白(見えなくなる)になりましたが、
一旦黒にする、でその後問題なく動きました。

お二人のコードを参考に勉強します。

素人相手にありがとうございました。
解決とさせていただきます。

当掲示板について
  • Excel VBA に関する掲示板です。Excel VBA に関する質問や疑問、それに対する解決方法など気軽に投稿してください。
  • 記事内ではHTMLのタグは使用できません。
  • 記事は一度投稿すると修正できません。内容を訂正したい場合は返信で対応してください。
  • Sub〜End Sub、Function〜End Function は自動的にプログラムコードとみなし、枠で囲って見やすくします。
  • Excel VBA とは関係ないことや、他人が不快に思うようなことなど、管理人が適当でないと判断した記事は削除する場合があります。
スポンサーリンク
返信入力フォーム
お 名 前  :
内  容   :

ステータス  :

認証コード  : キャプチャ画像 




( 処理日時 : 2025-09-14 15:50:50 )
タイトルとURLをコピーしました