Маркеры комментариев в 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