【VBA】ふりがなを別のセルから取得してルビを表示するサンプルコード

名簿リストなどでは、上の表のように、「氏名(漢字)」と「ふりがな」を別の列で管理することが多いのではないでしょうか?

そして、漢字の氏名の上にふりがなをルビ表示する必要がたまに出てきたりします。

このページでは、そんなときに一発で正しいルビを表示させるコードを紹介します。

コードは少し長いですが、ほんの数行の修正で簡単に使えるよう部品化してあるので、ぜひ使ってみてください。

目次

VBAで処理する必要性について

Excelの基本機能でも、漢字にルビを表示させること自体は簡単にできます。

しかし、基本機能から漢字にルビを表示させた場合、表示されるのはその漢字を入力したときの「かな」です。

例えば、「神野(こうの)」を「かみの」と入力して変換した場合、表示されるルビは「かみの」となります。「こうの」とは表示してくれません。

また、WEBページからコピペしたような文字列は基本的に「かな」情報が含まれておらず、ルビは表示できません。

このため、上の表のように「ふりがな」を管理している列があるなら、そのふりがなをそのまま利用するのが合理的です。

そうすれば、ルビが間違っていないかすべてチェックしたり、正しく表示されていないルビを修正する作業はいらなくなるからです。

そして、別のセルのふりがなをルビに表示させることは、Excelの基本機能や関数ではできません。

これらを踏まえると、やはりVBAで処理する意義は大きいと言えます。

サンプルコード(一括処理)

それではさっそくサンプルコードを紹介します。

Sub ふりがな_一括取得()
'指定範囲の文字列に、別の列に入力したふりがなを順に取得
    
    '変数宣言
    Dim ShName As String, Clm1 As Variant, Clm2 As Variant, Row1 As Long
    Dim CType As String, Align As String, FName As String, FSize As Long, FCIdx As Long
    
    '◆◆◆◆◆ユーザー定義部分(必須)◆◆◆◆◆
    ShName = "サンプル名簿" '対象シート名
    Clm1 = "C" '処理列:"A" or 1
    Clm2 = "D" 'ふりがな入力列:"A" or 1
    Row1 = 3 '処理範囲の先頭行
    '◆◆◆◆◆ユーザー定義部分(必須)◆◆◆◆◆
    
    '◇◇◇◇◇ユーザー定義部分(任意)◇◇◇◇◇
    CType = xlHiragana 'ふりがなの種類 ※1
    Align = xlPhoneticAlignLeft 'ふりがなの配置 ※2
    FName = "MS P明朝" 'フォント名
    FSize = 7 'ふりがなのフォントサイズ
    FCIdx = 1 'ふりがなのフォントカラー(インデックス指定) ※3
    '◇◇◇◇◇ユーザー定義部分(任意)◇◇◇◇◇
    
    '※1 xlHiragana(かな)/xlKatakana(カナ)/xlKatakanaHalf(カナ)
    '※2 xlPhoneticAlignLeft(左揃え)/XlPhoneticAlignCenter(中央揃え)/xlPhoneticAlignDistributed(均等割付)
    '   xlPhoneticAlignNoControl(ひらがな・カタカナにもルビを表示)
    '※3 1(黒)/3(赤)/5(青)

    '対象シートを選択
    ThisWorkbook.Activate
    Sheets(ShName).Activate
    
    '氏名最終行の取得(数式空欄を無視)
    Dim LR1 As Long
    For LR1 = Cells(Rows.Count, Clm1).End(xlUp).Row To 1 Step -1
        If Cells(LR1, Clm1) <> "" Then Exit For
    Next LR1
    
    'ループ処理
    Dim i1 As Long
    For i1 = 1 To LR1 - Row1 - 1
    
        '漢字・ふりがなセルがともに空欄でない場合のみ処理
        If Cells(Row1 - 1 + i1, Clm1) <> "" And Cells(Row1 - 1 + i1, Clm2) <> "" Then
            
            'フリガナ列の入力値を取得
            Cells(Row1 - 1 + i1, Clm1).Characters.PhoneticCharacters = Cells(Row1 - 1 + i1, Clm2)
        
            'ふりがな設定を反映
            With Cells(Row1 - 1 + i1, Clm1).Phonetic
                .Visible = True 'ふりがな表示
                .CharacterType = CType '種類
                .Alignment = Align '配置
                .Font.Name = FName 'フォント
                .Font.Size = FSize 'フォントサイズ
                .Font.ColorIndex = FCIdx 'フォントカラー
            End With
        
        End If
        
    Next i1
    
    'カーソルを先頭セルに戻す
    Cells(Row1, Clm1).Activate
    
