Excel Visual Basic宏中的文本到语音

时间:2014-09-09 21:32:17

标签: excel vba excel-vba text-to-speech

我一直在尝试在excel中编写一个宏,它可以识别单元格列的更改值,并使用相应行不同列的文本到语音触发警报。下面是我使用过的两组代码并产生了结果,但是我需要对代码进行微调,因为我遇到了一些障碍:

第一个代码更新太频繁(每次对工作表进行外部更新时,都会触发此代码)。

Sub Worksheet_Calculate()
Dim myText As String
For Each c In Range("bf4:bf45")
If c.Value = 1 Then
myText = c.Offset(0, -57).Text
Application.Speech.Speak (myText)
End If
Next
End Sub

第二个代码仅在我手动点击定义范围内的回车键时才会触发。

 Sub worksheet_change(ByVal target As Range)
 If target = 1 And _
 target.Column = 58 And _
 target.Row >= 4 And _
 target.Row <= 45 Then _
 Application.Speech.Speak target.Offset(0, -57).Text

 End Sub

我正在尝试添加可以为此代码提供计时器的代码(因此每4分钟文本到语音警报将会消失)或每次定义的列值更改时都会出现自动文本对应行的语音警报。

谢谢!

编辑包含工作表计算代码和.ontime代码

Sub Worksheet_Calculate()
Dim myText As String
For Each c In Range("bf4:bf45")
If c.Value = 1 Then
myText = c.Offset(0, -57).Text
Application.Speech.Speak (myText)
End If
Next
End Sub



 Public Sub Updatetextspeech()
'Clock that prompts running of text to speech alert
 Sheets("ALERTS").Select
 Call myText
 Nexttick = Now + TimeValue("00:03:00")
 Application.OnTime Nexttick, "Updatetextspeech"

        If Time >= TimeValue("16:00:00") Then
        Application.OnTime Nexttick, "Updatetextspeech", , False
    End If
End Sub

2014年9月12日更新的其他代码以回应DavidZemens代码

Option Explicit

Dim oldValues As Variant
Dim rng As Range

Sub Main()

'## Define our range to monitor, modify as needed
 Set rng = Sheets("ALERTS").Range("be4:be45")

'## Store its values in the array
oldValues = rng.Value

'## Initialize the UpdateTextSpeech
' I use a shorter interval for debugging, modify as needed
Application.OnTime Now + TimeValue("00:00:10"), "UpdateTextSpeech"


End Sub

出于某种原因,下面的代码子部分&#34; updatetextspeech&#34;导致很多中断,我试过的不同代码我会得到未定义的对象,或者编译错误,或者下面的参数不是可选的应用程序的几个不同的代码我尝试过     Sub UpdateTextSpeech()

 Dim r As Long

 **'## Iterate the range**
 For r = 1 To rng.Rows.Count
 'Check if its value has changed AND the adjacent cell
 If rng.Cells(r, 1).Value <> oldValues(r, 1) And rng.Cells(r, 1).Offset(0, 1).Value = 1 Then

    **'This is where your speech app goes:** 
     Application.speech.speak.cells(r,1).text  'OR

    Application.speech.speak.value.text        'OR

    Application.speech.speak (updatetextspeech).text  'OR

    End If
 Next

'Provide a way to escape the OnTime loop:
 If MsgBox("Continue monitoring cell changes?", vbYesNo) = vbYes Then
'update the "old" values
oldValues = rng.Value
Application.OnTime Now + TimeValue("00:00:10"), "Updatetextspeech"
End If


End Sub

1 个答案:

答案 0 :(得分:0)

让我们尝试这样的事情。

首先,声明一个模块级变量来表示您想要监视的单元格范围,并且它们的值也可以存储为模块级变体。

我们最初会存储这些值。然后我们使用Application.OnTime方法启动计时器循环。每个间隔我们将比较当前值与最后一个间隔存储的值。如果值已更改公式等于1,则您可以执行此操作。提示将询问用户他/她是否想要继续。如果是,那么我们将新值存储在变量中,并将这些值与下一个间隔进行比较。

我使用较短的间隔和消息框而不是语音应用程序,但您应该可以修改它。

enter image description here

Option Explicit

Dim oldValues As Variant
Dim rng As Range

Sub Main()

'## Define our range to monitor, modify as needed
Set rng = Sheets("ALERTS").Range("A2:A10")

'## Store its values in the array
oldValues = rng.Value

'## Initialize the UpdateTextSpeech
' I use a shorter interval for debugging, modify as needed
Application.OnTime Now + TimeValue("00:00:10"), "UpdateTextSpeech"


End Sub
Sub UpdateTextSpeech()

Dim r As Long

'## Iterate the range
For r = 1 To rng.Rows.Count
    'Check if its value has changed AND the adjacent cell
    If rng.Cells(r, 1).Value <> oldValues(r, 1) And rng.Cells(r, 1).Offset(0, 1).Value = 1 Then

        'This is where your speech app goes:
        MsgBox rng.Cells(r, 1).Address & " has changed." & vbCrLf & vbCrLf & _
            "Old value: " & oldValues(r, 1) & vbCrLf & _
            "New value: " & rng.Cells(r, 1).Value

    End If
Next

'Provide a way to escape the OnTime loop:
If MsgBox("Continue monitoring cell changes?", vbYesNo) = vbYes Then
    'update the "old" values
    oldValues = rng.Value
    Application.OnTime Now + TimeValue("00:00:10"), "Updatetextspeech"
End If


End Sub