背景
VBA初めて一ヶ月も経たない超初心者。
チェックボックスをフォームで作ったら結構データが多いので容量でかくなりすぎて動かんくなって死んだ(Excelが)。
強制終了させて、さてどうするか。
調べてると図形を使うといいらしい。
コードはいっぱい書いてあってしんどかったから概要だけいただいてきました。ありがとうございます!!
ご指摘あればよろしくお願いします。
本題
図形(オートシェイプ)を使います。
図形にマクロ登録して
図形のテキストを編集することで疑似チェックボックスにします。
ざっくり手順
- 長方形を配置する
- チェックの文字を選ぶ(チェックボックス風になるよう微調整)
- 図のテキストを表示/非表示にさせるコード書く
- 環境依存文字に対応する
長方形を配置する
適当に配置したら好きな見た目にしよう
チェックの文字を選ぶ
するとこんな感じ。
崩れてる。
図形を右クリックー「サイズとプロパティ」ー「プロパティ」ー「垂直方向の配置」で「中心を選択」
するとこう!!
いい感じ。
図のテキストを表示/非表示にさせるコード書く
とりあえずの検証をするならこんな感じでいいと思う。
ただ問題があって、✓は環境依存文字なので「?」になる。
ここでこっそりマクロの登録終わらせています
※完成じゃないよ!
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】環境依存文字(レ点チェックなど)の出力方法【コード有】