【VBA】ボタン(図形)を押すと、その外枠の色だけを変更する

目次

概要

本記事では、ワークシート上の図形(ボタン)をクリックしたときに、その図形自身の外枠線の色だけを変更する、最小構成の Excel VBA をご紹介いたします。グラフや系列など、他要素には一切影響を与えません。色は Windows の「色の選択」ダイアログから任意に指定できます。

前提条件

  • Microsoft 365 版 Excel を使用していること。
  • 図形(四角形、丸、アイコンなど)をシート上に配置し、後述のマクロを割り当てられること。
  • 32bit/64bit いずれの Excel でも動作するように実装しています。

使い方

  1. ワークシートに図形を一つ配置します。
  2. 図形を右クリックし、「マクロの登録」から後述の ChangeCallerShapeOutlineColor を割り当てます。
  3. 図形をクリックすると色選択ダイアログが開き、選択した色でその図形自身の外枠線の色だけが変更されます。

コード全文(必要最低限)

以下のコードを標準モジュールに貼り付けてご利用ください。機能は「クリックした図形の外枠線色を変更する」のみです。

Option Explicit

'==============================
' 色選択ダイアログ(32/64bit 対応)
'==============================
#If VBA7 Then
    Private Type CHOOSECOLOR
        lStructSize     As Long
        hwndOwner       As LongPtr
        hInstance       As LongPtr
        rgbResult       As Long
        lpCustColors    As LongPtr
        Flags           As Long
        lCustData       As LongPtr
        lpfnHook        As LongPtr
        lpTemplateName  As LongPtr
    End Type

    Private Declare PtrSafe Function ChooseColor Lib "comdlg32.dll" Alias "ChooseColorA" ( _
        ByRef pChoosecolor As CHOOSECOLOR) As Long
#Else
    Private Type CHOOSECOLOR
        lStructSize     As Long
        hwndOwner       As Long
        hInstance       As Long
        rgbResult       As Long
        lpCustColors    As Long
        Flags           As Long
        lCustData       As Long
        lpfnHook        As Long
        lpTemplateName  As String
    End Type

    Private Declare Function ChooseColor Lib "comdlg32.dll" Alias "ChooseColorA" ( _
        ByRef pChoosecolor As CHOOSECOLOR) As Long
#End If

Private Const CC_RGBINIT  As Long = &H1&
Private Const CC_FULLOPEN As Long = &H2&

' 色選択ダイアログを表示し、選んだ RGB を返す。キャンセル時は -1。
Private Function ShowColorDialog(Optional ByVal DefaultColor As Long = 0) As Long
    Dim cc As CHOOSECOLOR
#If VBA7 Then
    Dim aCust(0 To 15) As Long   ' 16 個のカスタムカラー領域
#Else
    Dim CustColors As String
#End If

    With cc
        .lStructSize = Len(cc)
        .hwndOwner = Application.Hwnd
        .Flags = CC_RGBINIT Or CC_FULLOPEN
        .rgbResult = DefaultColor
#If VBA7 Then
        .lpCustColors = VarPtr(aCust(0))
#Else
        CustColors = String$(16 * 4, vbNullChar)
        .lpCustColors = CustColors
#End If
    End With

    If ChooseColor(cc) <> 0 Then
        ShowColorDialog = cc.rgbResult
    Else
        ShowColorDialog = -1
    End If
End Function

'==============================
' クリックした図形(Application.Caller)の外枠線色だけを変更
'==============================
Public Sub ChangeCallerShapeOutlineColor()
    Dim ws  As Worksheet
    Dim shp As Shape
    Dim clr As Long

    Set ws = ActiveSheet

    ' 色を選択(キャンセル時は終了)
    clr = ShowColorDialog
    If clr = -1 Then Exit Sub

    ' 実行元が図形であることを前提に外枠線色を設定
    On Error Resume Next
    Set shp = ws.Shapes(Application.Caller)
    If Not shp Is Nothing Then
        shp.Line.Visible = msoTrue
        shp.Line.ForeColor.RGB = clr
    End If
    On Error GoTo 0
End Sub

実装上の注意点

  • 本マクロは「図形に割り当てて、図形をクリックして実行する」前提です。ショートカットキー実行など、図形以外からの実行では Application.Caller が図形名を返さない場合があります。
  • 図形の外枠線が非表示になっている場合でも、Visible を有効化して色を適用します。太さや線種は既存設定のままです。必要であれば、shp.Line.Weight(太さ)や shp.Line.DashStyle(実線・点線など)を追加で設定してください。
  • 既存の他マクロやイベントと併用する際は、同じ図形に複数の操作を行わないよう設計を整理してください。

まとめ

最小構成のコードで、クリックした図形自身の外枠線色のみを変更する手順をご説明いたしました。外観の統一や、ユーザーに色選択を委ねたい場面で有用です。必要に応じて、線の太さや塗りつぶし色の変更処理を追加し、用途に合わせて拡張してご活用ください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次