Excel VBA（マクロ）でセルの内容を声を変えて読上げ -その６-読上げる内容を調整し易くする事例

[Excel VBA（マクロ）でセルの内容を声を変えて読上げ -その１](https://qiita.com/tom-sobue/items/aac051de117a45f9fecf)
`Windowsに標準で組み込まれている読上げの声で、Harukaの声以外を使って読上げる方法 `
[Excel VBA（マクロ）でセルの内容を声を変えて読上げ -その２](https://qiita.com/tom-sobue/items/319c1943df9dd30c081a)
`読上げ内容を音声ファイルに保存する方法`
[Excel VBA（マクロ）でセルの内容を声を変えて読上げ -その３](https://qiita.com/tom-sobue/items/3e02e7569cfbe8a90f12)
`スピード、ピッチ（声の音程）、更には、強調の指示方法`
[Excel VBA（マクロ）でセルの内容を声を変えて読上げ -その４](https://qiita.com/tom-sobue/items/e51cbdec59af545b232a)
`実際のシートに書いた内容で読上げする事例`
[Excel VBA（マクロ）でセルの内容を声を変えて読上げ -その５](https://qiita.com/tom-sobue/items/60573cd3c0e786d82e69)
`シートに書いた内容を録音（音声ファイルに保存する）事例`

について、紹介しました。

今回は、読上げる内容を調整し易くする事例を紹介します。

## 読上げ内容を調整し易くする
調整するというのは、「もう少し早く言わせて、尺を短くしよう。」「ちょっと、声色を上げてみようか。」といったことです。

他に、「この様な方法」と文章で打ち込んだら、SAPIは「この**さま**なほうほう」と読みます。
「この**よう**なほうほう」と言ってほしいのに。この場合には、編集をして、
「このような方法」と直します。
人によって、漢字の使い方や送り仮名の使い方が少しずつ違いますが、SAPIは融通が利きません。
読ませたいようにするためには、調整が必要となってきます。

最近のExcelの機能には、セルに打ち込んで[Enter]で読上げる設定が可能です。
調整し易くするというのは、この機能に似たことをさせれば調整し易くなるということです。

Excel VBAには、「Worksheet.Change」というイベントが用意されています。
使うときには、「Microsoft Visual Basic for Application」画面の「Sheet1」や「ThisWorkbook」を
ダブルクリックすれば、「コード」画面が開くので、上部の(General)と表示されている
ドロップダウンをWorksheet または Workbook にすると、勝手にSub が出てきますが、
これを無視して、右のドロップダウンから、Change または SheetChange を選択すると、
目的のSub を記述する準備ができます。
**Sheet1の場合**
~~~~
Private Sub Worksheet_Chnage(ByVal Target As Range)

End Sub
~~~~

**ThisWorkbookの場合**
~~~~
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

End Sub
~~~~

ThisWorkbookでは、shという変数に変更が生じたシート情報が入っています。
両方共通の Target 変数には、変更の生じたセルの情報が入ります。

以下、ThisWorkbookでのシート情報を記述するのが面倒なのでSheet1で説明します。

### セルに変更が有ったら1行読上げる事例

Excelシートの配置を次のようにします。
|   |A   |B   |C   |D   |E   |F|
|:-:|:--:|:--:|:--:|:--:|:--:|:--:|
|1  |スピード|強調 |ピッチ |話し手|内容|1|
|2  |2      |      |-2|一郎  |いつもお世話になっています。||
|3  |-1     |       |4|あゆみ|ありがとうございます。||
|4  |       |        ||      | ||

前回と違うのは、セル"F1"に「1」を書きました。
これが有る場合には、1行読上げすることにします。

**Sheet1のSub**
~~~~
Private Sub Worksheet_Change(ByVal Target As Range)
    'F1セルの内容確認
    If ActiveSheet.Range("F1") = 1 Then
        '変更が有ったセルが2行目以降なら
        If Target.Row > 1 Then
            '行を読上げるSub実行
            Call 行読上げ(Target.Row)
        End If
    End If
End Sub
~~~~

「Sub 行読上げ」へ変更の有った行を渡すためにセルの行（Target.Row）を付けます。

**標準モジュールのSub**
~~~~
'行、列変数
Public rw, col, erw, ecol As Integer
'ワークシート変数
Public sht As Worksheet
'SAPI.SpVoice用オブジェクト変数
Public spi As Object
'SAPI.SpFileStream用オブジェクト変数
Public vRec As Object
'SAPI.SpObjectTokenCategory用オブジェクト変数
Public cat As Object
'声のオブジェクト変数 はるか、Zir、一郎、あゆみ、さやか
Public HarukaVoice, ZirVoice, IchiVoice, AyumiVoice, SayakaVoice As Object
'声のオブジェクト変数
Public voic(5) As Object
'セルの読込変数
Public cel(5) As Variant
'XML指示記述用
Public mae, ato As Variant

Private Sub 読上げsub()
        'A-1:速度 B-2:強調 C-3:声色 D-4:話し手 E-5:読上げ内容
        '1列を読込
        For col = 1 To 5
            cel(col) = ActiveSheet.Cells(rw, col)
        Next
        'XML指示を初期化
        mae = ""
        ato = ""
        '速度
        Call rat(cel(1))
        '強調
        Call emp(cel(2))
        '声色
        Call pit(cel(3))
        '読み手
        Set spi.Voice = voic(tok(cel(4)))
        
        '読上げ
        spi.Speak mae & cel(5) & ato
End Sub

Sub 行読上げ(ByVal TargetRw As Integer)
    '話し手の設定
    Call voi
    
    '音声合成エンジン設定
    Set spi = CreateObject("SAPI.SpVoice")
    '割り込み許可
    Application.EnableCancelKey = xlInterrupt
    
    '現状のシート
    Set sht = ActiveSheet
    '対象の行を設定
    rw = TargetRw
    '読上げ実行
    Call 読上げsub
    'SAPIを解放
    Set spi = Nothing
        
End Sub
~~~~
ここでは、受け取る行位置をTargetRwという変数で受け取っています。
行は、整数なので、TargetRwを整数の変数として宣言しています。
(TargetRw As Integer)

これで、すべての読上げを通しで聞かなくても、スピード、声色、内容を変更した
部分だけの確認ができることになります。

[その７ -XMLタグについて- へ続く](https://qiita.com/tom-sobue/items/3f55ad3e3a0da3342504)