Воспроизведение звука с помощью 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 = True Then


Я думаю, что ваш оператор If, который проверяет значение PlaySound, должен быть внутри вашего цикла For. То, как вы это написали, будет шуметь, только если последняя ячейка в CheckRange = "#N/A", потому что PlaySound будет содержать последнее значение, назначенное ему из цикла.