View Full Version : [EXCEL] pingare una serie di host
Stigmata
29-09-2009, 15:44
Ciao a tutti, devo fare un foglio excel con una macro che funzioni così
colonna A = elenco di nomi di pc (stiamo sui 300 circa)
colonna B = risultato del ping (mi basta sapere se l'host è vivo o meno)
Avete qualche idea, contando che sono completamente a zero in fatto di programmazione?
Non vorrei deluderti ma excel non è fatto per queste cose. Una cosa del genere si fa abbastanza velocemente con un qualsiasi linguaggio di programmazione, non con un foglio elettronico.
Stigmata
29-09-2009, 16:49
D'accordo, ma avere un riscontro visivo immediato del risultato dei ping mi farebbe molto comodo.
RaouL_BennetH
29-09-2009, 16:50
D'accordo, ma avere un riscontro visivo immediato del risultato dei ping mi farebbe molto comodo.
soluzione molto rozza:
ping (le tue opzioni) xxx.xxx.xxx.xxx > aliveHosts.txt
Dopodichè importi il txt in excel :sofico:
Stigmata
29-09-2009, 16:52
soluzione molto rozza:
ping (le tue opzioni) xxx.xxx.xxx.xxx > aliveHosts.txt
Dopodichè importi il txt in excel :sofico:
sono 300 host... e potrebbero cambiare gli ip quindi non posso andare con l'indirizzo di rete
yorkeiser
29-09-2009, 17:06
Credo tu possa farlo anche con Excel utilizzando un po' di VBA, visto che (purtroppo) ti permette tranquillamente di lanciare programmi esterni, quindi anche quelli della shell.
Ad esempio, mi viene in mente una macro del genere
Dim i As Integer
Dim cmd As String
dim MAX_HOST as Integer
MAX_HOST = 300
For i = 1 To MAX_HOST
cmd = "ping " & Cells(i, 1) & " >> c:\temp.txt"
Shell "cmd /c " & cmd, vbHide
Next i
End Sub
A questo punto, in c:\temp.txt avresti tutti i risultati dei ping: puoi aprire questo file ancora da VBA ed andare a leggere le righe che ti interessano, scrivendo i dati desiderati nella seconda colonna dell'Excel. Non ho idea se il comando VBA Shell permetta di ritornare direttamente al programma l'output ottenuto dal comando, quindi senza passare dal file intermedio
oppure una robina così in dos
echo off
for /F "tokens=* delims= " %%a in (host.txt) do call :PROVA %%a
:PROVA
set host=%1
ping -n 1 %host%>NULL
goto pong%ERRORLEVEL% %host%
goto :EOF
:pong0
echo %1 - LIVE
goto :EOF
:pong1
echo %1 - DEAD
goto :EOF
Ciao a tutti, devo fare un foglio excel con una macro che funzioni così
colonna A = elenco di nomi di pc (stiamo sui 300 circa)
colonna B = risultato del ping (mi basta sapere se l'host è vivo o meno)
1. In VBA è certamente possibile, con qualche chiamata API, ma non ho mai provato, e non la vedo una soluzione tanto pratica.
2. La soluzione che ti propongo, solo apparentemente più complicata, è di sfruttare la potenza di .NET ( basta che ti scarichi VB.NET Express 2008, gratuito ). Tutto quello che serve è una semplicissima Form VB con un pulsante. Dal momento che VB.NET da decisamente del tu a networking e applicativi Office, perchè non sfruttarlo ?
In VB.NET il Ping è tanto semplice quanto lo è pensarlo :
Try
risultatoPing = My.Computer.Network.Ping(nomeHost, timeOutPing)
If risultatoPing = True Then
MsgBox("OK")
Else
MsgBox("TimeOut")
End If
Catch ex As Exception
MsgBox("Errore")
End Try
Basterà leggere il file Excel che in colonna A ( nell'esempio da A1 a A5 ) ha i nomi degli host ( o indirizzi IP ), e compilare la colonna B a seconda del risultato del Ping... :
Public Class Form1
Private appExcel As New Microsoft.Office.Interop.Excel.Application
Private Sub cmd_ping_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_ping.Click
Dim percorso As String = Application.StartupPath & "\"
Dim nomeFile As String = "Hosts.xls"
Dim WB As Microsoft.Office.Interop.Excel.Workbook = appExcel.Workbooks.Open(percorso & nomeFile)
Dim WS As Microsoft.Office.Interop.Excel.Worksheet = WB.Worksheets("Foglio1")
appExcel.Visible = True
Dim nomeHost As String = ""
Dim risultatoPing As Boolean = False
Dim timeOutPing As Integer = 1000 'millisec
For i As Integer = 1 To 5
nomeHost = WS.Range("A" & i).Text
Try
risultatoPing = My.Computer.Network.Ping(nomeHost, timeOutPing)
If risultatoPing = True Then
WS.Range("B" & i).FormulaR1C1 = "OK"
Else
WS.Range("B" & i).FormulaR1C1 = "TimeOut"
End If
Catch ex As Exception
WS.Range("B" & i).FormulaR1C1 = "Errore"
End Try
Next
End Sub
End Class
... e il gioco è fatto ! ;)
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.