Excelには便利な機能があって、漢字にフリガナを振ってくれる機能があります。
エクセル画面で右クリックをして……
「ふりがなの表示」を押すと……
こんな感じで自動で振ってくれます。
ところで、HTMLのタグで、<ruby>タグというものを知っていますか?
HTMLページで、対応しているブラウザではルビを表示してくれるタグです。
例えば「今日」という単語をルビ付きで表示したいときは、
&amp;amp;amp;amp;lt;ruby&amp;amp;amp;amp;gt;今日&amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;gt;(&amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;rt&amp;amp;amp;amp;gt;きょう&amp;amp;amp;amp;lt;/rt&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;gt;)&amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;/ruby&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;quot;\output.txt&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;quot;&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;quot;&amp;amp;amp;amp;quot;&amp;amp;amp;amp;quot;&amp;amp;amp;amp;quot; &amp;amp;amp;amp;amp; cel_text &amp;amp;amp;amp;amp; &amp;amp;amp;amp;quot;&amp;amp;amp;amp;quot;&amp;amp;amp;amp;quot;,&amp;amp;amp;amp;quot; Else '検証文字の位置 Dim pos As Integer pos = 1 '変換後の文字列 Dim update_text As String update_text = &amp;amp;amp;amp;quot;&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; 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;quot;&amp;amp;amp;amp;lt;ruby&amp;amp;amp;amp;gt;&amp;amp;amp;amp;quot; &amp;amp;amp;amp;amp; kanzi &amp;amp;amp;amp;amp; &amp;amp;amp;amp;quot;&amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;gt;(&amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;rt&amp;amp;amp;amp;gt;&amp;amp;amp;amp;quot; &amp;amp;amp;amp;amp; furigana &amp;amp;amp;amp;amp; &amp;amp;amp;amp;quot;&amp;amp;amp;amp;lt;/rt&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;gt;)&amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;/ruby&amp;amp;amp;amp;gt;&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; Mid(cel_text, pos, nokori_num) '変換して格納 output_text = output_text &amp;amp;amp;amp;amp; &amp;amp;amp;amp;quot;&amp;amp;amp;amp;quot;&amp;amp;amp;amp;quot;&amp;amp;amp;amp;quot; &amp;amp;amp;amp;amp; update_text &amp;amp;amp;amp;amp; &amp;amp;amp;amp;quot;&amp;amp;amp;amp;quot;&amp;amp;amp;amp;quot;,&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 という記述で、フリガナが振られた漢字数が特定できます。
あとは、文字列の切り取りや連結を駆使して、最終的に変換したい形へ近づけていくだけです。
このマクロを再生すると、こういうテキストファイルが生成されます。
&amp;amp;amp;amp;quot;こんにちは! &amp;amp;amp;amp;lt;ruby&amp;amp;amp;amp;gt;今日&amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;gt;(&amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;rt&amp;amp;amp;amp;gt;キョウ&amp;amp;amp;amp;lt;/rt&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;gt;)&amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;/ruby&amp;amp;amp;amp;gt;はいい&amp;amp;amp;amp;lt;ruby&amp;amp;amp;amp;gt;天気&amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;gt;(&amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;rt&amp;amp;amp;amp;gt;テンキ&amp;amp;amp;amp;lt;/rt&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;gt;)&amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;/ruby&amp;amp;amp;amp;gt;ですね!&amp;amp;amp;amp;quot;,&amp;amp;amp;amp;quot;&amp;amp;amp;amp;lt;ruby&amp;amp;amp;amp;gt;日差&amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;gt;(&amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;rt&amp;amp;amp;amp;gt;ヒザ&amp;amp;amp;amp;lt;/rt&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;gt;)&amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;/ruby&amp;amp;amp;amp;gt;しが&amp;amp;amp;amp;lt;ruby&amp;amp;amp;amp;gt;温&amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;gt;(&amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;rt&amp;amp;amp;amp;gt;アタタ&amp;amp;amp;amp;lt;/rt&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;gt;)&amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;/ruby&amp;amp;amp;amp;gt;かくて、とても&amp;amp;amp;amp;lt;ruby&amp;amp;amp;amp;gt;気持&amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;gt;(&amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;rt&amp;amp;amp;amp;gt;キモ&amp;amp;amp;amp;lt;/rt&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;gt;)&amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;/ruby&amp;amp;amp;amp;gt;ちいい!&amp;amp;amp;amp;quot;,&amp;amp;amp;amp;quot;こんな&amp;amp;amp;amp;lt;ruby&amp;amp;amp;amp;gt;日&amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;gt;(&amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;rt&amp;amp;amp;amp;gt;ヒ&amp;amp;amp;amp;lt;/rt&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;gt;)&amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;/ruby&amp;amp;amp;amp;gt;はお&amp;amp;amp;amp;lt;ruby&amp;amp;amp;amp;gt;散歩&amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;gt;(&amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;rt&amp;amp;amp;amp;gt;サンポ&amp;amp;amp;amp;lt;/rt&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;gt;)&amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;/ruby&amp;amp;amp;amp;gt;でもして、のんびり&amp;amp;amp;amp;lt;ruby&amp;amp;amp;amp;gt;過&amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;gt;(&amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;rt&amp;amp;amp;amp;gt;ス&amp;amp;amp;amp;lt;/rt&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;gt;)&amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;/ruby&amp;amp;amp;amp;gt;ごしたいですね。&amp;amp;amp;amp;quot;, &amp;amp;amp;amp;quot;うめぼしたべたい&amp;amp;amp;amp;quot;,&amp;amp;amp;amp;quot;うめぼしたべたい&amp;amp;amp;amp;lt;ruby&amp;amp;amp;amp;gt;僕&amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;gt;(&amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;rt&amp;amp;amp;amp;gt;ボク&amp;amp;amp;amp;lt;/rt&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;gt;)&amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;/ruby&amp;amp;amp;amp;gt;は&amp;amp;amp;amp;quot;,&amp;amp;amp;amp;quot;&amp;amp;amp;amp;lt;ruby&amp;amp;amp;amp;gt;今&amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;gt;(&amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;rt&amp;amp;amp;amp;gt;イマ&amp;amp;amp;amp;lt;/rt&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;gt;)&amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;/ruby&amp;amp;amp;amp;gt;すぐ&amp;amp;amp;amp;lt;ruby&amp;amp;amp;amp;gt;君&amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;gt;(&amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;rt&amp;amp;amp;amp;gt;キミ&amp;amp;amp;amp;lt;/rt&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;gt;)&amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;/ruby&amp;amp;amp;amp;gt;に&amp;amp;amp;amp;lt;ruby&amp;amp;amp;amp;gt;逢&amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;gt;(&amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;rt&amp;amp;amp;amp;gt;ア&amp;amp;amp;amp;lt;/rt&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;rp&amp;amp;amp;amp;gt;)&amp;amp;amp;amp;lt;/rp&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;/ruby&amp;amp;amp;amp;gt;いたい&amp;amp;amp;amp;quot;,
これで、だいぶ互換性の高い文字列になるんじゃないでしょうか。