Excel VBA 音声読み上げを使う3つの方法

Excel VBA 音声読み上げを使う3つの方法

実際の仕事で、データ内容にミスがないかどうかを Excel の「セル読み上げ機能」でPCに音声で読み上げてもらい、1人作業でデータチェックを行ったりしています。

VBA実行時にメッセージBOXを表示させたりBeep音を鳴らすなどのケースがありますが、この「音声読み上げ」を活用できないか考えてみようと思います。

くるみこ
くるみこ

例えば、以前プログレスバーを表示して・・・という記事を掲載していますが、実際目の前にPCがある場合はいいのですが、離れて作業をしていたりする場合に「終わったよ!」などと音声メッセージで伝えてくれたら効率的ですよね。

それいいかもしれませんね(^^♪

そのプログレスバーの記事がこちらです。

【この記事でわかることは】
・Range オブジェクトの Speak メソッドでセル範囲を音声読み上げする方法
Speech オブジェクトの Speak メソッドでテキスト読み上げ方法
・SAPI の Speakメソッドを使う方法
・音声合成エンジンを日本語と英語で切り替える方法

スポンサーリンク

VBAで音声読み上げを使う3つの方法

VBAで音声読み上げを使う方法について調べてみたところ、方法は3つあることがわかりました。
※他にもあると思いますが(^^;

  1. Range オブジェクトの Speak メソッド
    (Excel 2002から追加された機能)Excelの読み上げ機能がこれです。
  2. Application.Speech オブジェクトの Speak メソッド
  3. SAPI(Speech Application Programming Interfaceの略)のSpeakメソッド
    ※SAPIは、マイクロソフトが開発したWindowsアプリケーションで音声認識や音声合成を使うためのAPIです。(Windows 8.1 以降に標準で付いている)

では、それぞれについて詳しく見ていきます。

Range.Speak メソッドでセル範囲読み上げ

RangeオブジェクトのSpeakメソッド使用例

'RangeオブジェクトのSpeakメソッドの使用例
Sub RangeSpeak01()
    Range("A1:A3").Speak    '範囲で指定できます
    Selection.Speak         'セル選択範囲指定の場合
End Sub

Range.Speak メソッド (Excel) は、範囲内のセルを行順(規定)または列順に読み上げます。
【構文】オブジェクト.Speak (SpeakDirection, SpeakFormulas)
    ※引数の SpeakDirection, SpeakFormulas はどちらも省略可能

SpeakDirection = 読み上げ順を行順か列順か指定する場合に使用
※指定しない場合は「行順読み上げ」が規定値となります

指定順定数数値複数指定された場合の動作説明
列順の場合xlSpeakByColumns1左列を下方向に読み上げたら、右の列に移動します
行順の場合xlSpeakByRows0行を横(右)方向に読み上げたら、下の行に移動します

SpeakFormulas = セルに数式がある場合、数式か値のどちらを読み上げるか措定

読み上げ指定指定複数指定された場合の動作説明
」の場合False【規定値】セルに数式があっても「値」を読み上げます
数式」の場合Trueセルに数式がある場合、数式を読み上げます
'Range.Speakメソッドでセル範囲の数式と値の読み上げ例
Sub RangeSpeak02()
    Range("A1:B3").Speak xlSpeakByColumns, True '列順「数式」読み上げ
    Range("A1:B3").Speak xlSpeakByRows, False  '行順「値」を読み上げ
End Sub

RangeオブジェクトのSpeakメソッドで音声読み上げを行う場合は、セル範囲を指定することがわかりました。テキスト文字列を直接指定することは出来ないんですね。

Speech.Speak メソッドでテキスト読み上げ

Application オブジェクト にある Speech プロパティオブジェクト の Speak メソッド ならテキスト文字列を直接指定して音声で読み上げることができます。

Application.SpeechオブジェクトのSpeakメソッド使用例

'Application.Speech.Speakメソッドの使用例
Sub AppSpeechSpeak01()
    With Application.Speech
        .Speak "処理を終了しました"  '直接文字列を指定
        .Speak Range("C1")  'セル指定は単一セルのみ可能
        'こんな感じで繋げれば複数指定できます
        .Speak Range("C1") & "。、" & Range("C2")
                            ' ↑句読点で読み上げ間隔調整
    End With
End Sub

Speech.Speak メソッド (Excel) は、引数として渡されたテキスト文字列を読み上げます。
【構文】Application.Speech.Speak (Text, SpeakAsync, SpeakXML, Purge)

引数名省略説明
Text必須音声で読み上げるテキストを文字列で指定します
SpeakAsync省略
可能
True = 非同期 (読み上げ終了を待たずに次の処理が実行されます)
False = 同期 (読み上げ終了を待って次の処理を実行します)【規定値】
SpeakXML省略
可能
True = テキストの XML タグを読み上げます  
False = テキストの XML タグを読み上げません【規定値】
Purge省略
可能
True = 読み上げ前にバッファー内テキストが削除されます
False = 読み上げ前にバッファー内テキストは削除されません【規定値】

テキスト文字列を直接指定できるということは、テキストファイルなどから文字列を取得して読み上げさせることもできます。また、セル範囲からあらかじめ変数に値を読み込ませてから読み上げることもできますね。

次は、テキストファイル「d:\読み上げサンプル.txt」を1行ずつ読み上げるサンプルです。

'Application.Speech.Speakメソッドのテキストファイル読み込み例
Sub AppSpeechSpeak02()
    Dim buf As String
    Open "d:\読み上げサンプル.txt" For Input As #1
        '1行づつ末尾まで読み込んで読み上げます
        Do Until EOF(1)
            Line Input #1, buf
            Application.Speech.Speak buf
        Loop
    Close #1
End Sub

※ 読み上げ中は他の操作ができなくなるので注意が必要です!

Application.Speech オブジェクトのプロパティ

Application.Speech オブジェクトには、Speak メソッドのほかに二つのプロパティーがあります。

Direction プロパティ

セルが読み上げられる順序を設定します。Direction プロパティの値は 、最初の項で説明したRange.Speakメソッド の XlSpeakDirection 定数 と同じです。

値の取得と設定が可能です。となっているのですが、このプロパティの使いどころがよくわかりませんでした。それは、Speak メソッドではセルを指定する場合、範囲で指定できないからです。

試しに、Direction プロパティで列順を指定してから Speak メソッドでセル範囲「C1:C2」を指定したところ、次の画像のとおり「実行時エラー’13’」でとおりませんでした。

実行時エラー’13’ ダイアログ

どうやらこのプロパティは Excel に設定されている「読み取り順」の設定を変更したり、現在設定されているモードを調べるために使うのが目的のようです。

SpeakCellOnEnter プロパティ

Microsoft Excel Enter キーを押した場合、またはアクティブ セルの編集が完了すると、アクティブ セルが話されるモードがサポートされます。 SpeakCellOnEnter プロパティを True に設定すると、この モードがオンになります。 False を 指定すると、このモードはオフになります。 読み取り/書き込みが可能な Boolean です。

Microsoftリファレンスから引用

Direction プロパティ同様に、このプロパティも Excel に設定されている SpeakCellOnEnter の設定を変更したり、現在設定されているモードを調べるために使うのが目的のようです。

SAPI の Speak メソッドを使う方法

SAPI(Speech Application Programming Interface)を使った例を試してみたいと思います。

SAPIのSpeakメソッドの使用例

簡単な使用例がこちらです。

'SAPIのSpeakメソッドの使用例
Sub SAPISpeakSample01()
    Dim SV As Object
    Set SV = CreateObject("SAPI.SpVoice")
    SV.Speak "処理が終了しました"
    Set SV = Nothing
End Sub

実行すると「処理が終了しました」と日本語で読み上げてくれるはずです。
ただし、PCにインストールされている音声合成エンジンによってはうまく発音しないかも(^^;

参照設定せずに レイトバインディングで宣言指定しています。

参照設定する場合の注意点

参照設定する場合は、Microsoft Speech Object Library を参照します。
下の画像のように Microsoft Speech Object Library が二つ表示されている場合はファイル名が【sapi.dll】の方ですので注意してください。(私の環境では二つ表示されていました)

Speech Object Library 参照設定確認画像

使いそうなプロパティをいくつか紹介

Voice プロパティ

インストールされているどの音声合成エンジンを使用するか指定できます。
指定するためには、あらかじめインストールされている音声合成エンジンの種類を GetVoicesメソッド を使って取得しておく必要があります。

GetVoicesメソッド で利用できる音声合成エンジンを調べるコードがこちらです。

Sub GetVoiceList()
    Dim i As Long
    Dim v As String
    Dim SV As Object
    Set SV = CreateObject("SAPI.SpVoice")
    With SV
        For i = 0 To .GetVoices.Count - 1
            v = v & i & ":" & .GetVoices.Item(i).GetDescription & vbCrLf
        Next
    End With
    MsgBox v
    Set SV = Nothing
End Sub

GetVoices.Count で音声合成エンジンの数を取得して、Item 毎に GetDescription で付加情報を取得していきます。

実行すると、次のように取得できた情報が表示されました。

0:Microsoft Haruka Desktop - Japanese
1:Microsoft Zira Desktop - English (United States)

これで「ID」「ベンダー」「名前」「言語」がわかりました。

最初の使用例では、使う音声合成エンジンを指定していませんでしたが、正しく日本語を指定するには次のように(6行目)記述して使う音声合成エンジンのID「0」を指定します。

'SAPIのSpeakメソッドの使用例
Sub SAPISpeakSample01()
    Dim SV As Object
    Set SV = CreateObject("SAPI.SpVoice")
    With SV
        Set .Voice = .GetVoices.Item(0) '←日本語エンジン指定を追加
        .Speak "処理が終了しました"
    End With
    Set SV = Nothing
End Sub
Rate プロパティ

-10〜10の範囲(遅い~早い)で音声の読み上げ速度を指定できます。
読み上げ開始前に指定しておく必要があります。【規定値は 0】

 .Rate = -5     '-10〜10の範囲で指定できます
Volume プロパティ

0〜100の範囲(無音~最大)で読み上げる音声の音量を指定できます。
こちらも同じく、読み上げ開始前に指定しておく必要があります。【規定値は 100】

 .Volume = 50   '0〜100の範囲で指定できます

日本語と英語を切り替えて使う

以上わかったことを利用して日本語と英語を切り替えて発音させてみます。

'SAPIのSpeakで日本語と英語を切り替える使用例
Sub SAPISpeakSample02()
    Dim SV As Object
    Set SV = CreateObject("SAPI.SpVoice")
    With SV
        Set .Voice = .GetVoices.Item(0) '日本語指定
        .Rate = -5   '-10~10の範囲で指定
        .Speak "処理が終了しました"
        .Speak "Processing is finished"
        Set .Voice = .GetVoices.Item(1) '英語に指定
        .Speak "Processing is finished"
        .Speak "処理が終了しました"
    End With
    Set SV = Nothing
End Sub

・6行目では、日本語の音声合成エンジンを指定
・7行目で、わかりやすいように読み上げスピードを少し遅く(-5)しています。
・9行目の “Processing is finished” の読み上げを日本語エンジンで読み上げします。
・10行目で、英語の音声合成エンジンに指定を切り替えています。
・11行目の “Processing is finished” の読み上げは英語エンジンで読み上げされます。
・12行目で、日本語を英語の音声合成エンジンの読ませてみます。

実行結果は、
・9行目、日本語の音声合成エンジンでは英語はローマ字読みになっていましたね。
・11行目、ちゃんと英語読みにかわっていました。
・12行目、英語の音声合成エンジンでは日本語を読み上げしてくれませんでした。

以上、日本語と英語の切り替え方法がわかりました。
交互に切り替えながら使えば、変な発音にならずきれいに表現できそうですね。

 

スポンサーリンク

まとめ(おわりに)

以上、Excel VBA で音声読み上げする3つの方法についての解説でした。

音声読み上げ中は、Excelの操作は出来なくなりますので注意してください!

サンプルファイルをダウンロードできるように登録していますので是非お試しください。

まとめと感想など

くるみこ
くるみこ

テキストの音声読み上げで単純に使うなら「 Application.Speech.Speakメソッド」で十分ですね。 日本語と英語を切り替えたり、読み上げスピードを調整するなら「 SAPIのSpeakメソッド」を使う必要があるということですね。
これだけのことがわかれば、活用していけそうですね。いかがでしたか(^^)

日本語と英語の音声合成エンジンを切り替える方法や読み上げスピードの調整がすごく面白かったです。だから「 SAPIのSpeakメソッド」がすきかなぁ(^^ゞ

【今回わかったことは】
・セル範囲の読み上げだけなら Range.Speak メソッド
・テキスト読み上げなら Application.Speech.Speak メソッド
・日本語と英語の切り替えやスピード調整するなら SAPI の Speakメソッド


★★★ ブログランキング参加中! クリックしてね(^^)/ ★★★

【今後の記事について】

今回の記事はいかがだったでしょうか。皆さまのお役に立てたなら幸いです(^^;
「汎用でだれでも使えて活用できるように考えてる」というポリシーで、記事を継続して書いていきたいと思っています。どうぞよろしくお願いしますm(_ _)m

【検討中の今後の記事内容は・・・・】
・実務に役立つものを提供できるよう常に検討しています(^^ゞ
・その他雑記的に「プチネタなど」もいろいろ考えていきたいと思っています・・・・
・今後の記事にご期待ください(^^)/

過去記事のサンプルファイルをダウンロードできます

今回記事のサンプルファイルをリンク先に登録しています

過去の記事で使用したサンプルファイルをダウンロードできるようにページを設置していますので、こちら(このリンク先)からご利用ください

おすすめ書籍はこちら
VBA-tool
スポンサーリンク
\(この記事をシェアする)/
\( フォローする )/
関連記事
kurumico.com (^^)/