Excel VBA(マクロ)でセルの内容を声を変えて読上げ -その1
Windowsに標準で組み込まれている読上げの声で、Harukaの声以外を使って読上げる方法
Excel VBA(マクロ)でセルの内容を声を変えて読上げ -その2
読上げ内容を音声ファイルに保存する方法
Excel VBA(マクロ)でセルの内容を声を変えて読上げ -その3
スピード、ピッチ(声の音程)、更には、強調の指示方法
Excel VBA(マクロ)でセルの内容を声を変えて読上げ -その4
実際のシートに書いた内容で読上げする事例
Excel VBA(マクロ)でセルの内容を声を変えて読上げ -その5
シートに書いた内容を録音(音声ファイルに保存する)事例
Excel VBA(マクロ)でセルの内容を声を変えて読上げ -その6
読上げる内容を調整し易くする事例
Excel VBA(マクロ)でセルの内容を声を変えて読上げ -その7
XMLタグについて追加説明
Excel VBA(マクロ)でセルの内容を声を変えて読上げ -その8- 選択範囲を読上げる
選択したセルの範囲だけを読上げる
Excel VBA(マクロ)でセルの内容を声を変えて読上げ -その9- 太字部分を強調読上げする
文章の一部が太字になっている部分を強調読上げする
について、紹介しました。
その8で、
1行ごとにSAPIオブジェクトを解放しているので、うまくつながらないかもしれない。
同じ読み手ならば読み込んでつなげてから読上げさせたほうが良いかもしれない。
と、しました。
そこで、常套手段ですが、変数へセル内容を収納して、SAPIを解放しないで読上げさせるようにしてみます。
Sub 話し手集約読上げ()
'読上げ内容変数宣言
Dim vCel() As Variant
'読上げ回数カウンタ
Dim tokeCnt As Integer
'現状のシート
Set sht = ActiveSheet
'使用している最終行を検出
erw = sht.Range("A1").SpecialCells(xlCellTypeLastCell).Row
'読上げ内容変数再宣言
ReDim vCel(erw, 2)
'読上げ内容変数初期化
For rw = 1 To erw
vCel(rw, 1) = ""
Next
'回数カウンタ初期化
tokeCnt = 0
'読み手初期化
vNo = 0
'2行目セルから最終行まで繰り返し
For rw = 2 To erw
'A-1:速度 B-2:強調 C-3:声色 D-4:話し手 E-5:読上げ内容
'1列を読込
For col = 1 To 5
cel(col) = sht.Cells(rw, col)
Next
'XML指示を初期化
mae = ""
ato = ""
'速度
Call rat(cel(1))
'声色
Call pit(cel(3))
'強調
Call emp(cel(2))
'読み手
tokerNo = tok(cel(4))
'読み手が変わったら
If tokerNo <> vNo Then
'読上げカウンタ+1
tokeCnt = tokeCnt + 1
'読上げ内容に前後にXMLタグを付けてセル内容を追加
vCel(tokeCnt, 1) = vCel(tokeCnt, 1) & mae & cel(5) & ato
'読み手の番号を読上げ変数に記録
vCel(tokeCnt, 2) = tokerNo
'読み手番号を更新
vNo = tokerNo
'読み手が同じの場合
Else
'読上げ内容に前後にXMLタグを付けてセル内容を追加
vCel(tokeCnt, 1) = vCel(tokeCnt, 1) & mae & cel(5) & ato
End If
Next
'画像更新停止
Application.ScreenUpdating = False
'話し手の設定
Call voi
vNo = 0
'音声合成エンジン設定
Set spi = CreateObject("SAPI.SpVoice")
'割り込み許可
Application.EnableCancelKey = xlInterrupt
'読上げ内容を1~カウンタまで繰り返し
For rw = 1 To tokeCnt
'読み手
Set spi.Voice = voic(vCel(rw, 2))
'読上げ
spi.Speak vCel(rw, 1)
Next
Application.ScreenUpdating = True
'SAPIを解放
Set spi = Nothing
End Sub
この中で配慮していないのが、結合した文章内容が長すぎてオーバーフローする可能性です。
特に、Excel2013よりも前に使っていたバージョンでは、256文字の制限がありました。
(スイマセン。古すぎて、切り替え時期が不明です。)
200文字超えで、カウンタ(tokeCnt)繰り上げ処理をした方が安全かもしれません。