テキストボックスの文字をセルに入力してみる

昨日は、セルに入力した文字列でテキストボックスを作成することに挑戦した。
infoment.hatenablog.com

今日は更に、以下に挑戦する。

  1. 作成したテキストボックスを、指定セルまで移動させる。
  2. 作成したテキストボックスの内容を、指定セルに転記する。
    その際、テキストボックス事態は削除する。

f:id:Infoment:20181207225357p:plain

昨日作成した内容を少し変更し、以下の3つを準備した。

サブプロシージャ名 機能
CellToTextbox セルの記載内容からテキストボックスを作成
MovingTextBox テキストボックスを、指定セルまで移動
TextboxToCell テキストボックスの記載内容を、指定セルに転記

実際のコードが、こちらになる。

クラスモジュール(TextBoxClass)
Option Explicit
Public TargetRange As Range
Public DestinationCell As Range
Public myTextBox As Shape

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 Sub CellToTextbox()
    If TargetRange = "" Then Exit Sub
    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.TextFrame2.MarginLeft = 1.5
        myTextBox.Line.Visible = msoFalse
        myTextBox.Fill.Visible = msoFalse
End Sub

Public Sub MovingTextBox()
    '一回の移動を細分化する回数。
    Dim iMax As Long: iMax = 200
    ' 移動の始点。
    Dim x1 As Double: x1 = myTextBox.Left
    Dim y1 As Double: y1 = myTextBox.Top
    ' 移動の終点。
    Dim x2 As Double: x2 = DestinationCell.Left
    Dim y2 As Double: y2 = DestinationCell.Top
    ' 細分化した一回の移動距離。
    Dim dx As Double: dx = (x2 - x1) / iMax
    Dim dy As Double: dy = (y2 - y1) / iMax
    
    Dim i As Long
        For i = 1 To iMax
            myTextBox.Left = myTextBox.Left + dx
            myTextBox.Top = myTextBox.Top + dy
            Application.Wait [now()+"0:00:00.001"]
        Next

End Sub

Public Sub TextboxToCell()
    With myTextBox.TextFrame2
        DestinationCell.Value = .TextRange.Characters.Text
        DestinationCell.Font.Name = .TextRange.Font.Name
        DestinationCell.Font.Size = .TextRange.Font.Size
        DestinationCell.VerticalAlignment = .VerticalAnchor
        DestinationCell.HorizontalAlignment = .TextRange.ParagraphFormat.Alignment
    End With
    myTextBox.Delete
End Sub

ワークシートのチェンジイベントがこちら。今回は、記入したセルから下に10,右に5つオフセットさせてみた。

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    If Target.Value = "" Then Exit Sub

    Dim TBC As TextBoxClass
    Set TBC = New TextBoxClass
    Set TBC.TargetRange = Target
    Set TBC.DestinationCell = Target.Offset(10, 5)
    
    Application.EnableEvents = False
    TBC.CellToTextbox
    Target = ""
    TBC.MovingTextBox
    TBC.TextboxToCell
    Application.EnableEvents = True
End Sub

結果はこちら。
f:id:Infoment:20181207230623g:plain

折角書いた文字があたかも逃げていくかのように、指定セルへ移動させることができた。

今日はここまで。明日に続きます。

参考まで。