Excelには便利な機能があって、漢字にフリガナを振ってくれる機能があります。

1

エクセル画面で右クリックをして……

2

「ふりがなの表示」を押すと……

3

こんな感じで自動で振ってくれます。

ところで、HTMLのタグで、<ruby>タグというものを知っていますか?

ルビ(ふりがな)を付ける

HTMLページで、対応しているブラウザではルビを表示してくれるタグです。

例えば「今日」という単語をルビ付きで表示したいときは、

&amp;amp;amp;amp;amp;lt;ruby&amp;amp;amp;amp;amp;gt;今日&amp;amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;amp;gt;(&amp;amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;rt&amp;amp;amp;amp;amp;gt;きょう&amp;amp;amp;amp;amp;lt;/rt&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;amp;gt;)&amp;amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;/ruby&amp;amp;amp;amp;amp;gt;

みたいに長ったらしく記述しなければなりません。

今回は、このExcelのルビをHTMLタグの記述に変換しようという試みです。

ぶっちゃけ大変でした。

最初は関数だけでなんとかなると思ってたんですが、結局ムリで、VBAでマクロ組むしかなかったです。

それでは、マクロのコードがこんな感じです。

Sub OutputScripts()

    '出力準備
    Dim pass As String
    pass = Left(ActiveWorkbook.FullName, Len(ActiveWorkbook.FullName) - Len(ActiveWorkbook.Name))
    pass = pass + &amp;amp;amp;amp;amp;quot;\output.txt&amp;amp;amp;amp;amp;quot;
    Open pass For Output As #1

    'セルを1文字ずつ検証
    Dim x As Integer
    Dim y As Integer
    For y = 2 To 3

        '出力用
        Dim output_text As String
        output_text = &amp;amp;amp;amp;amp;quot;&amp;amp;amp;amp;amp;quot;

        For x = 2 To 4
            'セルのテキスト
            Dim cel_text As String
            cel_text = Cells(y, x)

            'ふりがなの数
            Dim furigana_count As Integer
            furigana_count = Cells(y, x).Phonetics.Count

            'もし0個なら
            If furigana_count = 0 Then
                'そのまま格納
                output_text = output_text &amp;amp;amp;amp;amp;amp; &amp;amp;amp;amp;amp;quot;&amp;amp;amp;amp;amp;quot;&amp;amp;amp;amp;amp;quot;&amp;amp;amp;amp;amp;quot; &amp;amp;amp;amp;amp;amp; cel_text &amp;amp;amp;amp;amp;amp; &amp;amp;amp;amp;amp;quot;&amp;amp;amp;amp;amp;quot;&amp;amp;amp;amp;amp;quot;,&amp;amp;amp;amp;amp;quot;
            Else
                '検証文字の位置
                Dim pos As Integer
                pos = 1

                '変換後の文字列
                Dim update_text As String
                update_text = &amp;amp;amp;amp;amp;quot;&amp;amp;amp;amp;amp;quot;

                'for文をまわす
                For daf = 1 To furigana_count
                    'ふりがなと位置と文字数取得
                    Dim start_num As Integer
                    Dim end_num As Integer
                    start_num = Cells(y, x).Phonetics(daf).start
                    end_num = Cells(y, x).Phonetics(daf).Length

                    '漢字以外の文字をきりとる
                    Dim other As Integer
                    other = start_num - pos
                    update_text = update_text &amp;amp;amp;amp;amp;amp; Mid(cel_text, pos, other)

                    'もとの漢字
                    Dim kanzi As String
                    kanzi = Mid(cel_text, start_num, end_num)
                    'ふりがな
                    Dim furigana As String
                    furigana = Cells(y, x).Phonetics(daf).Text

                    update_text = update_text &amp;amp;amp;amp;amp;amp; &amp;amp;amp;amp;amp;quot;&amp;amp;amp;amp;amp;lt;ruby&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;quot; &amp;amp;amp;amp;amp;amp; kanzi &amp;amp;amp;amp;amp;amp; &amp;amp;amp;amp;amp;quot;&amp;amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;amp;gt;(&amp;amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;rt&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;quot; &amp;amp;amp;amp;amp;amp; furigana &amp;amp;amp;amp;amp;amp; &amp;amp;amp;amp;amp;quot;&amp;amp;amp;amp;amp;lt;/rt&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;amp;gt;)&amp;amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;/ruby&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;quot;

                    '位置記録
                    pos = start_num + end_num
                Next daf

                '残りの文字
                Dim nokori_num As Integer
                nokori_num = Len(cel_text) - pos + 1
                update_text = update_text &amp;amp;amp;amp;amp;amp; Mid(cel_text, pos, nokori_num)

                '変換して格納
                output_text = output_text &amp;amp;amp;amp;amp;amp; &amp;amp;amp;amp;amp;quot;&amp;amp;amp;amp;amp;quot;&amp;amp;amp;amp;amp;quot;&amp;amp;amp;amp;amp;quot; &amp;amp;amp;amp;amp;amp; update_text &amp;amp;amp;amp;amp;amp; &amp;amp;amp;amp;amp;quot;&amp;amp;amp;amp;amp;quot;&amp;amp;amp;amp;amp;quot;,&amp;amp;amp;amp;amp;quot;
            End If
        Next x

        '出力
        Print #1, output_text

    Next y

    'ファイルクローズ
    Close #1

End Sub

xとyという変数で2重のfor文を回すことで、セルを順番に検証しています。
Cells(y, x).Phonetics(daf).start という記述で、フリガナが振られた漢字の位置が特定でき、
Cells(y, x).Phonetics(daf).Length という記述で、フリガナが振られた漢字数が特定できます。

