Воспроизведение звука с помощью 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:windowsmediachord.wav", 1)
End If
End Sub
Я пытаюсь сделать так, что если есть ошибка в столбце c, слышимый звук, однако он не работает, есть идеи?
5 ответов
вам не нужен 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, только если есть ручное изменение в любом месте in 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 (комментарии)
активная ячейка будет в столбце b, поэтому она должна проверить одну справа в столбце D-Sam Cousins 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
Изменение Клеток.Значение к ячейке.Текст
Если есть ошибка формулы, значение ячеек будет чем-то вроде ошибки 2042, но ваш оператор if ищет текст "#N/A"
Я также предлагаю использовать только используемый диапазон вместо всего столбца, так как это уменьшит время, необходимое для запуска.
вы также можете немедленно выйти из for, если обнаружена ошибка.
использование звукового сигнала не позволит вам воспроизводить любой звук, но он будет сделайте звуковой звук и не требует вызова API или компьютера, чтобы иметь указанный аудиофайл.
-редактировать- Я только что протестировал код ниже, и он, похоже, работает правильно для меня.
- 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- Рабочая копия вашего оригинального поста
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, должен быть внутри вашего цикла For. То, как вы это написали, будет шуметь, только если последняя ячейка в CheckRange = "#N/A", потому что PlaySound будет содержать последнее значение, назначенное ему из цикла.