VBA ошибка в макросе

я пытаюсь познавать макросы в вба и не понимаю, почему мой код не работает, помогите пожалуйста разобраться, как павильно должен выглядить код? Этот не работает, эксель не хочет его воспринимать как макрос вообще

Private Sub warning(var_text As String)
    If Range("A1") = "" Then
        var_text = "пустая ячейка"
    ElseIf Not IsNumeric(Range("A1")) Then
        var_text = "нецифровое значение"
    End If
    MsgBox "Caution : " & var_text & " !"
End Sub

Ответы (3 шт):

Автор решения: user491967

В первой строке в скобках должно быть пусто

→ Ссылка
Автор решения: arif

Макросы отличаются от внутренних подпрограмм тем, что не принимают аргументов. Вывод: напишите макрос (может вызываться кнопкой и.т.д.) и подпрограмму либо функцию отдельно

Public Sub warning() ' это макрос
 Dim Stroka as String
 Stroka = Range(A5).Value

 If CheckWaring(Stroka) then
  ' что делать если функция нашла ошибку
 end if

End sub



Private Function CheckWaring(var_text As String) as boolean
    If Range("A1") = "" Then
        var_text = "пустая ячейка"
        warning = True ' в этом месте мы определяем то, что возвращает функция 
    ElseIf Not IsNumeric(Range("A1")) Then
        var_text = "нецифровое значение"
    End If
    MsgBox "Caution : " & var_text & " !"
End Sub
→ Ссылка
Автор решения: vikttur

Если это проверка "по кнопке", то передавать в процедуру ничего не нужно:

Private Sub warning()
    Dim var_text As String

    If Range("A1").Value = "" Then
        var_text = "пустая ячейка!"
    ElseIf Not IsNumeric(Range("A1").Value) Then
        var_text = "нечисловое значение!"
    End If

    If var_text <> "" Then MsgBox "Caution: " & var_text, 64, ""
End Sub

Если же ячейку нужно проверить в процессе работы другого макроса:

Private Sub test()
    Dim var_text As String
    
    Call warning(var_text)
    
    If var_text <> "" Then
        MsgBox "Caution: " & var_text, 64, ""
    Else
        ' продолжаем работу'
    End If
End Sub

Private Sub warning(sText As String)
    Select Case True
    Case Range("A1").Value = "": sText = "пустая ячейка!"
    Case Not IsNumeric(Range("A1").Value): sText = "нечисловое значение!"
    End Select
End Sub

Но правильнее оформить проверку в виде функуции:

Private Sub test()
    If fwarning = True Then
        MsgBox "Caution: Data error!", 64, ""
        Exit Sub
    End If
    
    ' продолжаем работу
End Sub

Private Function fwarning() As Boolean
    If Range("A1").Value = "" Or Not IsNumeric(Range("A1").Value) Then fwarning = True
End Function

Разные способы проверки (If-ElseIf, Select Case, If-Or) приведены для примера.

→ Ссылка