2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[VBA]フォームを使わない軽量チェックボックスで幸せになろう

Last updated at Posted at 2021-11-10

背景

VBA初めて一ヶ月も経たない超初心者。
チェックボックスをフォームで作ったら結構データが多いので容量でかくなりすぎて動かんくなって死んだ(Excelが)。
強制終了させて、さてどうするか。

調べてると図形を使うといいらしい。
コードはいっぱい書いてあってしんどかったから概要だけいただいてきました。ありがとうございます!!

ご指摘あればよろしくお願いします。

本題

図形(オートシェイプ)を使います。
図形にマクロ登録して
図形のテキストを編集することで疑似チェックボックスにします。


ざっくり手順

  • 長方形を配置する
  • チェックの文字を選ぶ(チェックボックス風になるよう微調整)
  • 図のテキストを表示/非表示にさせるコード書く
  • 環境依存文字に対応する

長方形を配置する

適当に配置したら好きな見た目にしよう

スクリーンショット (2).png

チェックの文字を選ぶ

するとこんな感じ。

スクリーンショット (4).png

崩れてる。
図形を右クリックー「サイズとプロパティ」ー「プロパティ」ー「垂直方向の配置」で「中心を選択」

するとこう!!

スクリーンショット (6).png

いい感じ。

図のテキストを表示/非表示にさせるコード書く

とりあえずの検証をするならこんな感じでいいと思う。
ただ問題があって、✓は環境依存文字なので「?」になる。

ここでこっそりマクロの登録終わらせています

※完成じゃないよ!

Option Explicit

Sub myCheckBox()

    Dim ws As Worksheet
    Dim shp As Shape
    
    Set ws = ActiveSheet
    Set shp = ws.Shapes(Application.Caller) ' クリックした図形を取得
    
    With shp.TextFrame.Characters
        If .Text = "" Then
            .Text = "✓"
        Else
            .Text = ""
        End If
    End With

End Sub

環境依存文字に対応する

チェックボックスにテキストを入力して次のコードを実行すると、イミディエイトウィンドウに文字コードが出てくると思う。

Option Explicit

Sub getMojiCode()

    Dim ws As Worksheet
    Dim shp As Shape
    
    Set ws = ActiveSheet
    Set shp = ws.Shapes(Application.Caller)
    
    With shp.TextFrame.Characters
        Debug.Print(Hex(AscW(.Text))) ' 文字コード出力
    End With
End Sub

私は「2713」だった。

これでおしまいだ。(実際にはMyCheckboxClassを作成して活用した。)

Option Explicit

Sub myCheckBox()

    Dim ws As Worksheet
    Dim shp As Shape
    Dim strMojiCode As String
    
    Set ws = ActiveSheet
    Set shp = ws.Shapes(Application.Caller)
    strMojiCode = "2713" ' ここ変更してね

    With shp.TextFrame.Characters
        If .Text = "" Then
            .Text = ChrW("&H" + strMojiCode)
        Else
            .Text = ""
        End If
    End With

End Sub

(おまけ)チェックボックスの位置を取得する

shp.TopLeftCell.Address
shp.TopLeftCell.Row
shp.TopLeftCell.Column

' 変数を展開するとこう
ActiveSheet.Shapes(Application.Caller)TopLeftCell.Address
ActiveSheet.Shapes(Application.Caller)TopLeftCell.Row
ActiveSheet.Shapes(Application.Caller)TopLeftCell.Column

チェックボックスの位置が取得できれば、チェック付きチェックボックスの行を取得とか隣のセルの値を取得とか、いろいろやりたいことができるかなと思います。(TopLeftを取得してるので配置が重要!!!)

参考

Excel checkbox optionbutton 重いチェックボックス対策 超軽量チェックボックス
【VBA】図形のテキストや文字色の取得と設定【.TextFrame.Charactersを使う】
【VBA】環境依存文字(レ点チェックなど)の出力方法【コード有】

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?