如果发现错误,请用VBA播放声音

我目前有这样的代码:

Option Explicit Private Declare Function sndPlaySound32 Lib "winmm.dll" _ Alias "sndPlaySoundA" (ByVal lpszSoundName _ As String, ByVal uFlags As Long) As Long Private Sub Worksheet_Change(ByVal Target As Range) Dim Cell As Range Dim CheckRange As Range Dim PlaySound As Boolean Set CheckRange = Range("C:C") For Each Cell In CheckRange If Cell.Value = "#N/A" Then PlaySound = True End If Next If PlaySound Then Call sndPlaySound32("C:\windows\media\chord.wav", 1) End If End Sub 

我想弄明白,如果C列出现错误,可以听到声音,但不起作用,有什么想法?

你不需要这个API

你也可以使用Beep

 Sub Sample() Beep End Sub 

方法1

如果表单中的任何位置发生更改,此代码将运行

 Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) Dim Cell As Range Dim CheckRange As Range Set CheckRange = Range("C:C") For Each Cell In CheckRange If Cell.Text = "#N/A" Then Beep Exit For End If Next End Sub 

方法2

以上代码的替代方法

 Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) Dim Cell As Range For Each Cell In Columns(3) On Error Resume Next If CVErr(Cell) = CVErr(2042) Then Beep Exit For End If On Error GoTo 0 Next End Sub 

方式3

如果您想要仅在Col C中的任何地方进行手动更改时才检查Col C

 Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) Dim Cell As Range If Not Intersect(Target, Columns(3)) Is Nothing Then For Each Cell In Columns(3) On Error Resume Next If CVErr(Cell) = CVErr(2042) Then Beep Exit For End If On Error GoTo 0 Next End If End Sub 

方式4

如果您想要检查某个特定的单元格,如果该单元格中有手动更改

 Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) Dim Cell As Range If Not Intersect(Target, Columns(3)) Is Nothing Then On Error Resume Next If CVErr(Target) = CVErr(2042) Then Beep Exit Sub End If On Error GoTo 0 End If End Sub 

方式5

方式的变化4

 Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) Dim Cell As Range If Not Intersect(Target, Columns(3)) Is Nothing Then If Target.Text = "#N/A" Then Beep Exit Sub End If End If End Sub 

FOLLOWUP(post评论)

活动的单元格将在b列,所以它应该检查一个右边的列d – 山姆考辛斯1分钟前

我想你是指Col C而不是Col D.你必须使用Worksheet_SelectionChange

 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Not Intersect(Target, Columns(2)) Is Nothing Then If Target.Offset(, 1).Text = "#N/A" Then Beep End If End If End Sub 

只需粘贴下面的代码并运行,看看它是否工作…

 Option Explicit Private Declare Function sndPlaySound32 Lib "winmm.dll" _ Alias "sndPlaySoundA" (ByVal lpszSoundName _ As String, ByVal uFlags As Long) As Long Private Sub Worksheet_Change(ByVal Target As Range) Dim Cell As Range Dim PlaySound As Boolean If Target.Column = 3 Then For Each Cell In Target If WorksheetFunction.IsNA(Cell.Value) Then PlaySound = True End If Next If PlaySound Then Call sndPlaySound32("C:\windows\media\chord.wav", 1) End If End If End Sub 

将Cell.Value更改为Cell.Text

如果有公式错误,单元格的值将是错误2042的行,但是你的if语句正在寻找文本“#N / A”

我还build议只使用使用的范围而不是整个列,因为这会减less运行所需的时间。

如果发现错误,您也可以立即退出。

使用嘟嘟声不会让您播放任何声音,但会发出声音,不需要API调用或计算机具有指定的audio文件。

-EDIT-我只是testing下面的代码,它似乎对我来说是正确的。

-EDIT2-更正的代码

 Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) Dim Cell As Range Dim CheckRange As Range Set CheckRange = Range(Cells(1, 3), Cells(ActiveSheet.UsedRange.Rows.Count, 3)) For Each Cell In CheckRange If Cell.Text = "#N/A" Then Beep Exit For End If Next End Sub 

-EDIT3-原始post的工作副本

 Option Explicit Private Declare Function sndPlaySound32 Lib "winmm.dll" _ Alias "sndPlaySoundA" (ByVal lpszSoundName _ As String, ByVal uFlags As Long) As Long Private Sub Worksheet_Change(ByVal Target As Range) Dim Cell As Range Dim CheckRange As Range Dim PlaySound As Boolean Set CheckRange = Range(Cells(1, 3), Cells(ActiveSheet.UsedRange.Rows.Count, 3)) For Each Cell In CheckRange If Cell.Text = "#N/A" Then PlaySound = True Exit For End If Next If PlaySound Then Call sndPlaySound32("C:\windows\media\chord.wav", 1) End If End Sub 

尝试用If PlaySound = True ThenreplaceIf PlaySound = True Then

我认为你的If语句检查PlaySound的值应该在你的For循环中。 你写它的方式只会在CheckRange =“#N / A”中的最后一个单元时产生噪声,因为PlaySound将保存从循环中分配给它的最后一个值。