End Sub

少し長いコードですが、必ず変更が必要なのは4行だけです。

具体的には「ユーザー定義部分(必須)」として指定されているブロックです。

必ず変更が必要な箇所について

コード内のコメント見ていただくだけでわかるとは思いますが、念のため各変数の指定方法について、簡単に解説します。

ShName = “サンプル名簿”

「ShName」には処理対象となるシート名を指定してください。

Clm1 = “C”  ’⇐漢字が入力されている列

Clm2 = “D”  ’⇐ふりがなが入力されている列

「Clm1」には漢字が入力されている列、「Clm2」にはふりがなの入力されている列を指定します。

指定方法は、「アルファベット」でも「列番号」でもかまいません。

注意点としては、アルファベットで指定する場合は「”A”」のように””で囲むこと。

また、列番号で指定する場合は 「1」のように整数で指定します。こちらは「””」を付けてはいけません。

Row1 = 3

「Row1」には処理開始行番号を指定します。

リストの入力が始まっている行番号であり、間違ってタイトル行を指定しないよう注意してください。

以上の4行を変更したら、一度実行してみてください。

正しく変更されていれば、漢字にルビが表示されているはずです。

※ 必ずバックアップを取ってから実行してください。

ルビの書式設定の変更方法

ここからは任意の修正箇所となります。

「ユーザー定義部分(任意)」ブロックで、ルビの書式設定を変更できます。

CType = xlHiragana ‘ふりがなの種類

「CType」にはふりがなの種類を指定しています。次の3種類があります。

  • xlHiragana:ひらがな
  • xlKatakana:カタカナ
  • xlKatakanaHalf:半角カタカナ

Align = xlPhoneticAlignLeft ‘ふりがなの配置

「Align」にはふりがなの配置を指定しています。次の4種類があります。

  • xlPhoneticAlignLeft:左揃え
  • XlPhoneticAlignCenter:中央揃え
  • xlPhoneticAlignDistributed:均等割付
  • xlPhoneticAlignNoControl:ひらがな・カタカナにもルビを表示

FName = “MS P明朝” ‘フォント名

「FName」にはフォント名を指定しています。フォント名は「””」で囲って指定します。

フォント名を手打ちすると間違えやすいので、セルの書式設定などで選択できるフォント名をコピペすると確実です。

FSize = 7 ‘ふりがなのフォントサイズ

「FSize」にはフォントサイズを指定しています。数値で指定してやります。

FCIdx = 1 ‘ふりがなのフォントカラー(インデックス指定)

「FCIdx」にはルビの文字色を指定しています。

VBAでの文字色の指定方法はいろいろあるのですが、ルビに複雑な色を指定することはあまり考えにくいので、シンプルなインデックス番号で指定するようにしています。

インデックス番号での指定は、黒は「1」、赤は「3」、青は「5」のような整数指定で覚えやすいのがメリットです。

サンプルコード(入力時の個別処理)

さきほど記載したサンプルコードは入力済みのリストに対して、一括で変更を行うコードです。

対して、こちらはシートイベントを利用することで、文字入力などを処理のトリガーとし、変更のあったセルに個別にルビを設定していくものになります。

また、コードは「シートモジュール」と「標準モジュール」に分けて記載するようにしていますので、貼り付ける場所にご注意ください。

シートモジュール用サンプルコード

次のコードを対象シートの「シートモジュール」に貼り付けてください。

