Public Function Ping(ByVal ComputerName As String) As Boolean ' возвращает TRUE, если пинг прошел Dim oPingResult As Variant For Each oPingResult In GetObject("winmgmts://./root/cimv2").ExecQuery _ ("SELECT * FROM Win32_PingStatus WHERE Address = '" & ComputerName & "'") If IsObject(oPingResult) Then If oPingResult.StatusCode = 0 Then Ping = True 'Debug.Print "ResponseTime", oPingResult.ResponseTime Exit Function End If End If Next End Function
Пример использования:
Sub TestPingFunction() If Ping("ComputerName") Then ПутьКПапке = "\ComputerNamefiles" If Ping("ya.ru") Then MsgBox "Интернет доступен!" If Not Ping("192.168.0.2") Then MsgBox "Компьютер с IP адресом 192.168.0.2 недоступен в сети!" End Sub
Расширенные варианты функции:
Function PingResponseTime(ByVal ComputerName$, Optional ByVal BufferSize% = 32) As Long ' Выполняет ICMP запрос (ping) до адреса ComputerName пакетами размером BufferSize% байтов ' Возвращает время отклика (в миллисекундах), если пинг прошел удачно, ' или -1, если ответ на запрос не получен. Dim oPingResult As Variant: PingResponseTime = -1: On Error Resume Next For Each oPingResult In GetObject("winmgmts://./root/cimv2").ExecQuery _ ("SELECT * FROM Win32_PingStatus WHERE Address = '" & ComputerName & "' and BufferSize = " & BufferSize%) If IsObject(oPingResult) Then If oPingResult.StatusCode = 0 Then PingResponseTime = oPingResult.ResponseTime Next End Function
Function PingResponseTimeEx(ByVal ComputerName$, Optional ByVal BufferSize As Long = 32) As Long ' Выполняет ICMP запрос (ping) до адреса ComputerName пакетами размером BufferSize% байтов ' Возвращает время отклика (в миллисекундах), если пинг прошел удачно, ' или -1, если ответ на запрос не получен. Dim oPingResult As Variant: PingResponseTimeEx = -1: On Error Resume Next For Each oPingResult In GetObject("winmgmts://./root/cimv2").ExecQuery _ ("SELECT * FROM Win32_PingStatus WHERE Address = '" & ComputerName & "' and BufferSize = " & BufferSize) If IsObject(oPingResult) Then If oPingResult.StatusCode = 0 Then ' ответ пришёл - возвращаем время отклика PingResponseTimeEx = oPingResult.ResponseTime Else ' выводим код ошибки в окно Immediate Debug.Print "Ошибка ICMP запроса к адресу " & ComputerName$ & " (размер пакета: " & _ BufferSize & "): " & "Код ошибки " & oPingResult.StatusCode End If ' описания ошибок есть здесь: http://msdn.microsoft.com/ru-ru/library/aa394350(v=VS.85).aspx ' например, ошибка 11010 означает "Request Timed Out" - таймаут (по умолчанию он равен 1000 мс) End If Next End Function
Ну и, как обычно, пример использования:
Sub ПримерИспользованияPingResponseTimeEx() ' пингуем адрес 192.168.1.100 пакетами размером 1000 байтов Debug.Print PingResponseTimeEx("192.168.1.100", 1000) ' возвращает 5 (ping успешный, отклик 5ms) ' пингуем Яндекс пакетами размером 99 байтов Debug.Print PingResponseTimeEx("ya.ru", 99) ' возвращает 28 (ping успешный, отклик 28ms) End Sub
А эта функция (совместно с функцией Ping) поможет проверить, доступно ли соединение с интернетом на компьютере:
Function InternetConnectionAvailable() As Boolean ' возвращает TRUE, если доступно соединение с Интернетом (пингуются несколько хостов) InternetConnectionAvailable = False If Ping("yandex.ru") Then InternetConnectionAvailable = True: Exit Function If Ping("ya.ru") Then InternetConnectionAvailable = True: Exit Function If Ping("mail.ru") Then InternetConnectionAvailable = True: Exit Function If Ping("rambler.ru") Then InternetConnectionAvailable = True: Exit Function End Function
Сделать это можно так:
Sub ПримерИспользования() If Not InternetConnectionAvailable Then ' проверяем доступ к основным сайтам MsgBox "Сначала подключите интернет (или отключите брандмауэр), " & _ "а потом запускайте макрос", vbCritical, "Недоступен интернет" Exit Sub End If ' далее идёт код, взаимодействующий с интернетом (почта, FTP, HTTP и т.д.) End Sub
Ping IP-адрес с кодом VBA и результаты возврата в Excel
‘===============================================================================
Const CONST_Cln_IP As Integer = 2
Sub GetIPStatus()
Dim Cell As Range
Dim ipRng As Range
Dim Result As String
Dim Wks As Worksheet
Set Wks = Worksheets(«SPIN»)
Select Case MsgBox(«Проверить все?», 35, «Пинг всех IP»)
Case 6 ‘ Да
Set ipRng = Wks.Range(«B3»)
Set RngEnd = Wks.Cells(Rows.Count, ipRng.Column).End(xlUp)
Set ipRng = IIf(RngEnd.Row < ipRng.Row, ipRng, Wks.Range(ipRng, RngEnd))
For Each Cell In ipRng
Application.StatusBar = «ping: » & Cell.Offset(0, 1).Value & » (» & Cell.Value & «)»
Result = GetPingResult(Cell)
Cell.Offset(0, -1) = Result
DoEvents
Next Cell
Case 7 ‘ Нет
‘проверка по выделенному диапазону
Set ipRng = Selection
‘по словарю проверяем строки(для исключения повторного pingА)
With CreateObject(«Scripting.Dictionary»)
For Each Cell In ipRng
If Not .exists(Cell.Row) Then
.Add Cell.Row, «»
Debug.Print Cell.Row
Application.StatusBar = «ping: » & Wks.Cells(Cell.Row, CONST_Cln_IP + 1).Value & » (» & Wks.Cells(Cell.Row, CONST_Cln_IP).Value & «)»
Result = GetPingResult(Wks.Cells(Cell.Row, CONST_Cln_IP).Value)
Wks.Cells(Cell.Row, CONST_Cln_IP).Offset(0, -1) = Result
DoEvents
End If
Next Cell
End With
Case 2 ‘ Отмена
End Select
Application.StatusBar = «»
End Sub
‘===============================================================================
У меня есть некоторый визуальный базовый код (см. ниже), который проверяет ip-соединение в columb B (из excel spreedsheet) и ставит ли он, что он подключен или недоступен в columb c, мне просто интересно, можете ли вы помочь мне бы хотелось, чтобы он «подключился», если бы какой-либо другой результат был бы красным,
также может ли этот script запускаться автоматически по часовой или ежедневной основе?
Большое спасибо,Andy
Function GetPingResult(Host)
Dim objPing As Object
Dim objStatus As Object
Dim Result As String
Set objPing = GetObject(«winmgmts:{impersonationLevel=impersonate}»). _
ExecQuery(«Select * from Win32_PingStatus Where Address = ‘» & Host & «‘»)
For Each objStatus In objPing
Select Case objStatus.StatusCode
Case 0: strResult = «Connected»
Case 11001: strResult = «Buffer too small»
Case 11002: strResult = «Destination net unreachable»
Case 11003: strResult = «Destination host unreachable»
Case 11004: strResult = «Destination protocol unreachable»
Case 11005: strResult = «Destination port unreachable»
Case 11006: strResult = «No resources»
Case 11007: strResult = «Bad option»
Case 11008: strResult = «Hardware error»
Case 11009: strResult = «Packet too big»
Case 11010: strResult = «Request timed out»
Case 11011: strResult = «Bad request»
Case 11012: strResult = «Bad route»
Case 11013: strResult = «Time-To-Live (TTL) expired transit»
Case 11014: strResult = «Time-To-Live (TTL) expired reassembly»
Case 11015: strResult = «Parameter problem»
Case 11016: strResult = «Source quench»
Case 11017: strResult = «Option too big»
Case 11018: strResult = «Bad destination»
Case 11032: strResult = «Negotiating IPSEC»
Case 11050: strResult = «General failure»
Case Else: strResult = «Unknown host»
End Select
GetPingResult = strResult
Next
Set objPing = Nothing
End Function
Sub GetIPStatus()
Dim Cell As Range
Dim ipRng As Range
Dim Result As String
Dim Wks As Worksheet
Set Wks = Worksheets(«Sheet1»)
Set ipRng = Wks.Range(«B3»)
Set RngEnd = Wks.Cells(Rows.Count, ipRng.Column).End(xlUp)
Set ipRng = IIf(RngEnd.Row < ipRng.Row, ipRng, Wks.Range(ipRng, RngEnd))
For Each Cell In ipRng
Result = GetPingResult(Cell)
Cell.Offset(0, 1) = Result
Next Cell
End Sub
Dany_crm 0 / 0 / 0 Регистрация: 04.06.2012 Сообщений: 12 |
||||
1 |
||||
05.06.2012, 14:26. Показов 6806. Ответов 23 Метки нет (Все метки)
Доброе время суток! Я в этом деле новичок, подскажите как лучше сделать!!!! Добавлено через 16 часов 30 минут
Подскажите плиз, как сформировать email с файлом test.txt в котором первая строчка будет содержать «Область»;»Город»
0 |
Gibboustooth 735 / 203 / 11 Регистрация: 23.06.2011 Сообщений: 440 |
||||
05.06.2012, 15:01 |
2 |
|||
Отправка письма через Outlook 2007
1 |
0 / 0 / 0 Регистрация: 04.06.2012 Сообщений: 12 |
|
06.06.2012, 12:16 [ТС] |
3 |
Спасибо большое!
0 |
Gibboustooth 735 / 203 / 11 Регистрация: 23.06.2011 Сообщений: 440 |
||||||||||||
06.06.2012, 12:44 |
4 |
|||||||||||
Сообщение было отмечено как решение РешениеВместо
читать
Добавлено через 39 секунд
Подскажите пожалуйста, как в тему письма вставить значение из excel файла? Какое именно значение? Добавлено через 26 минут Ping и отправка результатов на почту
Досаточно поставить в константы в начале кода нужные вам значения и все должно заработать.
3 |
Dany_crm 0 / 0 / 0 Регистрация: 04.06.2012 Сообщений: 12 |
||||
06.06.2012, 16:08 [ТС] |
5 |
|||
Странно. Раньше не ругался, теперь говорит что «User-defined type not defined» на строчку
И у меня почему-то кнопка References на панели Tools не активна.
0 |
735 / 203 / 11 Регистрация: 23.06.2011 Сообщений: 440 |
|
06.06.2012, 16:36 |
6 |
И у меня почему-то кнопка References на панели Tools не активна. Нельзя менять библиотеки, пока не остановлен макрос.
1 |
0 / 0 / 0 Регистрация: 04.06.2012 Сообщений: 12 |
|
06.06.2012, 16:41 [ТС] |
7 |
Затупил… =)
0 |
735 / 203 / 11 Регистрация: 23.06.2011 Сообщений: 440 |
|
06.06.2012, 16:48 |
8 |
Gibboustooth — доброй души человек! Все получилось, Спасибо огромное. На здоровье
1 |
Dany_crm 0 / 0 / 0 Регистрация: 04.06.2012 Сообщений: 12 |
||||
07.06.2012, 08:46 [ТС] |
9 |
|||
Теперь задумался об обработке txt файлов. Их будет очень много! Потом надо информацию из каждого txt файла импортировать в excel (файл во вложении).Итог_быстродействие.xlsx test.txt Нашел пример кода для поиска и импорта файлов.
Помогите плиз довести дело до конца!
0 |
Gibboustooth 735 / 203 / 11 Регистрация: 23.06.2011 Сообщений: 440 |
||||
07.06.2012, 10:07 |
10 |
|||
Application.FileSearch is so 20th century Добавление Now в имя файла
Константу sFileName, соответственно, нужно написать вместо «test.txt» просто «test».
0 |
0 / 0 / 0 Регистрация: 04.06.2012 Сообщений: 12 |
|
07.06.2012, 10:42 [ТС] |
11 |
Ок! Application.FileSearch is so 20th century как лучше сделать?
0 |
Gibboustooth 735 / 203 / 11 Регистрация: 23.06.2011 Сообщений: 440 |
||||
07.06.2012, 12:30 |
12 |
|||
Чтение всех текстовых файлов в папке и запись данных на лист
1 |
0 / 0 / 0 Регистрация: 04.06.2012 Сообщений: 12 |
|
07.06.2012, 13:36 [ТС] |
13 |
Ругается на строчку:
0 |
735 / 203 / 11 Регистрация: 23.06.2011 Сообщений: 440 |
|
07.06.2012, 13:39 |
14 |
Ругается либо на формат даты, либо на знаки в пути к файлу. Попрбуйте написать Если сожрет, значит второе. Eсли нет — значит первое У вас какая версия Excel? (хотя врядли это может влиять. Я скорее грешу на региональные настройки Windows)
1 |
Dany_crm 0 / 0 / 0 Регистрация: 04.06.2012 Сообщений: 12 |
||||
07.06.2012, 13:55 [ТС] |
15 |
|||
Все равно ругается.
0 |
Gibboustooth 735 / 203 / 11 Регистрация: 23.06.2011 Сообщений: 440 |
||||
07.06.2012, 14:18 |
16 |
|||
Сейчас скину целиком код. Там еще есть проблемы. Добавлено через 13 минут Исправленный код отправки файла на почту.
1 |
0 / 0 / 0 Регистрация: 04.06.2012 Сообщений: 12 |
|
07.06.2012, 14:51 [ТС] |
17 |
Отлично! Заработало =) Теперь ошибка в импорте файлов User-Defined type not defined Sub ParceFiles()
0 |
Gibboustooth 735 / 203 / 11 Регистрация: 23.06.2011 Сообщений: 440 |
||||||||
07.06.2012, 14:55 |
18 |
|||||||
Ах, ну да. Вам нужна библиотека Microsoft Scripting Runtime (файл scrrun.dll).
вместо
Вроде бы особой разницы нет, но я предпочитаю все-таки подгружать библиотеки тех объектов, с которыми работаю.
1 |
0 / 0 / 0 Регистрация: 04.06.2012 Сообщений: 12 |
|
07.06.2012, 15:02 [ТС] |
19 |
ОГРОМНОЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО!
0 |
735 / 203 / 11 Регистрация: 23.06.2011 Сообщений: 440 |
|
07.06.2012, 15:06 |
20 |
На здоровье.
1 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
07.06.2012, 15:06 |
20 |
- Remove From My Forums
-
Question
-
Hi,
Is it possible to initiate a ping command from VBA to a list in the excel sheet and record the results in a different sheet.
I tried to call vbs and bat files from the VBA code, it worked but it would be better to have a single file to do everything.
WMI is not an option because the ping is to different network equipment not normal PC’s.
PowerShell is not an option because we are still using windows XP.
Currently I use a batch file and save the results to a text file.
Any hints appreciated.
Thanks.
-
Changed type
Thursday, March 4, 2010 7:54 PM
Is in fact a question not a general discussion. -
Moved by
Bill_Stewart
Friday, September 13, 2013 2:23 PM
Move to more appropriate forum
-
Changed type
Answers
-
use wmi ping (for Windows hosts)
-
Function sPing(sHost) As String
-
Dim oPing As Object, oRetStatus As Object
-
Set oPing = GetObject(«winmgmts:{impersonationLevel=impersonate}»).ExecQuery _
-
(«select * from Win32_PingStatus where address = ‘» & sHost & «‘»)
-
For Each oRetStatus In oPing
-
If IsNull(oRetStatus.StatusCode) Or oRetStatus.StatusCode <> 0 Then
-
sPing = «Status code is « & oRetStatus.StatusCode
-
Else
-
sPing = «Pinging « & sHost & » with « & oRetStatus.BufferSize & » bytes of data:» & Chr(10) & Chr(10)
-
sPing = sPing & «Time (ms) = « & vbTab & oRetStatus.ResponseTime & Chr(10)
-
sPing = sPing & «TTL (s) = « & vbTab & vbTab & oRetStatus.ResponseTimeToLive
-
End If
-
Next
-
End Function
-
Sub TestPing()
-
End Sub
-
Marked as answer by
IamMred
Thursday, March 4, 2010 7:55 PM
-
-
Alfoulad, you «can» use ping via a shell command. It’s a bit messy as you have to go outside of excel. The other way is to use ICMP Echo. Best to add it as a module and then you can re use it in other files easily.
I don’t have the exact code on me but here is a decent Microsoft article (for VB6) http://support.microsoft.com/kb/300197 .I do have a full working ping module in Excel at home. So if you can’t work it out from that article post up here in the next 6-7 hours and I will grab my code from home.
-
Marked as answer by
IamMred
Thursday, March 4, 2010 7:55 PM
-
Marked as answer by
Здравствуйте! Подскажите, пожалуйста, как можно решить задачу контроля в файле Excel состояния сетевого подключения компьютера (компьютер включен в локальную сеть)? Т.е. если сеть включена, то в определенную ячейку вводиться «1», если сеть отключена то «0». |
|
А как проверить, что «компьютер включен в локальную сеть»? Достаточно, чтобы к сетевой карте компа было что-то подключено? Я бы выбрал второй вариант — в таких случаях проверяю наличие пинга до нужного компьютера. Если надо, выложу файл, в котором в ячейках работают формулы типа =PING(«192.168.1.4») Можно проверить и состояние сетевой карты, но это будет посложнее. |
|
{quote}{login=EducatedFool}{date=28.09.2009 04:54}{thema=}{post}А как проверить, что «компьютер включен в локальную сеть»? Достаточно, чтобы к сетевой карте компа было что-то подключено? Я бы выбрал второй вариант — в таких случаях проверяю наличие пинга до нужного компьютера. Если надо, выложу файл, в котором в ячейках работают формулы типа =PING(«192.168.1.4») Можно проверить и состояние сетевой карты, но это будет посложнее.{/post}{/quote} Будьте добры, выложите пожалуйста пример (второй вариант). |
|
Вот пример файла, который при открытии проверяет доступность указанных IP-адресов: http://excelvba.ru/XL_Files/Sample__28-09-2009__7-05-42.zip (файл будет работать далеко не у всех) А вот и обещанный файл: http://excelvba.ru/XL_Files/Sample__28-09-2009__7-12-50.zip В нём доступны формулы типа этих: =PingEx(A2) =InternetConnectionAvailable() |
|
{quote}{login=EducatedFool}{date=28.09.2009 05:09}{thema=}{post}Вот пример файла, который при открытии проверяет доступность указанных IP-адресов: http://excelvba.ru/XL_Files/Sample__28-09-2009__7-05-42.zip (файл будет работать далеко не у всех) А вот и обещанный файл: http://excelvba.ru/XL_Files/Sample__28-09-2009__7-12-50.zip В нём доступны формулы типа этих: =PingEx(A2) =InternetConnectionAvailable() Пребольшущие спасибо! Еще один вопросик. Можно ли средствами VBA распознать к примеру открыт ли проводник Windows или закрыт? |
|
> И вопрос по второму варианту, как долго идет PING? Если пинг прошёл, то после первого успешного пакета выводится результат. Пинг работает раз в 10 быстрее, чем при помощи встроенной в Винду программы ping.exe (в ней есть таймауты. в моём варианте таймаутов нет) |
|
> Можно ли средствами VBA распознать к примеру открыт ли проводник Windows или закрыт? Да, можно. (используя WinAPI, можно сделать всё, что угодно) |
|
{quote}{login=EducatedFool}{date=28.09.2009 05:14}{thema=}{post}> Можно ли средствами VBA распознать к примеру открыт ли проводник Windows или закрыт? Да, можно. (используя WinAPI, можно сделать всё, что угодно) Спасибо, попробую разобраться с этой функцией, главное наметка есть. |
|
Вообще, проверить наличие запущенного приложения можно гораздо проще: Sub test2() Как-то аналогично, скорее всего, можно проверить наличие запущенного Explorer-a: Sub test() |
|
Alex28 Гость |
#10 28.09.2009 05:42:32 {quote}{login=EducatedFool}{date=28.09.2009 05:32}{thema=}{post}Вообще, проверить наличие запущенного приложения можно гораздо проще: Sub test2() Как-то аналогично, скорее всего, можно проверить наличие запущенного Explorer-a: Sub test() Спасибо, проверил с Word-ом OK все получается, а вот с проводником нет. Проводник открыт а пишет что «не запущен». |