Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
HTML特殊文字の英単語発音記号をEXCELのセルに表示する方法を教えて下さい。
投稿日時: 18/01/09 21:41:49
投稿者: ユニとウィル

(この質問では特殊な文字を使っているので、意図したように表示されないかもしれません)
 
インターネットの英和辞典に英単語の発音記号が載っています。
これを使ってEXCELで自分なりの受験用英単語帳を作っています。
 
ブラウザ画面で発音記号の部分をマウスで選んでコピーし、EXCELに貼り付けすればそのまま表示させることができます。
しかし単語の数が多いので手作業のコピペはとても手間と時間がかかります。
 
そこで、各単語のページソースをAPI関数のURLDownloadToFileで自動ダウンロードし、それらの中から発音記号の部分を抽出してセルに書き出すことを考えました。
 
ソースはエンコードがUTF-8で、行末が&h0Aなので、読み込みは
CreateObject("ADODB.Stream")
        .Charset = "UTF-8"
        .LineSeparator = 10
を使っています。
 
例えばgoo辞書では発音記号の部分は、「abroad」だと
<li><span>発音</span>əbrɔ'ːd</li>
という形になっているので、"発音"、"</span>"、"</li>"の有無をinstr関数で判別して、mid関数で発音記号部分だけを文字列として抽出します。
 
幾つかの単語はそれでうまくいきます。
 
しかし飾り付きアルファベット・合字(リガチャ)に&aacute; や & # 225;=(á)などの特殊表記を使っている単語では、それがそのまま表示されます。
また、一部だけ異なる発音を「,」で区分して表示している場合、「,」に普通の&h2Cではなく&hFF0C(Unicode:アラビア表示形B)というかなり特殊な文字を使ってあってこれは完全に文字化けします。「accept」が典型です。&aelig;ks&eacute;pt�E�ək-
 
これをセル上でブラウザと同じように表示させるにはどうすればいいのでしょうか。
よろしくお願いします。

回答
投稿日時: 18/01/10 07:30:22
投稿者: simple

&を使った書式は、文字実体参照、数値文字参照というものですね。
文字実体参照 VBA などと検索して調べてみてください。
こちらも時間がとれませんので、後ほど改めて。

回答
投稿日時: 18/01/10 14:47:48
投稿者: きぬあさ
投稿者のウェブサイトに移動

こんにちは。
ソースが読み込めているのであれば、DOMで処理した方が早いかと思います。
 

Public Sub Sample()
  Dim src As String
  Dim elmLi As Object
  Dim v As Variant
  
  src = "(ダウンロードしたHTMLファイルのソースを丸ごと読込)"
  With CreateObject("htmlfile")
    .Open
    .Write src
    
    'DOM解析待ち
    Do
      DoEvents
    Loop Until (LCase(.readyState) = "interactive") Or _
               (LCase(.readyState) = "complete")
    
    For Each elmLi In .getElementsByTagName("li")
      If InStr(elmLi.innerHTML, "発音") Then
        v = Split(elmLi.innerHTML, "</SPAN>")
        ActiveCell.Value = v(UBound(v))
        Exit For
      End If
    Next
    .Close
  End With
End Sub

投稿日時: 18/01/12 22:04:12
投稿者: ユニとウィル

ご回答ありがとうございました。
これまであれこれ苦労していたのが、ヒントを貰ったことで、それをきっかけにブレークスルーして一気に解決できました。
 
元々は学校で配布された受験対策の発音とアクセントに注意する単語約600のプリントが始まりでした。
印刷が汚いし、紙データは扱いが不便なのでEXCEL化を試みました。
プリントをスキャンしてOCRにかけて単語と意味はデータ化できました。
しかし発音記号は殆ど全部が誤認識されます。
 
発音記号取り込みの自動化を考えたとき、ここまで手間取るとは思っていませんでした。
simpleさんが書いておられる文字実体参照、数値文字参照ということも知りませんでした。
 
これで思っていたような単語帳ができます。
ありがとうございました。
 
 
後からここを見て参考にする方のために補足を書いておきます。
 
1)
> src = "(ダウンロードしたHTMLファイルのソースを丸ごと読込)"
この部分には https://k-sugi.sakura.ne.jp/windows/vb/3650/
「テキストファイルの読み込み」を参考にしました。
strDATAをsrcに変更することでそのまま使えました。
 
 
2)
<li><span>発音</span>əbrɔ'ːd</li>
この形式のデータはきぬあささんにご教示頂いた方法でほぼ100%取り込めました。
 
3)
同じgoo辞書に、2)とは別の形式のページもありました。
<li>がなく、"発音"と発音記号が分かれています。
<dt class="title in-ttl-a">発音</dt>
<dd class="text text-c">&eacute;ik</dd>
この形式の場合は、発音記号のddタグが2回目に現れるので、次のようにしたら取り出すことができました。
    cc=0
    For Each elmLi In .getElementsByTagName("dd")
     cc = cc + 1
     If cc = 2 Then ActiveCell.Value = elmLi.innerHTML
    Next
 
4)
「r」をイタリック表記する記号がタグ付きで <i>r</i> 表示される。
これはActiveCellに発音記号を書き込んだ後に
    tmp0 = ActiveCell.Value
    tmp1 = Application.WorksheetFunction.Substitute(tmp0, "<i>", "")
    tmp2 = Application.WorksheetFunction.Substitute(tmp1, "</i>", "")
    tmp3 = Application.WorksheetFunction.Substitute(tmp2, "'", qt0301)
    If ActiveCell.Value <> tmp3 Then
      ActiveCell.Value = tmp3
    End If
とすることで解決できました。
tmp3は、アクセント記号が普通のシングルコーテーション「'」になっている場合に、Unicodeの&h0301 「́」 と置換しています。これでアクセント記号が文字の上に重ねて表示されるようになります。
 
ここまでしても取り出せない単語(複数形の特殊発音や、同じ単語で品詞によってアクセントが変わる場合など)は手作業でコピペすればいいです。
 
 
もう一つ補足
 
goo辞書から多くの単語のページソースをURLDownloadToFileで連続して自動ダウンロードすると、ウィルスか何かの攻撃と思われるらしく途中から警告文が返されます。
サーバに負担をかけるのも申し訳ないです。
一度に取るのは10個くらいにするか、sleepなどで時間を空けたほうがいいです。