Private Sub Worksheet_Change(ByVal Target As Range)

    '動作範囲の限定
    Dim Rng As Range
    Set Rng = Range("C3:C52, D3:D52") '◆ここに動作範囲を指定

    If Not Intersect(Target, Rng) Is Nothing Then
        On Error Resume Next
        Call ふりがな_個別取得(Target) '処理(標準モジュールから呼び出し)
    End If

End Sub

このコードでは、どのセル範囲に変更があったときに処理を行うか、動作範囲を指定しています。

次の部分がその動作範囲の指定になるので、必ず変更してください。

Set Rng = Range(“C3:C52, D3:D52”) ‘◆ここに動作範囲を指定

この例では、「漢字」と「ふりがな」の列を両方とも動作範囲として指定しています。

紹介しているサンプルコード(処理本体側)は、「漢字」と「ふりがな」が両方入力されていなければ処理が始まらないようにしているため、「漢字」と「ふりがな」の列を両方指定しておくのが無難です。

なお、冒頭に掲載している表のように、漢字列とふりがな列が隣接している場合は「Range(“C3:D52”)」で両方の範囲が指定できます。

このあたりはそれぞれの事情に応じて、好みでカスタマイズしてください。

標準モジュール用サンプルコード

こちらが処理本体のコードになります。

こちらは「標準モジュール」に貼り付けて、必要箇所を変更します。

Sub ふりがな_個別取得(ByVal Target As Range)
'シートイベントと組み合わせて変更セルのふりがなを取得(動作範囲はシートイベントで指定)
    
    '変数宣言
    Dim ShName As String, Clm1 As Variant, Clm2 As Variant
    Dim CType As String, Align As String, FName As String, FSize As Long, FCIdx As Long
    
    '◆◆◆◆◆ユーザー定義部分(必須)◆◆◆◆◆
    ShName = "サンプル名簿" '対象シート名
    Clm1 = "C" '処理列:"A" or 1
    Clm2 = "D" 'ふりがな入力列:"A" or 1
    '◆◆◆◆◆ユーザー定義部分(必須)◆◆◆◆◆
    
    '◇◇◇◇◇ユーザー定義部分(任意)◇◇◇◇◇
    CType = xlHiragana 'ふりがなの種類 ※1
    Align = xlPhoneticAlignLeft 'ふりがなの配置 ※2
    FName = "MS P明朝" 'フォント名
    FSize = 7 'ふりがなのフォントサイズ
    FCIdx = 1 'ふりがなのフォントカラー(インデックス指定) ※3
    '◇◇◇◇◇ユーザー定義部分(任意)◇◇◇◇◇
    
    '※1 xlHiragana(かな)/xlKatakana(カナ)/xlKatakanaHalf(カナ)
    '※2 xlPhoneticAlignLeft(左揃え)/XlPhoneticAlignCenter(中央揃え)/xlPhoneticAlignDistributed(均等割付)
    '   xlPhoneticAlignNoControl(ひらがな・カタカナにもルビを表示)
    '※3 1(黒)/3(赤)/5(青)
    
    '対象シートを選択
    ThisWorkbook.Activate
    Sheets(ShName).Activate
    
    '選択行の取得
    Dim SR1 As Long
    SR1 = Target.Row
    
    '漢字・ふりがなセルがともに空欄でない場合のみ処理
    If Cells(SR1, Clm1) <> "" And Cells(SR1, Clm2) <> "" Then
        
        'フリガナ列の入力値を取得
        Cells(SR1, Clm1).Characters.PhoneticCharacters = Cells(SR1, Clm2)
        
        '選択行の氏名にふりがな設定を反映
        With Cells(SR1, Clm1).Phonetic
            .Visible = True 'ふりがな表示
            .CharacterType = CType '種類
            .Alignment = Align '配置
            .Font.Name = FName 'フォント
            .Font.Size = FSize 'フォントサイズ
            .Font.ColorIndex = FCIdx 'フォントカラー
        End With
        
    End If
      
End Sub

変更が必要な箇所と注意事項は、最初に記載した一括処理のサンプルコードと同じです。

コメントを見ればだいたいわかると思いますが、必要に応じて先の解説をご覧ください。

なお、こちらのコードは開始行の指定が不要なため、「Row1」という変数は使用しません。

