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;,
これで、だいぶ互換性の高い文字列になるんじゃないでしょうか。