7.

Excel VBA でラベルを動的に作成し、プログラムと連携させる方法

編集
この記事の要点
  • Excel VBA のラベルには大別して 3 種類: フォームコントロール / ActiveX / UserForm の Label
  • シート上ラベルの動的更新: ActiveSheet.Shapes("Label1").TextFrame.Characters.Text = "表示内容"
  • UserForm のラベル: UserForm1.Label1.Caption = "新しい値"
  • Worksheet_Change イベントで「セルの値が変わるたびにラベル更新」が定番
  • フォント・色は .Font.Bold / .Font.Color = RGB(255,0,0)。背景色はシェイプの .Fill.ForeColor.RGB

ラベルの 3 種類

種類挿入場所特徴
フォームコントロール (Label)開発タブ → 挿入 → フォームコントロール古い形式。シンプル。マクロから操作可
ActiveX コントロール (Label)開発タブ → 挿入 → ActiveX コントロールプロパティが豊富。ただし環境依存あり
UserForm の LabelVBE で UserForm に配置ダイアログ内の表示。最も柔軟
シェイプにテキスト(代替案)挿入 → 図形 → テキストボックスVBA で Shapes.AddLabel で動的生成も可

シート上にラベルを動的に作成

Sub AddLabelDynamic()
    Dim lbl As Shape
    Set lbl = ActiveSheet.Shapes.AddLabel( _
        Type:=msoTextOrientationHorizontal, _
        Left:=100, _
        Top:=50, _
        Width:=200, _
        Height:=30)

    lbl.Name = "StatusLabel"
    lbl.TextFrame.Characters.Text = "処理待機中..."
    lbl.TextFrame.Characters.Font.Bold = True
    lbl.TextFrame.Characters.Font.Size = 14
    lbl.TextFrame.Characters.Font.Color = RGB(0, 102, 204)
End Sub

Sub UpdateLabel(message As String)
    On Error Resume Next
    ActiveSheet.Shapes("StatusLabel").TextFrame.Characters.Text = message
    On Error GoTo 0
End Sub

Sub DemoUpdate()
    Call UpdateLabel("処理開始")
    Application.Wait Now + TimeValue("00:00:01")
    Call UpdateLabel("処理中... 50%")
    Application.Wait Now + TimeValue("00:00:01")
    Call UpdateLabel("完了しました")
End Sub

セルの変更に応じてラベルを更新

シートモジュール(VBE で対象シートをダブルクリック)に書きます:

' Sheet1 のコード
Private Sub Worksheet_Change(ByVal Target As Range)
    ' A1 セルの変更だけ反応
    If Target.Address = "$A$1" Then
        Dim val As Variant
        val = Target.Value
        If IsNumeric(val) Then
            If val > 100 Then
                Call UpdateLabel("値が大きすぎます: " & val)
                ActiveSheet.Shapes("StatusLabel").TextFrame.Characters.Font.Color = RGB(204, 0, 0)
            Else
                Call UpdateLabel("OK: " & val)
                ActiveSheet.Shapes("StatusLabel").TextFrame.Characters.Font.Color = RGB(0, 153, 0)
            End If
        Else
            Call UpdateLabel("数値を入力してください")
        End If
    End If
End Sub

UserForm のラベルを操作

' UserForm1 にラベル Label1 を配置している前提

' フォーム表示時に初期化
Private Sub UserForm_Initialize()
    Me.Label1.Caption = "ファイル名を入力してください"
    Me.Label1.ForeColor = RGB(0, 0, 153)
    Me.Label1.Font.Bold = True
    Me.Label1.Font.Size = 11
End Sub

' TextBox1 が変更されたらラベルを更新
Private Sub TextBox1_Change()
    Dim text As String
    text = Me.TextBox1.Value

    If Len(text) = 0 Then
        Me.Label1.Caption = "ファイル名を入力してください"
        Me.Label1.ForeColor = RGB(0, 0, 153)
    ElseIf Len(text) > 50 Then
        Me.Label1.Caption = "ファイル名が長すぎます(50 文字以内)"
        Me.Label1.ForeColor = RGB(204, 0, 0)
    Else
        Me.Label1.Caption = "OK: " & text & ".xlsx で保存します"
        Me.Label1.ForeColor = RGB(0, 153, 0)
    End If
End Sub

フォームコントロールのラベル(古い形式)

「開発」タブ → 挿入 → フォームコントロール → ラベル で配置したラベルは Shapes コレクション経由で操作します:

Sub UpdateFormControlLabel()
    ' ラベル名は配置時に「ラベル 1」「Label 1」等
    With ActiveSheet.Shapes("ラベル 1")
        .TextFrame.Characters.Text = "新しい表示内容"
        .TextFrame.Characters.Font.Bold = True
        .Fill.ForeColor.RGB = RGB(255, 255, 200)  ' 背景色
        .Line.ForeColor.RGB = RGB(255, 153, 0)    ' 枠線色
    End With
End Sub

' 全ラベル一覧
Sub ListAllLabels()
    Dim s As Shape
    For Each s In ActiveSheet.Shapes
        Debug.Print s.Name, s.Type, s.TextFrame.Characters.Text
    Next s
End Sub

ActiveX ラベル

' ActiveX ラベル Label1 がシートに配置されている前提
Sub UpdateActiveXLabel()
    With Sheet1.Label1
        .Caption = "ActiveX ラベル"
        .Font.Bold = True
        .Font.Size = 14
        .ForeColor = RGB(0, 102, 204)
        .BackColor = RGB(255, 255, 200)
        .BorderStyle = 1  ' fmBorderStyleSingle
    End With
End Sub

セルのコメントもラベル代わりに使える

Sub AddCellComment()
    With Range("A1")
        If Not .Comment Is Nothing Then .Comment.Delete
        .AddComment "ここに注釈を表示"
        .Comment.Shape.TextFrame.Characters.Font.Bold = True
        .Comment.Visible = True   ' 常時表示
    End With
End Sub

FAQ

Q: ラベルを背景透過にしたい
A: フォームコントロールは .Fill.Visible = msoFalse。ActiveX は .BackStyle = 0(fmBackStyleTransparent)。

Q: 配置後にラベルの名前を変えたい
A: 右クリックの名前ボックス(数式バーの左)に新しい名前を入力するか、Shapes("旧名").Name = "新名"

Q: ラベルが印刷されないようにしたい
A: ラベルを右クリック → コントロールの書式設定 → プロパティ → 「オブジェクトを印刷する」のチェックを外す。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. マップの追加方法
  2. テンプレートの種類一覧
  3. ファイルの役割一覧
  4. シミュレーターの画面の拡大/縮小をする方法
  5. スライダーの作成とカスタマイズ
  6. ボタンの作成とプログラムと連携
  7. ラベルの作成とプログラムと連携
  8. 【Xcode/Swift】ImageViewのContentMode一覧
  9. エラー一覧
  10. アプリを実機で起動させる方法
  11. ツールバーの設置とボタンの追加
  12. 画像の追加