まとめ

このページでは、漢字の氏名などに、別セルで管理している「ふりがな」をルビ表示するサンプルコードを紹介させていただきました。

コードは少し長いですが、変更箇所は数行で済むように部品化していますので、VBAに詳しくない方でも簡単に組み込めると思います。

今回紹介したコードを収めたサンプルファイルは次のボタンからダウンロードできます。

必要に応じてご利用ください。

サンプルファイルのダウンロード

おまけコーナーについて

ふりがなの取得を省略し、単にセル範囲にルビを設定したり、ルビ設定を一括変更するだけなら、もっと処理速度の早い方法があります。

興味のある方は以下のおまけコーナーをご覧ください。

【おまけ1】指定範囲に一括でルビ設定を行うサンプルコード

今回、最初に紹介した一括処理コードは、For~Nextによるループ処理で、漢字列のセルを上から順に1つずつ処理しています。

セルに入力してある「ふりがな」を利用する場合、基本的にはこの方法で行う必要があります。

しかし、ふりがなの取得はせず、指定範囲に一括でルビ設定を施したり、すでに設定されている設定を一括変更するという書式設定だけなら、もっと処理速度の早い方法があります。

次のサンプルコードは、セル1つずつに処理をしていくのではなく、指定範囲に一括処理をする形で記載したものです。

Sub ルビ設定_一括指定()
'指定範囲のルビ設定を一括指定・変更

    '変数宣言
    Dim ShName As String, Clm1 As Variant, Clm2 As Variant, Row1 As Long
    Dim CType As String, Align As String, FName As String, FSize As Long, FCIdx As Long
    
    '◆◆◆◆◆ユーザー定義部分(必須)◆◆◆◆◆
    ShName = "サンプル名簿" '対象シート名
    Clm1 = "C" '処理列:"A" or 1
    Clm2 = "D" 'ふりがな入力列:"A" or 1
    Row1 = 3 '処理範囲の先頭行
    '◆◆◆◆◆ユーザー定義部分(必須)◆◆◆◆◆
    
    '◇◇◇◇◇ユーザー定義部分(任意)◇◇◇◇◇
    CType = xlHiragana 'ふりがなの種類 ※1
    Align = xlPhoneticAlignLeft 'ふりがなの配置 ※2
    FName = "MS P明朝" 'フォント名
    FSize = 7 'ふりがなのフォントサイズ
    FCIdx = 1 'ふりがなのフォントカラー(インデックス指定) ※3
    '◇◇◇◇◇ユーザー定義部分(任意)◇◇◇◇◇
    
    '※1 xlHiragana(かな)/xlKatakana(カナ)/xlKatakanaHalf(カナ)
    '※2 xlPhoneticAlignLeft(左揃え)/XlPhoneticAlignCenter(中央揃え)/xlPhoneticAlignDistributed(均等割付)
    '   xlPhoneticAlignNoControl(ひらがな・カタカナにもルビを表示)
    '※3 1(黒)/3(赤)/5(青)

    '対象シートを選択
    ThisWorkbook.Activate
    Sheets(ShName).Activate
    
    '氏名最終行の取得(数式空欄を無視)
    Dim LR1 As Long
    For LR1 = Cells(Rows.Count, Clm1).End(xlUp).Row To 1 Step -1
        If Cells(LR1, Clm1) <> "" Then Exit For
    Next LR1
    
    '処理範囲の書式統一(範囲処理する場合は書式を統一しないとエラーが発生する)
    Cells(Row1, Clm1).Copy
    Range(Cells(Row1 + 1, Clm1), Cells(LR1, Clm1)).PasteSpecial Paste:=xlPasteFormats
    Application.CutCopyMode = False
    Cells(Row1, Clm1).Select '選択範囲解除
    
    '処理範囲にルビ設定を反映
    With Range(Cells(Row1, Clm1), Cells(LR1, Clm1)).Phonetic
        .Visible = True 'ふりがな表示
        .CharacterType = CType '種類
        .Alignment = Align '配置
        .Font.Name = FName 'フォント
        .Font.Size = FSize 'フォントサイズ
        .Font.ColorIndex = FCIdx 'フォントカラー
    End With
    
