Ошибка компиляции: недопустимая внешняя процедура для кода, пытающегося пропинговать несколько серверов - PullRequest
1 голос
/ 19 апреля 2019

Я пытаюсь получить лист Excel для проверки связи с несколькими серверами при нажатии кнопки.

Я выполнил все шаги в руководстве на
https://wintelgeeks.com/2016/02/11/script-to-ping-multiple-servers-using-excel/
, но получил

«Ошибка компиляции: недопустимая внешняя процедура».

Я использую Excel Office 365 на сервере Windows 2012 R2.

Sub PingSystem()
    ‘—-First clear the cells in Row B—————–
    ClearStatusCells
    ‘—————————————————
    Dim strcomputer As String
    Application.ScreenUpdating = True
    For introw = 2 To ActiveSheet.Cells(65536, 1).End(xlUp).Row
        strcomputer = ActiveSheet.Cells(introw, 1).Value
        ‘————Call ping function and post the output in the adjacent cell——-
        If Ping(strcomputer) = True Then
            strpingtest = “Online”
            ActiveSheet.Cells(introw, 2).Value = strpingtest
        Else
            ActiveSheet.Cells(introw, 2).Font.Color = RGB(200, 0, 0)
            ActiveSheet.Cells(introw, 2).Value = “Offline”
        End If
    Next
    MsgBox “Script Completed”
End Sub


Function Ping(strcomputer)
    Dim objshell, boolcode
    Set objshell = CreateObject(“wscript.shell”)
    boolcode = objshell.Run(“ping -n 1 -w 1000 ” & strcomputer, 0, True)
    If boolcode = 0 Then
        Ping = True
    Else
        Ping = False
    End If
End Function


Sub ClearStatusCells()
    Range(“B2:B1000”).Clear
End Sub

1 Ответ

0 голосов
/ 19 апреля 2019

Маркеры комментариев в VBA ', а ваши : компилятор VBA не распознает символ как апостроф и поэтому считает его частью идентификатора.

Синтаксически - идентификаторсидение в одиночестве в строке кода должно быть вызовом процедуры (или неквалифицированным вызовом члена для некоторого объекта глобальной области).

И вызов процедуры (или вызов члена) не может быть законным враздел модуля (declarations) или где-либо вне области действия процедуры, поскольку это исполняемый оператор.

А затем строковые разделители " равны , что также приводит к путанице в компиляторе.

Fixодинарные и двойные кавычки, код скомпилируется. Ctrl + H , чтобы найти и заменить =)

Правило, не копируйте + вставляйте код из сообщений блога, если они не отформатированы как код.

Public Sub PingSystem()
    Dim failed As Boolean
    On Error GoTo CleanFail
    'Application.ScreenUpdating = False

    Dim sheet As Worksheet
    Set sheet = ActiveSheet 'TODO set to a more specific sheet

    ClearStatusCells sheet

    Dim currentRow As Long
    For currentRow = 2 To sheet.Cells(sheet.Rows.Count, 1).End(xlUp).Row

        Dim host As Variant
        host = sheet.Cells(currentRow, 1).Value

        If Not IsError(host) Then

            Dim pingSuccess As Boolean
            pingSuccess = Ping(CStr(host))

            sheet.Cells(currentRow, 2).Value = IIf(pingSuccess, "Online", "Offline")
            sheet.Cells(currentRow, 2).Font.Color = IIf(pingSuccess, vbBlack, vbRed)

        End If

    Next
CleanExit:
    Application.ScreenUpdating = True
    If failed Then
        MsgBox "Script completed unexpectedly.", vbExclamation
    Else
        MsgBox "Script completed.", vbInformation
    End If
    Exit Sub
CleanFail:
    failed = True
    Resume CleanExit
End Sub

Private Function Ping(ByVal host As String) As Boolean
    With CreateObject("wscript.shell")
        Ping = .Run("ping -n 1 -w 1000 " & host, 0, True) = 0
    End With
End Function

Private Sub ClearStatusCells(ByVal sheet As Worksheet)
    sheet.Range("B2:B1000").Clear 'TODO use a named range?
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...