セルの文字列は1文字ずつ違う装飾が可能
セルに入力されている文字は、1文字ずつ違うフォントや色などの設定を行うことが出来ます。
ただし1文字ずつ設定できるかどうかには条件があり、セルの表示形式が文字列として認識できる場合に限ります。そのため、数値や会計や日付などの決まった形式の場合は1文字ずつ違う設定を行うことは出来ません。それらの場合はセルの入力値全てに対して同じ装飾をすることになります。
VBAで文字列の一部の文字の設定の取得や変更を行うには、Charactersプロパティを利用します。
Charactersプロパティを使った汎用的な関数を「VBAでセルの指定文字列の色や太さを変更する」で紹介しています。こちらで紹介しているような関数を使うと、以下のように複数ある指定文字列の色や太さを一括で設定することも可能です。
「処理を一定時間ごとに開始します。終了まで待たずに次の処理を開始します。」
↓
「処理を一定時間ごとに開始します。終了まで待たずに次の処理を開始します。」
また、正規表現を利用する方法については「正規表現で一致するセルの文字に色を付ける」で紹介しています。例えば、「処理(.*?)。」で対象文字列を正規表現で指定すると「処理」で始まり「。」で終わる部分が対象になります。
「処理を一定時間ごとに開始します。終了まで待たずに次の処理を開始します。」
↓
「処理を一定時間ごとに開始します。終了まで待たずに次の処理を開始します。」
Charactersプロパティ
1 |
Charactersオブジェクト = Rangeオブジェクト.Charactersプロパティ(Start, Length) |
戻り値のCharactersオブジェクトにはCharactersプロパティ(Start, Length)で取得した文字列の情報が返ります。
同じ名前でややこしいですが、CharactersオブジェクトとCharactersプロパティは別物です。
親オブジェクトにはセル範囲を示すRangeオブジェクトを指定します。対象となるセルは複数選択されていても構いません。
Startは対象となる文字の開始位置を指定します。文字列の一番左の文字を開始位置にする場合は1になります。省略した場合は1とみなされます。
LengthはStartの位置から取得する文字数を指定します。半角文字と全角文字に関わらず1文字は1としてカウントします。省略した場合は開始位置以降の文字を全て対象とします。
Charactersオブジェクトには文字列情報の取得や設定を行うプロパティと、文字列情報の操作を行うメソッドが用意されています。
Charactersオブジェクトのプロパティ
Charactersプロパティ(Start, Length)で取得したCharactersオブジェクトには複数のプロパティがあります。
Charactersオブジェクトは単独では対象の文字に対して処理を行うことができません。そのため各種プロパティを利用して対象の文字に対して処理を行います。
これらの処理を行う、Countプロパティ、Fontプロパティ、Textプロパティ、PhoneticCharactersプロパティについて説明します。
Charactersオブジェクト.Countプロパティ
先に書きますが、Countプロパティにはバグと思われる挙動があるため、文字数を取得する場合はCountプロパティではなくLen関数(Textプロパティ)として取得しましょう。詳細は後述しています。
一応Countプロパティについて説明します。
1 |
Long型の値 = Rangeオブジェクト.Charactersオブジェクト.Countプロパティ |
Countプロパティの戻り値はLong型の数値です。
多くのサイトではCountプロパティの返却値を「文字数」と書いてありますが、実際に動かしてみるとそうではないことが分かります。
Charactersプロパティには前述した通り、StartとLengthの引数がありますが、これらを設定した場合と省略した場合でCountプロパティの値が異なります。省略した場合は文字数を返し、設定した場合はStartと同じ値を返します。
以下は正しく文字数を取得できる場合とそうでない場合のコードです。
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub CharactersCountTest3() Dim iCount As Long '// 文字数 '// A1セルに123abcと入力 Range("A1").Value = "123abc" '// 文字数を6と取得する Debug.Print "Start,Length指定なし:" & Range("A1").Characters.Count '// 文字数を1と取得する(バグ) Debug.Print "Start,Length指定あり:" & Range("A1").Characters(1, 6).Count End Sub |
実行結果
1 2 |
Start,Length指定なし:6 Start,Length指定あり:1 |
個人的にはこれはバグだと考えています。正しく文字数を取得したい場合は、以下のようにLen関数を使ってTextプロパティの文字数を取得します。
1 2 3 4 5 6 7 8 9 |
Sub CharactersCountTest4() Dim iCount As Long '// 文字数 '// こちらは使わない ' iCount = Range("A1").Characters(1, 8).Count '// こちらを使う iCount = Len(Range("A1").Characters(1, 8).Text) End Sub |
Countプロパティのバグについては「CharactersオブジェクトのCountプロパティのバグ回避方法」に詳細を書いています。
Charactersオブジェクト.Fontプロパティ
1 |
Fontオブジェクト = Rangeオブジェクト.Charactersオブジェクト.Fontプロパティ |
Fontプロパティの戻り値はFontオブジェクトです。Charactersオブジェクトの対象文字に設定されているフォントの各設定値の取得や設定を行うことが出来ます。
Fontオブジェクトでは扱う内容が複数あります。詳細については以下をご参照ください。
- セルのフォントの取得と変更
- テーマのフォントの取得と設定
- フォントサイズの取得と設定
- セルの文字列の太字状態の取得と設定と切替
- セルの文字列の斜体(Italic)状態の取得と設定と切替
- セルの文字列の下線状態の取得と設定と切替
- セルの文字列のスタイルの取得と設定
- セルの文字列の指定部分に色を付ける
- セルの文字色の取得と設定
- セルの文字色番号ColorIndexの取得と設定
- セルの文字の上付きの取得と設定
- セルの文字の下付きの取得と設定
- セルの文字の取り消し線の取得と設定
簡単なサンプルは以下になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
Sub CharactersFontTest() Dim r As Range Dim font_A1 As Font Dim font_A2 As Font Dim font_A3 As Font Dim font_A4 As Font Dim font_A5 As Font '// A1からA5セルをセル範囲としてRangeオブジェクト変数に取得する Set r = Range("A1:A5") '// 各セルのFontオブジェクトを取得 Set font_A1 = Range("A1").Font Set font_A2 = Range("A2").Font Set font_A3 = Range("A3").Font Set font_A4 = Range("A4").Font Set font_A5 = Range("A5").Font '// A1からA5セルに入力 r.Value = "abcABC" '// 各セルのFontの各プロパティを設定 font_A1.Name = "MS ゴシック" font_A2.Size = 20 font_A3.Italic = True font_A4.FontStyle = "太字" End Sub |
実行結果
Charactersオブジェクト.Textプロパティ
1 2 3 4 |
'// 取得 String型の値 = Rangeオブジェクト.Charactersオブジェクト.Textプロパティ '// 設定 Rangeオブジェクト.Charactersオブジェクト.Textプロパティ = String型の値 |
Textプロパティの戻り値はString型の文字列になります。
Charactersオブジェクトで対象となる文字列の取得および設定を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Sub CharactersTextTest() Dim c As Characters '// Charactersオブジェクト Dim s As String '// 文字列 '// A1セルに123abcと入力 Range("A1").Value = "123abc" '// 3文字目から4文字目の"3a"をCharactersオブジェクトに格納 Set c = Range("A1").Characters(3, 2) Debug.Print "変更前のA1:" & Range("A1").Text Debug.Print "Charactersオブジェクト変更前:" & c.Text '// 文字列 s = c.Text c.Text = "ZYX987" Debug.Print "変更後のA1:" & Range("A1").Text Debug.Print "Charactersオブジェクト変更後:" & c.Text End Sub |
実行結果
1 2 3 4 |
変更前のA1:123abc Charactersオブジェクト変更前:3a 変更後のA1:12ZYX987bc Charactersオブジェクト変更後:ZY |
このように、Textプロパティへの設定は元のCharactersオブジェクトの文字列の長さに関係なく設定されます。
上のサンプルではCharactersオブジェクトには2文字が入っていますが、Textプロパティで6文字設定しても問題なく処理されます。
Charactersオブジェクト.PhoneticCharactersプロパティ
PhoneticCharactersプロパティはふりがなを取得、設定するプロパティです。
Excelでのふりがなの設定は、ホームタブ→フォント→ふりがなの表示/非表示 で行うことが出来ます。
1 2 3 4 |
'// 取得 String型の値 = Rangeオブジェクト.Charactersオブジェクト.PhoneticCharactersプロパティ '// 設定 Rangeオブジェクト.Charactersオブジェクト.PhoneticCharactersプロパティ = String型の値 |
PhoneticCharactersプロパティの戻り値は文字列になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
Sub CharactersPhoneticCharactersTest() Dim c As Characters '// Charactersオブジェクト Dim s As String '// 文字列 '// A1セルに123abcと入力 Range("A1").Value = "文字列" '// 3文字目から4文字目の"3a"をCharactersオブジェクトに格納 Set c = Range("A1").Characters(1, 3) '// ふりがなを設定 c.PhoneticCharacters = "もじれつ" '// 設定をひらがなに変更 Range("A1").Phonetic.CharacterType = xlHiragana '// もじれつ と出力 Debug.Print c.PhoneticCharacters '// 設定をカタカナに変更 Range("A1").Phonetic.CharacterType = xlKatakana '// モジレツ と出力 Debug.Print c.PhoneticCharacters End Sub |
実行結果
1 2 |
もじれつ モジレツ |
Charactersオブジェクトのメソッド
CharactersオブジェクトのメソッドにはInsertメソッドとDeleteメソッドがあります。
Charactersオブジェクト.Insertメソッド
Insertという名前ですが、実際の処理は指定位置の文字列の置換(Replace)になります。
1 |
Rangeオブジェクト.Charactersオブジェクト.Insertメソッド(String) |
Insertメソッドは設定のみ行います。取得は出来ません。
StringにはCharactersオブジェクトで対象となっている文字列部分を書き換える文字列を指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Sub CharactersInsertTest() Dim c As Characters '// Charactersオブジェクト Dim s As String '// 文字列 '// A1セルに123abcと入力 Range("A1").Value = "123abc" Debug.Print "変更前:" & Range("A1").Value '// 1文字目から3文字目の"123"をCharactersオブジェクトに格納 Set c = Range("A1").Characters(1, 3) '// 置換 Call c.Insert("123に変更") Debug.Print "変更後:" & Range("A1").Value End Sub |
実行結果
1 2 |
変更前:123abc 変更後:123に変更abc |
Charactersオブジェクト.Deleteメソッド
指定部分の文字列を削除します。
1 |
Rangeオブジェクト.Charactersオブジェクト.Deleteメソッド |
Deleteメソッドは削除のみ行います。取得は出来ません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Sub CharactersDeletetTest() Dim c As Characters '// Charactersオブジェクト Dim s As String '// 文字列 '// A1セルに123abcと入力 Range("A1").Value = "123abc" Debug.Print "変更前:" & Range("A1").Value '// 1文字目から3文字目の"123"をCharactersオブジェクトに格納 Set c = Range("A1").Characters(1, 3) '// 削除 Call c.Delete Debug.Print "変更後:" & Range("A1").Value End Sub |
実行結果
1 2 |
変更前:123abc 変更後:abc |