セルのコメントを編集する(2) InputBox関数編-2 複数行対応
InputBox関数によるセルのコメント編集マクロ、前回は1行コメントの編集に対応したものを作成しました。今回はこれを元に複数行に対応させてみようと思います。
- 前回までのコード
- 単純に vbCrLf や Chr(13) & Chr(10) とはいかない
- 文字列を分割するSplit関数
- 既存のコメントが複数行だった場合の処理
- 完成コード
- 次回:ユーザーフォームを使ったセルのコメント編集
前回までのコード
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にこれらを単純に入力しても改行にはなりません。
全然出来てませんね。入力したとおりのコメントになってしまいました。
文字列を分割する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関数で最大値を求めます。
既存のコメントが複数行だった場合の処理
既存のコメントが複数行だった場合、InputBoxに代入される文字列は見た目は1行になったように見えます。
この状態で別の場所に改行を入れてみます。「1行目」「2行目」「3行目」の後ろに","を入れて改行します。
指定した箇所で改行されましたが、元々の改行が残っていました。
ワークシート関数 Clean を使う
InputBoxに既存のコメントを表示する際に、不要な改行を削除するため、ワークシート関数「CLEAN」を使用します。
Dim DefaultComment As String DefaultComment = WorksheetFunction.Clean(ActiveCell.Comment.Text) StrHen = InputBox(Prompt:="※改行したい位置に,を入力して下さい。", _ Title:="コメント編集(改良版)", _ Default:=DefaultComment)
「1行目」「2行目」「3行目」の後ろに","を入れて改行します。
意図したとおりに改行されました。
完成コード
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