日本語入力ソフトとVBAの覚え書き

・各種日本語入力ソフトの辞書解説 ・ちょっと楽になるExcel VBA集

セルのコメントを編集する(2) InputBox関数編-2 複数行対応

f:id:dz_dzone:20170814233145j:plain

InputBox関数によるセルのコメント編集マクロ、前回は1行コメントの編集に対応したものを作成しました。今回はこれを元に複数行に対応させてみようと思います。

前回までのコード

Sub KomeHen()
  If TypeName(ActiveCell.Comment) = "Comment" Then
  
    ' ** セルにコメントがあれば処理する **
    Dim StrHen As String
    StrHen = InputBox(Prompt:="※改行は出来ません。", _
                      Title:="コメント編集(一行版)", _
                      Default:=ActiveCell.Comment.Text)
        
    ' ** キャンセル処理
    If StrPtr(StrHen) = 0 Then
      Exit Sub
    End If
    
    ' ** コメント内容を変更する処理 **
    With ActiveCell
      With .Comment
        .Shape.Select True
        .Text Text:=StrHen
      End With
      .Activate
    End With
    Exit Sub
  Else
    ' ** セルにコメントがなかったら終了する **
    MsgBox "コメントがありません。", vbOKOnly + vbExclamation
    Exit Sub
  End If
End Sub

単純に vbCrLf や Chr(13) & Chr(10) とはいかない

改行と言えば vbCrLf や Chr(13) & Chr(10) などが思いつきますが、InputBoxにこれらを単純に入力しても改行にはなりません。

f:id:dz_dzone:20171024105000j:plain
f:id:dz_dzone:20171024105010j:plain

全然出来てませんね。入力したとおりのコメントになってしまいました。

文字列を分割するSplit関数

文字列を分割するのにはSplit関数があります。区切り文字を設定することで文字列を複数文字列に分割することが可能です。分割された文字列は1次元配列に入ります。

    ' ** Split
    Dim RTmp As Variant
    RTmp = Split(StrHen, ",")

返り値が1次元配列なのでVariant型とします。区切り文字を","として StrHen を分割し、1次元配列 RTmp に代入します。

    StrHen = RTmp(0)
    For i = 1 To UBound(RTmp)
      StrHen = StrHen & vbCrLf & RTmp(i)
    Next i

StrHen を書き換えます。まず1行目を代入し、2行目以降は改行(vbCrLf)と文字列を追加していきます。このとき、最大分割数(=配列の最大数)が必要になりますので、UBound関数で最大値を求めます。

f:id:dz_dzone:20171024115246j:plain
f:id:dz_dzone:20171024115256j:plain

既存のコメントが複数行だった場合の処理

既存のコメントが複数行だった場合、InputBoxに代入される文字列は見た目は1行になったように見えます。

f:id:dz_dzone:20171024131126j:plain

この状態で別の場所に改行を入れてみます。「1行目」「2行目」「3行目」の後ろに","を入れて改行します。

f:id:dz_dzone:20171024132001j:plain

指定した箇所で改行されましたが、元々の改行が残っていました。

f:id:dz_dzone:20171024132014j:plain

ワークシート関数 Clean を使う

InputBoxに既存のコメントを表示する際に、不要な改行を削除するため、ワークシート関数「CLEAN」を使用します。

    Dim DefaultComment As String
    DefaultComment = WorksheetFunction.Clean(ActiveCell.Comment.Text)
        
    StrHen = InputBox(Prompt:="※改行したい位置に,を入力して下さい。", _
                      Title:="コメント編集(改良版)", _
                      Default:=DefaultComment)

「1行目」「2行目」「3行目」の後ろに","を入れて改行します。

f:id:dz_dzone:20171024132001j:plain

意図したとおりに改行されました。

f:id:dz_dzone:20171024133200j:plain

完成コード

Sub KomeHen2()
  If TypeName(ActiveCell.Comment) = "Comment" Then
    ' ** セルにコメントがあれば処理する **
        
    Dim StrHen As String
    Dim DefaultComment As String
        
    DefaultComment = WorksheetFunction.Clean(ActiveCell.Comment.Text)
        
    StrHen = InputBox(Prompt:="※改行したい位置に,を入力して下さい。", _
                      Title:="コメント編集(改良版)", _
                      Default:=DefaultComment)
        
    ' ** 空白ならキャンセルとする
    If StrPtr(StrHen) = 0 Then
      Exit Sub
    End If
    
    ' ** Split
    Dim RTmp As Variant
    RTmp = Split(StrHen, ",")
        
    StrHen = RTmp(0)
    For i = 1 To UBound(RTmp)
      StrHen = StrHen & vbCrLf & RTmp(i)
    Next i
        
    ' ** コメント内容を変更する処理 **
    With ActiveCell
      With .Comment
        .Shape.Select True
        .Text Text:=StrHen
      End With
        .Activate
    End With
    Exit Sub
  Else
    ' ** セルにコメントがなかったら終了する **
    MsgBox "コメントがありません。", vbOKOnly + vbExclamation
    Exit Sub
  End If
End Sub

次回:ユーザーフォームを使ったセルのコメント編集

これでInputBox関数を使ったセルのコメント編集マクロは完成です。次回は、ユーザーフォームを使ったセルのコメント編集マクロを作ろうと思います。

以上。

にほんブログ村 IT技術ブログ VBAへ←記事を気に入って頂けたらポチッとしてもらえると励みになります。