読者です 読者をやめる 読者になる 読者になる

セル上の英文を読み上げてもらう

はじめに

ネタができたらVBAの記事書こうと思っていたら、なかなかに久々になりました。
ネタって自然と湧き出てくるわけではないんですね。

やりたいこと

Excelのセル上の英語テキストを読ませたい

背景

最近「英語物語」というアプリで自動読み上げがすごいなあと思い、
なんかAPIとか使えばVBAでも読み上げできるんじゃないかなと思ったから。

とりあえずやってみよう

まずはExcelの標準でできないかどうか、Google先生にお伺いをたてます。

Excel」「VBA」「読み上げ」「音声」などを組み合わせて検索。

さすがにできないだろと思うことも、とりあえず訊くが吉です。

セルの読み上げ機能

Excel でテキストを音声に変換する - Excel

こちらのページに「セルの読み上げ機能」というものがあり、「あれ? 終わった」と思いました。
が、これを実際に試してみると、なかなか面白いレベル。

昔の読み上げってこんな感じだったなあという。

Office TANAKA - Excel VBA Tips[テキストファイルを読み上げる]

VBAでもできるようです。

が、もう少しうまく読んでもらえるか調べてみましょう。

SAPI?

VocExcel / SAPI で読み上げ / エクセル マクロ

よくわかりませんが、SAPIというものを使う方法が書いてありました。

試しに

Sub 読み上げテスト()
  Dim Voice1
  
  Set Voice1 = CreateObject("SAPI.SpVoice")
  Set Voice1.Voice = Voice1.GetVoices().Item(0)
  Voice1.Speak "Hello world"
End Sub

上の方法と変わらない?

しかし「読み上げる人物が変る」という情報がありましたので
声のタイプを取得してみると

Sub 声タイプゲット()
  Dim Voice1
  Dim cnt As Long
  Dim i As Long
  
  Set Voice1 = CreateObject("SAPI.SpVoice")
  cnt = Voice1.GetVoices.Count
  For i = 0 To cnt - 1
    Set Voice1.Voice = Voice1.GetVoices().Item(i)
    Debug.Print Voice1.Voice.GetDescription()
  Next i
End Sub

実行すると、イミディエイトウインドウに

Microsoft Haruka Desktop - Japanese
Microsoft Zira Desktop - English (United States)

こんな感じで、表示されます。*1
Englishバージョンがある!
Ziraというのは名前でしょうか。

Voice1.GetVoices().Item(1)にして試したら、無事に英語っぽく読んでくれました。

ヤッタネ!!

選択セルを読んでもらう

ここまできたら、あとは簡単ですね。

Sub 読み上げ()
  Dim Voice1
  Dim cnt As Long
  Dim r As Range
  Dim str As String
  
  Set Voice1 = CreateObject("SAPI.SpVoice")
  Set Voice1.Voice = Voice1.GetVoices().Item(1)
  For Each r In Selection
    str = r.Value
    If str <> "" Then
      Voice1.Speak str
    End If
  Next
End Sub

クイックアクセスツールバーに追加

どうせなら、セルの読み上げ機能と同じように、クイックアクセスツールバーに追加したいところですね。

Excelマクロ/VBAで始める業務自動化プログラミング入門(1):Excelでプログラム作成を始めるメリットとマクロの基本 (3/5) - @IT

こちらにやり方が書いてあります。

f:id:vba-belle-equipe:20160813124044p:plain

アイコンや表示名は、変更ボタンから変えられます。

f:id:vba-belle-equipe:20160813124237p:plain

とりあえず再生アイコンにしてみました。


セルを選択 -> アイコン押す で、Ziraさんが英語を読み上げてくれます。

*1:Windows10。環境によって違うと思われます