End Sub

こちらも「ユーザー定義部分」の変更を忘れないようご注意ください。

なお、セル範囲のルビ設定を変更することは、Excelの基本機能でも可能です。

しかし、例えば次のようなシートイベントと組み合わせて設置しておけば、指定範囲のセルに変更が生じるたび、瞬時に書式を再設定することができます。

つまり、常に指定範囲のルビ設定が崩れない強固なフォーマットを作ることができるわけです。

Private Sub Worksheet_Change(ByVal Target As Range)

    '動作範囲の限定
    Dim Rng As Range
    Set Rng = Range("C3:D52") '◆ここに動作範囲を指定

    If Not Intersect(Target, Rng) Is Nothing Then
        On Error Resume Next
        ルビ設定_一括指定 '処理(標準モジュールから呼び出し)
    End If

End Sub

※ 対象シートの「シートモジュール」に貼り付けて、動作範囲を要変更

【おまけ2】指定範囲のルビ設定を解除するサンプルコード

最後に、ルビ設定を一括で解除するコードです。

次のコードを実行すれば、指定範囲のルビ設定をすべて解除できます。

Sub ルビ_非表示()
'指定範囲のルビを一括非表示

    '変数宣言
    Dim ShName As String, Clm1 As Variant, Row1 As Long
    
    '◆◆◆◆◆ユーザー設定部分◆◆◆◆◆
    ShName = "サンプル名簿" '対象シート名
    Clm1 = "C" 'ふりがな設定する列:"A" or 1
    Row1 = 3 'ふりがな設定する列の先頭行
    '◆◆◆◆◆ユーザー設定部分◆◆◆◆◆

    '対象シートを選択
    ThisWorkbook.Activate
    Sheets(ShName).Activate
    
    '氏名最終行の取得(数式空欄を無視)
    Dim LR1 As Long
    For LR1 = Cells(Rows.Count, Clm1).End(xlUp).Row To 1 Step -1
        If Cells(LR1, Clm1) <> "" Then Exit For
    Next LR1
    
    '処理範囲の書式統一(範囲処理する場合は書式を統一しないとエラーが発生する)
    Cells(Row1, Clm1).Copy
    Range(Cells(Row1 + 1, Clm1), Cells(LR1, Clm1)).PasteSpecial Paste:=xlPasteFormats
    Application.CutCopyMode = False
    Cells(Row1, Clm1).Activate '選択範囲解除
    
    '処理範囲のルビを非表示
    Range(Cells(Row1, Clm1), Cells(LR1, Clm1)).Phonetic.Visible = False

End Sub

ルビ書式を範囲指定して処理するときの注意点

おまけコーナーでは、For~Nextで1セルずつループ処理するのではなく、セル範囲を指定して一括で設定したり、解除するサンプルコードを紹介しました。

この処理を行う上で1点だけポイントがあるのでご紹介しておきます。

それは、処理範囲の書式が統一されていないとエラーが発生することです。

そのため、サンプルコードでは次の2行で、ルビ設定をする前に書式の統一を図っています。

Cells(Row1, Clm1).Copy
Range(Cells(Row1 + 1, Clm1), Cells(LR1, Clm1)).PasteSpecial Paste:=xlPasteFormats

過去に、ルビ設定を行うコードを使っていたところ、ときどきエラーが発生することがありました。

その原因を探ってみたところ、処理範囲の書式が異なるとエラーが発生することがわかりました。

当時、ネットで調べても明確な情報を見つけられなかったのですが、処理範囲の書式統一を行ったところ、エラーが発生することはなくなりました。

もちろん、For~Nextの方法で1セルずつ処理すれば、このようなエラーは発生しません。

しかし、処理件数(セルの数)が多くなると、処理時間に大幅な差が出てきます。

このあたりはループ処理ではなく、範囲処理のアドバンテージが感じられる部分ですね。

長くなってしまいしたが、今回は以上です。

最後まで読んでいただきどうもありがとうございました。

誰かの参考になれば幸いです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次