以下の内容はhttps://www.limecode.jp/entry/fungo/061-get-and-set-phoneticより取得しました。


61本目:「ふりがな」の取得と設定

Excel&VBA解説サイト「エクセルの神髄」様出題の問題集、
VBA100本ノック」に対する私の回答と解説のページです。

100本ノックの出題リストはこちらから
excel-ubara.com

出題:「ふりがな」の取得と設定

#VBA100本ノック 61本目
A列の名称には「ふりがな」が正しく入っていません。
「マスタ」シートのA列には「ふりがな」が正しく設定されているので、ここから「ふりがな」を取得しA列に「ふりがな」を設定してください。
マスタなしは赤文字にしてください。(既定の文字色は自動)
※シートは任意

ふりがなの設定

◇ 出題ページはこちら

ソースコード

メインモジュール

Option Explicit

' 100本ノック061:「ふりがな」の取得と設定
Sub ふりがなをマスタから取得する()

    WSdata.Columns(1).Font.Color = False
    WSdata.Columns(1).Phonetic.Visible = True

    Dim R_data As Long
    For R_data = 2 To Get最終行(WSdata)
    
        Dim R_マスタ As Long
        R_マスタ = Match行番号(WSdata.Cells(R_data, 1), WSマスタ.Columns(1))
        
        If R_マスタ = 0 Then
            WSdata.Cells(R_data, 1).Font.Color = vbRed
        Else
            Call ふりがなをコピーする(WSマスタ.Cells(R_マスタ, 1), WSdata.Cells(R_data, 1))
        End If
    
    Next

End Sub

Sub ふりがなをコピーする(コピー元セル As Range, 反映先セル As Range)

    反映先セル.Phonetics.Delete
    
    Dim ふりがな As Phonetics
    For Each ふりがな In コピー元セル.Phonetics
    
        反映先セル.Phonetics.Add ふりがな.Start, ふりがな.Length, ふりがな.Text
    
    Next

End Sub

汎用関数モジュール

Option Explicit

' WorksheetFunctionの短縮取得
' 参考:https://www.limecode.jp/entry/utility/shortcall-worksheetfunction
Function Fx() As WorksheetFunction
    Set Fx = WorksheetFunction
End Function

' 最終行の取得
' 参考:https://www.limecode.jp/entry/library/get-lastrow-lastcolumn
Function Get最終行(指定オブジェクト As Variant, Optional ByVal C As Long = -1) As Long

    ' 渡されたオブジェクトからセル範囲を取得
    Dim 対象セル範囲 As Range
    Select Case TypeName(指定オブジェクト)
    Case "Range"
        If 指定オブジェクト.Cells.CountLarge = 1 Then ' 単独セルにはCurrentRegionを取る
            Set 対象セル範囲 = 指定オブジェクト.CurrentRegion
        Else
            Set 対象セル範囲 = 指定オブジェクト
        End If
    Case "Worksheet"
        Set 対象セル範囲 = 指定オブジェクト.UsedRange
    Case "AutoFilter", "ListObject"
        Set 対象セル範囲 = 指定オブジェクト.Range
    Case Else
        Err.Raise 1000, , "対象外のオブジェクト「" & TypeName(指定オブジェクト) & "」が指定されました。"
    End Select

    ' エリアの最終行を取得
    Get最終行 = 対象セル範囲.Rows.Count + 対象セル範囲.Row - 1

    ' 列が指定されていればその列の入力最終行を取得
    If C <> -1 Then
        Do While 対象セル範囲.Worksheet.Cells(Get最終行, C) = ""
            Get最終行 = Get最終行 - 1
            If Get最終行 < 対象セル範囲.Row Then
                Get最終行 = 0
                Exit Function
            End If
        Loop
    End If

End Function

' 行番号の検索
' ◆ ブログ未掲載
Function Match行番号(ByVal 検索値 As Variant, 検索エリア As Range) As Long
    On Error Resume Next
    If IsDate(検索値) Then
        Dim x: x = CDbl(検索値)
        If Err.Number = 0 Then
            Match行番号 = Fx.Match(CDbl(検索値), 検索エリア, 0) + 検索エリア.Row - 1
            Exit Function
        End If
    End If

    Match行番号 = Fx.Match(検索値, 検索エリア, 0) + 検索エリア.Row - 1

End Function

解説

ふりがなを取得・設定する問題です。


ふりがなを簡単に設定する場合は、以下のコードでも十分です。

反映先セル.Phonetic.Text = コピー元セル.Phonetic.Text

 
しかし、実際のふりがなは↓の画像のように、
ふりがなの設定
どの文字に振られたかなかを情報として持っています。


これも含めて完璧に反映させる場合は、
RangeオブジェクトのPhoneticsコレクション内をループし、
各Phoneticsオブジェクトをひとつずつコピーする必要があります。

Sub ふりがなをコピーする(コピー元セル As Range, 反映先セル As Range)

    反映先セル.Phonetics.Delete
    
    Dim ふりがな As Phonetics
    For Each ふりがな In コピー元セル.Phonetics
    
        反映先セル.Phonetics.Add ふりがな.Start, ふりがな.Length, ふりがな.Text
    
    Next

End Sub

 
実際の業務でふりがなを正確に操作する必要がある方は、
この関数を汎用関数として持っておきましょう。




以上の内容はhttps://www.limecode.jp/entry/fungo/061-get-and-set-phoneticより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14