和風スパゲティのレシピ

日本語でコーディングするExcelVBA

セル内文字列を文字ごとに操作する - Characters

セル内の文字列を文字ごとに操作する、
RangeオブジェクトのCharactersプロパティを解説します。

セル内文字列を文字ごとに操作するCharactersプロパティ

基本構文

セル内文字列を文字ごとに分けてオブジェクトとして取得するには、
Charactersプロパティを以下の通り使用します。

対象セル.Characters(開始位置, 文字列の長さ)

 
引数はMid関数と同じ仕様と捉えてもらえればわかりやすいと思います。


上記コードにて取得した文字列(Charactersオブジェクト)に対し、
以下のメソッド・プロパティが実行・取得可能です。

メソッド

メソッド名 実行内容
Delete 取得した文字列を削除します。
Insert 開始位置の左に文字列を挿入します。

プロパティ

プロパティ名 取得できる値・オブジェクト
Font 各種書式(文字色やサイズなど)
Text テキスト(文字列)
Count 文字数
PhoneticCharacters フリガナ
Caption 表示文字列
Parent 親オブジェクト(今回はRange)
Application 親Application(今回はExcel)
Creator 親Applicationの32ビット値

 
プロパティで使うのはほとんど上4つだけだと思います。


CharactersはRange以外にも所持しているオブジェクトが多く、
TextFrameや、フォームコントロール、Excel以外のWordなどでも使用します。

このため親が何かを調べるプロパティが用意されていますが、
セル.Charactersから実行する場合は自明のため使う必要はありません。


また、Text/Captionに使い分けが存在するオブジェクトもありますが、
Rangeにおいてはどちらもまったく同じものになります。

よって、読みやすいTextを使っておけばOKと思います。

特定文字列をCharactersで取得する

位置指定ではなく、特定の文字列を検索して取得する場合は、
第1引数に「Instr関数」、第2引数に「Len関数」を使用してください。

' 基本構文
Characters(Instrで求めた開始位置, Lenで求めた文字数)

' サンプルコード
Sub セル内の特定文字列だけを着色する()
    
    Dim 対象セル As Range: Set 対象セル = Range("A1")
    Dim 着色文字列 As String: 着色文字列 = "(注)"
    
    ' セル内テキストを検索
    Dim instr位置 As Long
    instr位置 = InStr(対象セル.Value, 着色文字列)
    
    ' 文字列があれば赤色にする
    If instr位置 > 0 Then
        対象セル.Characters(instr位置, Len(着色文字列)).Font.Color = RGB(255, 0, 0)
    End If
    
End Sub

 
詳しくはこちらの記事をご覧ください。
www.limecode.jp

Charactersプロパティがエラーとなる場合

Charactersプロパティは数値や日付に対しては実行できず、

Charactersクラスの ○○ プロパティを取得できません。
Charactersクラスの ○○ プロパティを設定できません。

エラーとなります。

また、シート数式によって取得された文字列に対しても、
プロパティの取得・設定ともにできず、上記エラー
となります。


また、親のRangeオブジェクトは単独セルのほかに、
セル範囲や複数セルを指定することもできます。


この場合、「Fontプロパティ」で一括書式設定することはできますが、
「Textプロパティ」で文字列を取得することはできません。
(各セルの○文字目はみんな違うので当たり前と言えば当たり前)

Characterオブジェクトはありません。

Character「s」オブジェクトとみると、Worksheetsなどと同じように、
1文字ずつのCharacterオブジェクトのコレクションに見えてしまいます。

しかし実際は複数文字をまとめてCharactersオブジェクトとして取得しており、
1文字ずつをFor Each文で取得することはできません。


1文字ずつ処理したい場合は文字数をカウンタにFor文を回してください。

' NG
Dim 文字 As Character
For Each 文字 In セル.Characters(1, Len(セル.Text))

' OK
Dim n As Long
Dim 第n文字 As Characters
For n = 1 To Len(セル.Text)
    Set 第n文字 = セル.Characters(n, 1)

サンプルコード集

各プロパティを用いたサンプルコードを下記します。

セル内文字列を一部だけ書式設定する

' 4~6文字目を赤色に
対象セル.Characters(4, 3).Font.Color = RGB(255, 0, 0)

' 4文字目以降を赤色に
対象セル.Characters(4, 9999).Font.Color = RGB(255, 0, 0)

' 着色以外の書式設定
対象セル.Characters(4, 3).Font.Bold = True ' 太字
対象セル.Characters(4, 3).Font.Italic = True ' 斜体
対象セル.Characters(4, 3).Font.Name = "MS Pゴシック" ' フォント種類
対象セル.Characters(4, 3).Font.Size = 12 ' フォントサイズ
対象セル.Characters(4, 3).Font.Underline = xlUnderlineStyleSingle ' 下線
対象セル.Characters(4, 3).Font.Underline = xlUnderlineStyleDouble ' 二重下線
対象セル.Characters(4, 3).Font.Strikethrough = True ' 取り消し線
対象セル.Characters(4, 3).Font.Superscript = True ' 上付き文字
対象セル.Characters(4, 3).Font.Subscript = True ' 下付き文字

Charactersプロパティは、このFont設定コードが最頻コードと思います。

詳しくはこちらの記事をご覧下さい。

www.limecode.jp

セル内文字列の一部を削除する

 46文字目を削除
対象セル.Characters(4, 3).Delete
    ' または
対象セル.Characters(4, 3).Text = ""

 4文字目以降を削除
対象セル.Characters(4, 1000).Delete
    ' または
対象セル.Characters(4, 1000).Text = ""

第2引数は元の文字列の長さをオーバーしてよいので、
1000や9999で「以降」を指定することが可能です。

セル内文字列の一部を置換する

' 4~6文字目をABCDに置換
対象セル.Characters(4, 3).Text = "ABCD"

サンプルの通り、文字数は異なっても実行できます。

セル内文字列の途中に文字を挿入する

' 3文字目に"みかん"を挿入
対象セル.Characters(3, 0).Insert "みかん"
    ' または
対象セル.Characters(3, 0).Text = "みかん"

挿入にはInsertメソッドを使用します。

またトリッキーですが、「3文字目から0文字分を置換」でも同じことが実行できます。


Insertを使用するときの注意点として、第2引数は「0」とする必要があります。

対象セル.Characters(3, 1).Insert "みかん"

としてしまうと、
「3文字目を消してからその位置にみかんを挿入」
という置換と挿入を同時実行するような挙動になるため注意してください。

セル内文字列の先頭に文字列を接頭する

' 対象セルの先頭に【重要】を接頭
対象セル.Characters(1, 1).Insert "【重要】"

Insertメソッドを1文字目に対して実行すればテキストの接頭を行えます。

この手の処理は「セル範囲」に対して一括実行出来たら便利だったのですが、
残念ながら単独セルに対してしか実行できません。

セル内文字列の末尾に文字列を追加する

' 対象セルの末尾に(※注)を接頭
対象セル.Characters(Len(対象セル.Valeu), 0).Insert "(※注)"
    ' または
対象セル.Characters(9999, 0).Insert "(※注)"

Insertメソッドは開始位置も文字列の長さを超えてもエラーになりません。

最後尾に文字列を追加したい場合は巨大な値を使ってもOKです。



以上でCharactersプロパティの解説を終わります。

セル内文字列を一部分だけ操作する場合はこのプロパティを使用してください。