セルに入力した文字列でテキストボックスを作成する
また、あまり役に立たないことを思いついた。
その前段として、今回は「セルに入力した文字列でテキストボックスを作成する」ことに挑戦する。
作戦としては、こうだ。
- ワークシートのチェンジイベントを用いて、セルに文字列が入力されたことをトリガーとする(とりあえず今回は)。
- セルの位置やサイズを取得して、同セルにぴったりはまるテキストボックスを作成する。
- 同テキストボックスに、同セルから取得した文字列を入力する。
- 同テキストボックスのフォントの種類やサイズも、同セルから取得して反映。
まず2.~4.用に、クラスモジュールを作成した。
クラスモジュール(TextBoxClass)
Option Explicit Public TargetRange As Range Private Property Get myLeft() As Double myLeft = TargetRange.Left End Property Private Property Get myTop() As Double myTop = TargetRange.Top End Property Private Property Get myWidth() As Double myWidth = TargetRange.Width End Property Private Property Get myHeight() As Double myHeight = TargetRange.Height End Property Public Function myTextBox() As Shape If TargetRange = "" Then Exit Function Set myTextBox = ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, _ myLeft, myTop, myWidth, myHeight) myTextBox.TextFrame2.TextRange.Characters.Text = TargetRange.Value myTextBox.TextFrame2.TextRange.Font.NameComplexScript = TargetRange.Font.Name myTextBox.TextFrame2.TextRange.Font.NameFarEast = TargetRange.Font.Name myTextBox.TextFrame2.TextRange.Font.Name = TargetRange.Font.Name myTextBox.TextFrame2.TextRange.Font.Size = TargetRange.Font.Size myTextBox.TextFrame2.VerticalAnchor = msoAnchorMiddle myTextBox.TextFrame2.TextRange.ParagraphFormat.Alignment = msoAlignLeft myTextBox.Line.Visible = msoFalse End Function
マクロの記録で得られた結果を編集したので、無駄な部分がまだ残っているかもしれない。特に「NameComlexScript」などは、意味も解らずそのまま残してある。後で調べてみよう。
次いで、ワークシートのチェンジイベントをセットする。
ワークシート
Private Sub Worksheet_Change(ByVal Target As Range) Dim TBC As TextBoxClass Set TBC = New TextBoxClass Set TBC.TargetRange = Target Application.EnableEvents = False TBC.myTextBox Target = "" Application.EnableEvents = True End Sub
Application.EnableEvents = Falseで一旦イベントを停止している。これを怠ると、
変更検知 ⇒ イベント実施 ⇒ イベントによって変更発生 ⇒ 変更検知 ⇒ ・・・
で、無限ループに陥る恐れがあるからだ。仕事が終わったら、
Application.EnableEvents = Trueで、元に戻しておく。
結果は、こんな感じだ。
何に使うのかと言われれば、これから試してみる遊びのための道具なので、やっぱりビジネスシーンでは役に立たないかもしれない。
明日に続きます。
参考まで。