セルに入力した文字列でテキストボックスを作成する

また、あまり役に立たないことを思いついた。
その前段として、今回は「セルに入力した文字列でテキストボックスを作成する」ことに挑戦する。
f:id:Infoment:20181206223040p:plain
作戦としては、こうだ。

  1. ワークシートのチェンジイベントを用いて、セルに文字列が入力されたことをトリガーとする(とりあえず今回は)。
  2. セルの位置やサイズを取得して、同セルにぴったりはまるテキストボックスを作成する。
  3. 同テキストボックスに、同セルから取得した文字列を入力する。
  4. 同テキストボックスのフォントの種類やサイズも、同セルから取得して反映。

まず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で、元に戻しておく。

結果は、こんな感じだ。
f:id:Infoment:20181206224112g:plain

何に使うのかと言われれば、これから試してみる遊びのための道具なので、やっぱりビジネスシーンでは役に立たないかもしれない。

明日に続きます。

参考まで。