あとは、文字列の切り取りや連結を駆使して、最終的に変換したい形へ近づけていくだけです。

このマクロを再生すると、こういうテキストファイルが生成されます。

4

&amp;amp;amp;amp;amp;quot;こんにちは! &amp;amp;amp;amp;amp;lt;ruby&amp;amp;amp;amp;amp;gt;今日&amp;amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;amp;gt;(&amp;amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;rt&amp;amp;amp;amp;amp;gt;キョウ&amp;amp;amp;amp;amp;lt;/rt&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;amp;gt;)&amp;amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;/ruby&amp;amp;amp;amp;amp;gt;はいい&amp;amp;amp;amp;amp;lt;ruby&amp;amp;amp;amp;amp;gt;天気&amp;amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;amp;gt;(&amp;amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;rt&amp;amp;amp;amp;amp;gt;テンキ&amp;amp;amp;amp;amp;lt;/rt&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;amp;gt;)&amp;amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;/ruby&amp;amp;amp;amp;amp;gt;ですね!&amp;amp;amp;amp;amp;quot;,&amp;amp;amp;amp;amp;quot;&amp;amp;amp;amp;amp;lt;ruby&amp;amp;amp;amp;amp;gt;日差&amp;amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;amp;gt;(&amp;amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;rt&amp;amp;amp;amp;amp;gt;ヒザ&amp;amp;amp;amp;amp;lt;/rt&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;amp;gt;)&amp;amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;/ruby&amp;amp;amp;amp;amp;gt;しが&amp;amp;amp;amp;amp;lt;ruby&amp;amp;amp;amp;amp;gt;温&amp;amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;amp;gt;(&amp;amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;rt&amp;amp;amp;amp;amp;gt;アタタ&amp;amp;amp;amp;amp;lt;/rt&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;amp;gt;)&amp;amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;/ruby&amp;amp;amp;amp;amp;gt;かくて、とても&amp;amp;amp;amp;amp;lt;ruby&amp;amp;amp;amp;amp;gt;気持&amp;amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;amp;gt;(&amp;amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;rt&amp;amp;amp;amp;amp;gt;キモ&amp;amp;amp;amp;amp;lt;/rt&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;amp;gt;)&amp;amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;/ruby&amp;amp;amp;amp;amp;gt;ちいい!&amp;amp;amp;amp;amp;quot;,&amp;amp;amp;amp;amp;quot;こんな&amp;amp;amp;amp;amp;lt;ruby&amp;amp;amp;amp;amp;gt;日&amp;amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;amp;gt;(&amp;amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;rt&amp;amp;amp;amp;amp;gt;ヒ&amp;amp;amp;amp;amp;lt;/rt&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;amp;gt;)&amp;amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;/ruby&amp;amp;amp;amp;amp;gt;はお&amp;amp;amp;amp;amp;lt;ruby&amp;amp;amp;amp;amp;gt;散歩&amp;amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;amp;gt;(&amp;amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;rt&amp;amp;amp;amp;amp;gt;サンポ&amp;amp;amp;amp;amp;lt;/rt&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;amp;gt;)&amp;amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;/ruby&amp;amp;amp;amp;amp;gt;でもして、のんびり&amp;amp;amp;amp;amp;lt;ruby&amp;amp;amp;amp;amp;gt;過&amp;amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;amp;gt;(&amp;amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;rt&amp;amp;amp;amp;amp;gt;ス&amp;amp;amp;amp;amp;lt;/rt&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;amp;gt;)&amp;amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;/ruby&amp;amp;amp;amp;amp;gt;ごしたいですね。&amp;amp;amp;amp;amp;quot;,
&amp;amp;amp;amp;amp;quot;うめぼしたべたい&amp;amp;amp;amp;amp;quot;,&amp;amp;amp;amp;amp;quot;うめぼしたべたい&amp;amp;amp;amp;amp;lt;ruby&amp;amp;amp;amp;amp;gt;僕&amp;amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;amp;gt;(&amp;amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;rt&amp;amp;amp;amp;amp;gt;ボク&amp;amp;amp;amp;amp;lt;/rt&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;amp;gt;)&amp;amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;/ruby&amp;amp;amp;amp;amp;gt;は&amp;amp;amp;amp;amp;quot;,&amp;amp;amp;amp;amp;quot;&amp;amp;amp;amp;amp;lt;ruby&amp;amp;amp;amp;amp;gt;今&amp;amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;amp;gt;(&amp;amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;rt&amp;amp;amp;amp;amp;gt;イマ&amp;amp;amp;amp;amp;lt;/rt&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;amp;gt;)&amp;amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;/ruby&amp;amp;amp;amp;amp;gt;すぐ&amp;amp;amp;amp;amp;lt;ruby&amp;amp;amp;amp;amp;gt;君&amp;amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;amp;gt;(&amp;amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;rt&amp;amp;amp;amp;amp;gt;キミ&amp;amp;amp;amp;amp;lt;/rt&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;amp;gt;)&amp;amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;/ruby&amp;amp;amp;amp;amp;gt;に&amp;amp;amp;amp;amp;lt;ruby&amp;amp;amp;amp;amp;gt;逢&amp;amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;amp;gt;(&amp;amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;rt&amp;amp;amp;amp;amp;gt;ア&amp;amp;amp;amp;amp;lt;/rt&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;amp;gt;)&amp;amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;/ruby&amp;amp;amp;amp;amp;gt;いたい&amp;amp;amp;amp;amp;quot;,

これで、だいぶ互換性の高い文字列になるんじゃないでしょうか。

Post Navigation