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)
`シートに書いた内容を録音（音声ファイルに保存する）事例`
[Excel VBA（マクロ）でセルの内容を声を変えて読上げ -その６](https://qiita.com/tom-sobue/items/fd35a4259bfb7291dc1c)
`読上げる内容を調整し易くする事例`
[Excel VBA（マクロ）でセルの内容を声を変えて読上げ -その７](https://qiita.com/tom-sobue/items/3f55ad3e3a0da3342504)
`XMLタグについて追加説明`
[Excel VBA（マクロ）でセルの内容を声を変えて読上げ -その８- 選択範囲を読上げる](https://qiita.com/tom-sobue/items/9c68275b925627c378ed)
`選択したセルの範囲だけを読上げる`
[Excel VBA（マクロ）でセルの内容を声を変えて読上げ -その９- 太字部分を強調読上げする](https://qiita.com/tom-sobue/items/b3c564cf738489fe6923)
`文章の一部が太字になっている部分を強調読上げする`
について、紹介しました。

[**その８**](https://qiita.com/tom-sobue/items/9c68275b925627c378ed)で、
１行ごとに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よりも前に使っていたバージョンでは、２５６文字の制限がありました。
（スイマセン。古すぎて、切り替え時期が不明です。）
２００文字超えで、カウンタ（tokeCnt）繰り上げ処理をした方が安全かもしれません。