IP
10.10.64.34
10.10.64.37
10.10.64.35
10.10.64.43
Ed ecco quella che vorrei avere:
IP
10.10.64.34
10.10.64.35
10.10.64.37
10.10.64.43
Potete aiutarmi?
Grazie
Ciao,
E.
Ciao Plinius,
una variante più veloce, ma anche una scusa per salutarti:
Public Function IPbis(ByVal arg As String) As String
Dim aParte() As String
Dim j As Integer
aParte = Split(arg, ".")
For j = 0 To 2
IPbis = IPbis & Format(aParte(j), "000") & "."
Next
IPbis = IPbis & Format(aParte(j), "000")
End Function
--
Bye!
Scossa
ciao a tutti,
ci provo anch'io ...
Function Format_IP(sIP As String) As String
'restituisce un indirizzo IP nel formato
'a 3 cifre fisse
'passando per es.1.12.123.4 restituisce
'001.012.123.004
Dim re As New RegExp
With re
.Global = True
.Pattern = "(\d{1,3})($|\.)"
Format_IP = .Replace(sIP, "00$&")
.Pattern = "0+(\d{3})($|\.)"
Format_IP = .Replace(Format_IP, "$1$2")
End With
End Function
comunque prima sempre meglio verificare si tratti veramente di un
indirizzo IP ...
Function IsIP(sIP As String) As Boolean
'verifica un indirizzo IP
Dim re
Set re = CreateObject("vbscript.regexp")
If Right(sIP, 1) <> "." Then
re.Pattern = "^((25[0-5]|2[0-4]\d" & _
"|1\d\d|[1-9]\d|\d)" & _
"(\.|$)){4}"
IsIP = re.Test(sIP)
End If
End Function
saluti
r
Ciao Plimius,
> Per la trasformazione, per esempio, una UDF:
> -----------
> Public Function IP(arg As String) As String
Mi sembra che abbia dei problemi, ad esempio con:
10.108.66.232 restituisce 010.010.08..066.023.002
Bye!
Scossa
Dovrò proprio mettermi a studiarle 'ste RegExp !
Però sono leeente :-)
Bye!
Scossa
intanto una versione con singolo pattern:
Public Function Ipr(ByVal arg As String) As String 'variant?
Dim re, v
Set re = CreateObject("VbScript.Regexp")
arg = arg
With re
.Global = True
.Pattern = "0*?(\d{1,3})(\.|$)"
Ipr = .Replace(.Replace(arg, "00$1$2"), "$1$2")
End With
End Function
per il resto puoi leggere se hai voglia qui :-)
http://groups.google.it/group/microsoft.public.it.office.excel/msg/d4a8e2779fca87af?hl=it
ciao
r
Vero...:-\ meglio cosě:
------------
Public Function IP(arg As String) As String
Dim re, part, i As Long
Set re = CreateObject("VbScript.RegExp")
With re
.Global = True
.Pattern = "\d+.|\d+"
Set part = .Execute(arg)
End With
If part.Count <> 4 Then Exit Function
For i = 0 To 2
IP = IP & Right("000" & part(i), 4)
Next
IP = IP & Right("000" & part(i), 3)
End Function
---------------
Ciao,
E. :-)
ovviamente era da ripulire :-) ... non effettua verifica sulla
validità dell'ip
Public Function Ipr(ByVal arg As String) As String
Dim re
Set re = CreateObject("VbScript.Regexp")
With re
.Global = True
.Pattern = "0*?(\d{1,3})(\.|$)"
Ipr = .Replace(.Replace(arg, "00$1$2"), "$1$2")
End With
End Function
saluti
r
Letto, interessante StopWatch, ma soprattutto:
r > sulla potenzialità di reg exp ... non discuto perchè
r > 1 ancora non ho le conoscenze adeguate
LOL!
a leggerlo adesso che ci fai il caffè con le RegExp :-)
> intanto una versione con singolo pattern:
> Public Function Ipr(ByVal arg As String) As String 'variant
Però resta più lenta della mia :-))
test fattto ad occhio A1:A3000 lo stesso IP
in B1 di volta in volta le tre formule, copia-incolla fino a B3000.
Contando a mente 7 secondi la tua, 5 la mia :-)))
Bye!
Scossa
Letto, interessante StopWatch, ma soprattutto:
r > sulla potenzialit� di reg exp ... non discuto perch�
r > 1 ancora non ho le conoscenze adeguate
LOL!
a leggerlo adesso che ci fai il caff� con le RegExp :-)
> intanto una versione con singolo pattern:
> Public Function Ipr(ByVal arg As String) As String 'variant
Per� resta pi� lenta della mia :-))
test fattto ad occhio A1:A3000 lo stesso IP
in B1 di volta in volta le tre formule, copia-incolla fino a B3000.
Contando a mente 7 secondi la tua, 5 la mia :-)))
Bye!
Scossa
********************
Vedi Scossa, usare le regexp per queste cose � come usare una ruspa per
spostare una piuma: certo che fa prima un colibr�!! ehhheheh :-))
La loro potenzialit� sta nel consentirti di
analizzare/smembrare/controllare/parcellizzare/ricomporre/ecc. ecc. stringhe
in modo da riuscire a soddisfare qualunque esigenza si abbia.
In questo roberto � davvero bravo (il maestro) e a leggerlo c'� sempre da
imparare!
...IMHO...
Ciao,
E.
il senso di farti leggere il link era che ...
va beh mi sembrava d'esserci passato :-)
>
> > intanto una versione con singolo pattern:
> > Public Function Ipr(ByVal arg As String) As String 'variant
>
> Però resta più lenta della mia :-))
beh split non è certo veloce ...
al volo:
Function ip_r2(sIP As String) As String
Dim b() As Byte, i, l As Long
b = sIP
l = 15
ip_r2 = "000.000.000.000"
For i = UBound(b) - 1 To 0 Step -LenB("A")
If b(i) = 46 Then
l = l - l Mod 4
Else
Mid(ip_r2, l, 1) = Chr(b(i))
End If
l = l - 1
Next
End Function
questa non ho provato ma credo darà la paga ...
poi magari si può anche migliorare ... bisogna fare
le prove col cronometro :-)
> test fattto ad occhio A1:A3000 lo stesso IP
> in B1 di volta in volta le tre formule, copia-incolla fino a B3000.
> Contando a mente 7 secondi la tua, 5 la mia :-)))
le regexp sono un mondo molto bello e molto utile
l'associazione tardiva ha dei prezzi da pagare ma
volendo puntare alla velocità con associazione
anticipata le regexp in alcuni casi sono addirittura
più rapide
>
> Bye!
> Scossa
ciao
r
Infatti, mi ha fatto sorridere
>
> beh split non è certo veloce ...
> al volo:
>
> Function ip_r2(sIP As String) As String
> questa non ho provato ma credo darà la paga ...
> poi magari si può anche migliorare ...
Non così tanto: ho dovuto portare a 6000 righe per notare che la tua è
un secondo (sempre occhiometrico) più veloce :-)
Ma la tua soluzione è una *fonte di apprendimento* interessantissima e
ti ringrazio (adesso che la rivedo, mi viene in mente che già avevi
sfruttato la gestione a byte in altra occasione).
>
> le regexp sono un mondo molto bello e molto utile
> l'associazione tardiva ha dei prezzi da pagare ma
> volendo puntare alla velocità con associazione
> anticipata le regexp in alcuni casi sono addirittura
> più rapide
Puoi consigliarmi qualche link *valido* sulle RegExp, tra i tanti
suggeriti da google?
Bye!
Scossa
beh mi è toccato fare una prova :-)
non che non mi fidi ma parlare di secondi ...
diciamo che più o meno impiega la metà del tempo ...
>
> Ma la tua soluzione è una *fonte di apprendimento* interessantissima e
> ti ringrazio (adesso che la rivedo, mi viene in mente che già avevi
> sfruttato la gestione a byte in altra occasione).
non ho fatto prove in questo contesto ...
potrebbe essere che non sia necessario
visto che la lunghezza della stringa è esigua
certo per stringhe lunghe hai un guadagno notevole
cmunque difficilmente i tempi diventano così critici
da dover usare stratagemmi simili
>
>
>
> > le regexp sono un mondo molto bello e molto utile
> > l'associazione tardiva ha dei prezzi da pagare ma
> > volendo puntare alla velocità con associazione
> > anticipata le regexp in alcuni casi sono addirittura
> > più rapide
>
> Puoi consigliarmi qualche link *valido* sulle RegExp, tra i tanti
> suggeriti da google?
no ... non ancora per lo meno :-)
tempo un paio di settimane potrei linkarti la
*guida* che stiamo scrivendo ...
se però hai fretta ... la guida di vbscript accessibile
dall'editor vbscript di excel ...
è valida ...
>
> Bye!
> Scossa
saluti
r
Non capisco, a me sul pc di casa, su 6000 righe impiegano sia la tua che la
mia poco più di 1 secondo (sempre occhiometricamente: da quando premo invio
per incollare la formula sulle 6000 celle a quando lo schermo è aggiornato,
per 10000 righe siamo a 2,2 sec. entrambe, sicuramente la maggior parte del
tempo è persa ad aggiornare lo schermo).
> non ho fatto prove in questo contesto ...
> potrebbe essere che non sia necessario
> visto che la lunghezza della stringa è esigua
> certo per stringhe lunghe hai un guadagno notevole
> cmunque difficilmente i tempi diventano così critici
> da dover usare stratagemmi simili
Ma è interessante il "concetto", poi come negli scacchi, bisogna saper
"intuire", quando si presenta una certa posizione, che può essere più
facilmente risolta in un modo piuttosto che nell'altro.
> le regexp sono un mondo molto bello e molto utile
> l'associazione tardiva ha dei prezzi da pagare ma
> volendo puntare alla velocità con associazione
> anticipata le regexp in alcuni casi sono addirittura
> più rapide
???? se ti confesso che non ho capito (associazione tardiva .. anticipata),
mi spieghi terra-terra.
> > Puoi consigliarmi qualche link *valido* sulle RegExp, tra i tanti
> > suggeriti da google?
>
> no ... non ancora per lo meno :-)
> tempo un paio di settimane potrei linkarti la
> *guida* che stiamo scrivendo ...
Aspetto aspetto, vorrà dire che il mondo pazienterà ancora un po' prima di
avere i miei contributi con le RegExp :-))
Grazie ancora Roby.
--
Bye!
Scossa
Se ho capito.
Per vb6:
http://support.microsoft.com/kb/245115/it
Qui trovi un esempio per vbnet, ma la logica
è la stessa:
http://msdn.microsoft.com/it-it/library/0tcf61s1.aspx
La funzione di Roberto, riscritta in associazione anticipata, dovrebbe
essere:
Public Function f(ByVal arg As String) As String
Dim re As RegExp
Set re = New RegExp
With re
.Global = True
.Pattern = "0*?(\d{1,3})(\.|$)"
f = .Replace(.Replace(arg, "00$1$2"), "$1$2")
End With
Set re = Nothing
End Function
Devi però referenziare la libreria:
Microsoft VBScript Regular Expressions 5.5
Il vantaggio dell'associazione tardiva è, ad esempio,
quando utilizzi Excel da vb6 o da AutoCad e non ne conosci la
versione. Quindi *astrai* la chiamata e verrà
lanciato l'Excel che hai di default sulla macchina,
senza bisogno di riferimenti.
Paghi però in termini di prestazioni(molte volte
è inavvertibile la differenza).
Non utilizzo quasi mai le re. Roberto sarprà
spiegarti se referenziando la libreria rischi
di trovare versioni diverse su macchine diverse.
--
---------------------------
Mauro Gamberini
Microsoft MVP - Excel
http://www.riolab.org/
http://www.maurogsc.eu/
http://social.answers.microsoft.com/Forums/it-IT/officeexcelit/threads
__________ Informazioni da ESET NOD32 Antivirus, versione del database delle firme digitali 5029 (20100414) __________
Il messaggio è stato controllato da ESET NOD32 Antivirus.
OPS! adesso ho capito: early e late binding, conosco (piuttosto
superficialmente) l'argomento ma ho sempre usato il termine ingelese, LOL!
>
> Devi però referenziare la libreria:
> Microsoft VBScript Regular Expressions 5.5
>
> Il vantaggio dell'associazione tardiva è, ad esempio,
> quando utilizzi Excel da vb6 o da AutoCad e non ne conosci la
> versione. Quindi *astrai* la chiamata e verrà
> lanciato l'Excel che hai di default sulla macchina,
> senza bisogno di riferimenti.
> Paghi però in termini di prestazioni(molte volte
> è inavvertibile la differenza).
>
Ok, grazie.
--
Bye!
Scossa
Ciao,
La versione 5.0 di VBScript viene installata
automaticamente con IE a partire dalla versione 4.0
o forse 5.0 ... quindi dal lontano 1998? beh giù di li
Referenziando la libreria bisognerà fare attenzione
la vecchia versione 1.0 pur non differendo nella sostanza
offre minor numero di oggetti e proprietà.
mi accorgo solo ora che l'utile dll Help:
http://support.microsoft.com/dllhelp/?dlltype=prod&l=55&pid=2488&vid=36071&S=1&x=13&y=13
non è più disponibile (da febbraio) speriamo venga presto rimpiazzata
Il consiglio che do io è a chi volesse confrontarsi
con la libreria VBScript (oltre alle RegExp ricordiamolo
contiene il mondo FSO e l'utile Dictionary) è quello di scrivere
codice aggiungendo i riferimenti (dal menu strumenti dell'editor VB
-> riferimenti) In questo caso si avrà
a disposizioni alcuni strumenti (ntellisense e Visualizzatore
Oggetti) utili nella scrittura.
Riadattare poi una porzione di codice all'utilizzo con associazione
tardiva è abbastanza semplice e può essere fatto in poco
tempo a fine stesura.
saluti
r
p.s. per scossa ...
il punto centrale della discussione nata con Norman
(il link che ti segnalai) era proprio quello :-)
Norman poi dimostrò che le differenze nei tempi erano
veramente irrisorie ... e Maurizio ricordò a tutti la
il prezzo da pagare quando si usa un associazione
tardiva
In attesa della guida di Roberto(grande Robby, l'aspetto
con impazienza), questo link:
http://www.regular-expressions.info
--
---------------------------
Mauro Gamberini
Microsoft MVP - Excel
http://www.riolab.org/
http://www.maurogsc.eu/
http://social.answers.microsoft.com/Forums/it-IT/officeexcelit/threads
__________ Informazioni da ESET NOD32 Antivirus, versione del database delle firme digitali 5030 (20100415) __________
intanto una versione con singolo pattern:
Public Function Ipr(ByVal arg As String) As String 'variant?
Dim re, v
Set re = CreateObject("VbScript.Regexp")
arg = arg
With re
.Global = True
.Pattern = "0*?(\d{1,3})(\.|$)"
Ipr = .Replace(.Replace(arg, "00$1$2"), "$1$2")
End With
End Function
ciao
r
***********************
Malefico r e malefico "*?"!! :-)
Insomma i Matches riportano tutte le cifre di ciascuno dei quattro gruppi di
numeri, zeri inclusi, ma il 1^ dei 2 SubMatches (il secondo, se presente, č
il ".") includendo al massimo 3 cifre, se del caso sottrae degli zeri (fino
alle 3 cifre massime previste) al gruppo "0*?".
Dopo il primo Replace in cui aggiungi gli zeri, il secondo Replace,
ovviamente, conclude brillantemente il lavoro!
Quello che non capisco:
- ma allora la ricerca avviene al contrario (dalla fine all'inizio)?
- e, se sě, perché non funziona anche solo con "0*" senza "?"...
Uff... torno a studiare...
Ciao,
E.
sei già a buon punto quindi :-)
anche se la tua è un po' ... hum :-)
> - ma allora la ricerca avviene al contrario (dalla fine all'inizio)?
da sinistra a destra ...
prova a impostare a false la proprietà
global
> - e, se sì, perché non funziona anche solo con "0*" senza "?"...
* *? e ? sono tre diversi qualificatori
fanno cose diverse :-)
>
> Uff... torno a studiare...
dai dai ... studiando si ... impara :-)
già che ci sei ti do' un po' di materiale didattico :-)
Public Function Ipr2(ByVal arg As String) As String
Dim re, v
Set re = CreateObject("VbScript.Regexp")
With re
.Global = True
.Pattern = "(\d{1,3})(\.|$)"
For Each v In re.Execute(arg)
Ipr2 = Ipr2 & Format(v.SubMatches(0), "000") & v.SubMatches(1)
Next
End With
End Function
> Ciao,
> E.
ciao
r
Public Function Ipr2(ByVal arg As String) As String
Dim re, v
Set re = CreateObject("VbScript.Regexp")
With re
.Global = True
.Pattern = "(\d{1,3})(\.|$)"
For Each v In re.Execute(arg)
Ipr2 = Ipr2 & Format(v.SubMatches(0), "000") & v.SubMatches(1)
Next
End With
End Function
ciao
r
****************
Questa si capisce, è di "*?" che non so nulla! :-\
Perché non lo trovo da nessuna parte?
Mmmmmmh,
E. :-)
Sito linkato stamattina:
http://www.regular-expressions.info/reference.html
*? (lazy star)
"This construct is often excluded from documentation because of its limited
use."
Ecco, io ero capitato dove (da pigri) non parlano del "?" pigro...
Grazie Mauro, ora � tutto chiaro! :-)
ok ...
*? è un quantificatore Lazy
mentre *
è greedy
il primo tenta il confronto col minor numero di caratteri possibili
quindi
* zero o più corrispondenze mentre *? è la prima occorrenza che
consuma il minor numero di ripetizioni possibili
sono 2 cose diverse
p.s.
grazie Balena per avermelo insegnato
se no col cavolo che ci capivo qualcosa :-)
ok ...
*? č un quantificatore Lazy
mentre *
č greedy
il primo tenta il confronto col minor numero di caratteri possibili
quindi
* zero o piů corrispondenze mentre *? č la prima occorrenza che
consuma il minor numero di ripetizioni possibili
sono 2 cose diverse
p.s.
grazie Balena per avermelo insegnato
se no col cavolo che ci capivo qualcosa :-)
********************************
Eh adesso me lo dici eh?! :-\
emmenomalechecčanchemauro... eh eh :-)
LOL!
--
---------------------------
Mauro Gamberini
Microsoft MVP - Excel
http://www.riolab.org/
http://www.maurogsc.eu/
http://social.answers.microsoft.com/Forums/it-IT/officeexcelit/threads
__________ Informazioni da ESET NOD32 Antivirus, versione del database delle firme digitali 5030 (20100415) __________
Il messaggio è stato controllato da ESET NOD32 Antivirus.
Se lo trasformi in emmenomalechemaurocè e lo
metti in musica, mi presento alle prossime elezioni... 8-)
Anche tu a far danni??? :-\
Meglio di no, dŕi... resta tra le persone utili! :-))
p.s.
mi sono accorto rileggendo che il tono potrebbe sembrare
supponente ... ero di fretta e voleva solo essere solo un sincero
incitamento ...
preferisco le bastonate alle lusinghe ... da quelle si impara di
più ...
così dai ... studia e bastona che sai farlo a perfezione ... ecco
questo era il senso
Saluti
r
p.s.
mi sono accorto rileggendo che il tono potrebbe sembrare
supponente ... ero di fretta e voleva solo essere solo un sincero
incitamento ...
preferisco le bastonate alle lusinghe ... da quelle si impara di
pi� ...
cos� dai ... studia e bastona che sai farlo a perfezione ... ecco
questo era il senso
Saluti
r
*****************
Capito perfettamente roby, non preoccuparti! :-)
So bene quanto non so, e imparare mi piace. Da chi � in grado di darmi
lezioni, ben vengano gli sproni... e anche le bastonature!
Ciao,
E.
Un vero assurdo logico... ;-)
... tipo: io mento sempre... ;-)
Sto giocando, eh.
--
---------------------------
Mauro Gamberini
Microsoft MVP - Excel
http://www.riolab.org/
http://www.maurogsc.eu/
http://social.answers.microsoft.com/Forums/it-IT/officeexcelit/threads
__________ Informazioni da ESET NOD32 Antivirus, versione del database delle firme digitali 5032 (20100415) __________
> intanto una versione con singolo pattern:
>
> Public Function Ipr(ByVal arg As String) As String 'variant?
> Dim re, v
> Set re = CreateObject("VbScript.Regexp")
> arg = arg
> With re
> .Global = True
> .Pattern = "0*?(\d{1,3})(\.|$)"
> Ipr = .Replace(.Replace(arg, "00$1$2"), "$1$2")
> End With
> End Function
>
Intanto una versione con un singolo Replace:
Public Function IpNur(ByVal arg As String) As String
Dim re as Object
Set re = CreateObject("VbScript.Regexp")
With re
.Global = True
.Pattern = "(\d+)\.(\d+)\.(\d+)\.(\d+)"
On Error Resume Next
IpNur = Format(Evaluate( _
.Replace(arg, _
"$1E9+$2E6+$3E3+$4")), _
"000,000,000,000")
If Err Then IpNur = ""
End With
End Function
per r:
Lo so, ho usato On Error
Lo so, Evaluate è lento
Non mi 'bastonare' troppo :-)
per tutti:
era solo per partecipare a questo bel thread e salutarvi :-)
Ciao, Nur
> Public Function IpNur(ByVal arg As String) As String
> Dim re as Object
> Set re = CreateObject("VbScript.Regexp")
> With re
> .Global = True
> .Pattern = "(\d+)\.(\d+)\.(\d+)\.(\d+)"
> On Error Resume Next
> IpNur = Format(Evaluate( _
> .Replace(arg, _
> "$1E9+$2E6+$3E3+$4")), _
> "000,000,000,000")
> If Err Then IpNur = ""
> End With
> End Function
>
Mi correggo. Il Global a True qui non serve.
Mi è 'avanzato' da prove precedenti :-)
Ciao, Nur