VBAでテキストボックスのフォント指定は難しかった
選択セルの値を使ってテキストボックスを作成するマクロを書いていて
フォントの指定が難しかったのでメモ
テキストボックスを作りたいセルを選択してマクロを実行
セルの値が入ったテキストボックスが作成された
これが求めていた結果、ここまで難しかった
期待はずれな例
日本語の文字だけが指定したフォントにならずに
MS ゴシックになっていた
charaCount=Shape.TextFrame2.TextRange.Characters.Count'文字数カウント
Shape.TextFrame2.TextRange.Characters(1, charaCount).Font.Name = フォント名 '英数字用
Shape.TextFrame2.TextRange.Characters(1, charaCount).Font.NameFarEast = フォント名 '日本語用
TextFrame2のTextRangeのCharactersで文字列のどこからどこまでかを指定していして
ここでは全部の文字だから1番目の文字から文字数(最後の文字)を指定して
ここでやっとフォントの指定のFont.Nameでフォントを指定する
しかも
Font.Nameっていう半角英数字用と
Font.NameFarEastっていう日本語用
この2つに指定しなければならない
2016/09/10追記ここから
With Shape.TextFrame2.TextRange.Font
.Name = Font.Name '英数字用?フォント指定
.NameFarEast = Font.Name '日本語用フォント指定
.Size = Font.Size
End With
.Name = Font.Name '英数字用?フォント指定
.NameFarEast = Font.Name '日本語用フォント指定
.Size = Font.Size
End With
文字数をカウントする必要なかったw
TextFrame2のTextRangeのFontのNameとNameFarEastそれぞれに
フォント名を指定するのは変わらない
2016/09/10追記ここまで
Excel 2007 のテキスト ボックスで使用するフォントの種類をマクロで変更できない
マイクロソフトのここを見ると現在調査中ってあるけど
2007年11月から何年調査しているんだろうって、エクセル2007のバグか仕様みたい
回避策としてFont.NameFarEastっていう日本語用だけを指定すればいいように書いてあるけど、フォントによっては両方共指定しないとおかしくなる
紛らわしかったのがテキストボックスや図形のフォントの指定ができそうなところがあちこちにあること
Shape.TextEffect.FontName
Shape.TextFrame.Characters.Font.Name
Shape.TextFrame.Characters(1,n).Font.Name
Shape.TextFrame2.Characters.Font.Name
Shape.TextFrame2.Characters(1,n).Font.Name
TextBox.Font.Name
これ全部できそうに見えてできないもので
正解は
Shape.TextFrame2.Characters(1,n).Font.Name
Shape.TextFrame2.Characters(1,n).Font.NameFarEast
この2つ、両方必要
あとエクセル2007は図形関係のマクロの記録ができない!
なので手動で変更してどんな動きしているのか見ることもできず
そんなこんなで時間がかかった
セルのフォント指定は
Range.Font.Name
でできるんだからテキストボックスとかの図形も
Shape.Font.Name
これでできればわかりやすいのになあ
せめてShape.TextFrame.Font.Nameとか
選択セルの値でテキストボックスを作成するマクロ
Sub SelectionValueTextBox選択セルの値でテキストボックスを作成する()
On Error Resume Next
Dim r As Range
Dim s As Shape
Dim sh As Worksheet: Set sh = ActiveSheet
Dim charaCount As Long
For Each r In Selection
'テキストボックス作成
Set s = sh.Shapes.AddTextbox( _
msoTextOrientationHorizontal, r.Width + r.Left, r.Top, r.Width, r.Height)
s.TextEffect.Text = r.Value 'セルの値をテキストボックスの文字に指定
With s.TextFrame
.HorizontalAlignment = xlHAlignCenter '水平中央
.VerticalAlignment = xlVAlignCenter '垂直中央
.AutoSize = True 'テキストに合わせてサイズを自動変更
End With
charaCount = s.TextFrame2.TextRange.Characters.Count '文字数カウント
With s.TextFrame2.TextRange.Characters(1, charaCount).Font 'フォント設定
.Name = r.Font.Name '英数字
.NameFarEast = r.Font.Name '日本語
.Size = r.Font.Size 'サイズ
End With
'背景色ランダム、文字色白
' Randomize
' s.Fill.ForeColor.RGB = Int((16777215 - 0 + 1) * Rnd(16777215) - 0)
' s.TextFrame.Characters.Font.Color = RGB(255, 255, 255)
Next
End Sub
2016/09/10追記ここから
こうなる
フォントがMS ゴシックにならずに
セルと同じMeiryo UIになっている
これを
この状態で実行すると
選択セルの数だけテキストボックスが作成される
色付けたくないとき
' 背景色ランダム、文字色白
Randomize
tb.Fill.ForeColor.Rgb = Int((16777215 - 0 + 1) * Rnd(16777215) - 0)
tb.TextFrame.Characters.Font.Color = Rgb(255, 255, 255)
これをコメントアウトして
' 背景色ランダム、文字色白
' Randomize
' tb.Fill.ForeColor.Rgb = Int((16777215 - 0 + 1) * Rnd(16777215) - 0)
' tb.TextFrame.Characters.Font.Color = Rgb(255, 255, 255)
この状態で実行すると
こうなる
2016/09/10追記ここまで
背景色ランダム、文字色白
今回大活躍の
アクティブシートの図形全部を削除するマクロSub ShapesAllDelete全図形削除()
ActiveSheet.Shapes.SelectAll
Selection.Delete
End Sub
これはここを参照した
関連記事
複数行のセルの値をまとめて1つのテキストボックスにするマクロ ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14674215.html