Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Trovare il CAP in una stringa di testo

229 views
Skip to first unread message

Frank

unread,
Oct 17, 2007, 4:05:16 AM10/17/07
to
Ciao a tutti !!
Dovrei trovare il CAP (5 numeri) all'interno di una stringa di testo (un
indirizzo), fino ad adesso sono riuscito a trovare questo:

=TROVA("34055";B1)

Cosa posso mettere al posto di quel "34055" che indichi una serie di
qualsiasi numero ?
Grazie 1000,
Francesco ;-)

fernando cinquegrani

unread,
Oct 17, 2007, 4:22:58 AM10/17/07
to

"Frank" <levamif...@levamiemail.it> ha scritto nel messaggio
news:%23cuI$RJEIH...@TK2MSFTNGP04.phx.gbl...

> Ciao a tutti !!
> Dovrei trovare il CAP (5 numeri) all'interno di una stringa di testo (un
> indirizzo), fino ad adesso sono riuscito a trovare questo:
>
> =TROVA("34055";B1)
>
vedi:
http://groups.google.com/group/microsoft.public.it.office.excel/msg/c35efa4689d8e1b4
poi usa
=testo(supercerca(A1;"[0-9]{5}");"00000")
.f


fernando cinquegrani

unread,
Oct 17, 2007, 4:48:18 AM10/17/07
to

"fernando cinquegrani" <f.cinq...@xroxxmxxxa.it> ha scritto nel
messaggio news:etYw2bJE...@TK2MSFTNGP02.phx.gbl...

>
> "Frank" <levamif...@levamiemail.it> ha scritto nel messaggio
> news:%23cuI$RJEIH...@TK2MSFTNGP04.phx.gbl...
>> Ciao a tutti !!
>> Dovrei trovare il CAP (5 numeri) all'interno di una stringa di testo (un
>> indirizzo), fino ad adesso sono riuscito a trovare questo:
>>
>> =TROVA("34055";B1)

oops!
il messaggio era questo
http://groups.google.com/group/microsoft.public.it.office.excel/msg/a93e45d9cc9c562a
e la formula questa
=supersostituisci(A8;".*([0-9]{5}).*";"$1")
.f


ivano

unread,
Oct 17, 2007, 4:48:24 AM10/17/07
to

"Frank" <levamif...@levamiemail.it> ha scritto nel messaggio
news:%23cuI$RJEIH...@TK2MSFTNGP04.phx.gbl...

Ciao,
se il testo in A1:
=MIN(SE(VAL.NUMERO(--(STRINGA.ESTRAI(A1;RIF.RIGA(INDIRETTO("a1:a"&LUNGHEZZA(A1)));1)));RIF.RIGA(INDIRETTO("a1:a"&LUNGHEZZA(A1)));""))
da inserirsi con ctrl+maiusc+invio

per estrarre il CAP (5 caratteri):
=STRINGA.ESTRAI(A1;MIN(SE(VAL.NUMERO(--(STRINGA.ESTRAI(A1;RIF.RIGA(INDIRETTO("a1:a"&LUNGHEZZA(A1)));1)));RIF.RIGA(INDIRETTO("a1:a"&LUNGHEZZA(A1)));""));5)
sempre CTRL+MAIUSC+INVIO

ivano

eliano

unread,
Oct 17, 2007, 5:15:02 AM10/17/07
to

"Frank" ha scritto:

Ciao Frank.
Vedo che fernando & ivano (ciao & ciao) ti hanno già risposto con soluzioni
adeguate, alle quali aggiungo una possibile soluzione in Vba.

Public Sub provaCap()
Dim CL As Range
Dim RNG As Range
Dim B() As String
Dim I As Long
Dim Cap As Long
Dim test As String
Dim X As Long
Sheets("Foglio1").Select
Set RNG = Range("a1:a100") ' <----- da variare
Range("B1:Z100") = "" ' <----- da variare
Cap = 5
For Each CL In RNG
'CL.Interior.ColorIndex = xlNone
X = 0
B = Split(CL, " ")
For I = LBound(B) To UBound(B)
If B(I) = "" Then Exit Sub
test = B(I)
If IsNumeric(test) Then
If Len(test) = Cap Then
X = X + 1
Cells(CL.Row, CL.Column + X) = B(I)
'CL.Interior.ColorIndex = 4
End If
End If
Next
Next
End Sub

Eliano

Frank

unread,
Oct 17, 2007, 6:15:40 AM10/17/07
to
Frank ha scritto:

> Cosa posso mettere al posto di quel "34055" che indichi una serie di
> qualsiasi numero ?
> Grazie 1000,
> Francesco ;-)


Grazie per le risposte fernando & ivano & eliano ma non ci ho capito e
non sono riuscito a fare niente perche' sono "mooolto" indietro !!!

Provo a rispiegare il problema cosi' magari mi dite su quale delle 3
soluzioni posso lavorare.

Ho una stringa tipo questa "via carducci 33 34055 cologno BG".

Con la funzione "=TROVA("34055";B1)" vorrei trovare la posizione
iniziale del CAP , dopo ci faccio altre elaborazioni che non sto a
elencarvi.
Praticamente ho bisogno di qualcosa che sostituisca quel "34055" in
maniera che qualsiasi 5 numeri "appiccicati" mi restituiscano la
posizione suddetta.

Spero di aver spiegato meglio il problema, Grazie ancora
Francesco ;-)

ivano

unread,
Oct 17, 2007, 6:33:19 AM10/17/07
to

"Frank" <levamif...@levamiemail.it> ha scritto nel messaggio
news:%23KiySbK...@TK2MSFTNGP05.phx.gbl...

Ciao,
le formule o macro potrebbero incontrare difficoltà in qunato vi è di mezzo
anche il numero civico.

Prova allora più semplicemente fare una copia dei dati in altra posizione,
selezionare l'intervallo dati,
menu Dati-> Testo in colonne ->(o) larghezza fissa
dovresti ottenere una colonna per i CAP.
ivano


Frank

unread,
Oct 17, 2007, 7:04:14 AM10/17/07
to
ivano ha scritto:

> menu Dati-> Testo in colonne ->(o) larghezza fissa
> dovresti ottenere una colonna per i CAP.
> ivano
>
>

Non e' quello che voglio io.
Torno indietro e spiego meglio.

Mi arrivano molti indirizzi formattati in una unica stringa di testo del
tipo


"via carducci 33 34055 cologno BG".

Ho bisogno di dividere quella stringa in 2,
il risultato deve essere cosi' :

Prima stringa "via carducci 33"
Seconda stringa "34055 cologno BG"

Il dato comune a tutta la serie di indirizzi e' quel CAP di 5 numeri per
cui se riesco a trovarne la posizione posso, con vari passaggi e
relative formule, a dividere quella stringa nel solito punto con tutte.

Grazie per la pazienza,
Francesco ;-)


fernando cinquegrani

unread,
Oct 17, 2007, 7:05:31 AM10/17/07
to
"Frank" <levamif...@levamiemail.it> ha scritto nel messaggio
news:%23KiySbK...@TK2MSFTNGP05.phx.gbl...
> Ho una stringa tipo questa "via carducci 33 34055 cologno BG".
>
> Con la funzione "=TROVA("34055";B1)" vorrei trovare la posizione iniziale
> del CAP , dopo ci faccio altre elaborazioni che non sto a elencarvi.

ok, capito.
vai in vbe (Alt+F11)
da menu: inserisci :: modulo
in modulo1 incolla

Public Function SuperTrova(strWhere As Variant, strWhat As String, strWith
As String) As Variant
Dim regexp As Object
Set regexp = CreateObject("VBScript.RegExp")
regexp.Global = True
regexp.IgnoreCase = True
regexp.Pattern = strWhat
If regexp.test(strWhere) Then SuperTrova = InStr(strWhere,
regexp.Replace(strWhere, strWith)) Else SuperTrova = ""
Set regexp = Nothing
End Function

sul foglio quindi
in A1
via larga 123 00145 roma
in B1
=supertrova(A1;".*([0-9]{5}).*";"$1")
ti darà 14
in C1
=se(b1="";"";stringa.estrai(a1;b1;5))
ti darà 00145
.f


ivano

unread,
Oct 17, 2007, 7:56:04 AM10/17/07
to

"Frank" <levamif...@levamiemail.it> ha scritto nel messaggio
news:%23weN71K...@TK2MSFTNGP02.phx.gbl...

Ciao,
per la prima parte:
metti il testo in A1
Seleziona la cella B1
copia questa formula sottostante nella barra formula

=STRINGA.ESTRAI(A1;1;MAX(SE(VAL.NUMERO(--(STRINGA.ESTRAI(A1;RIF.RIGA(INDIRETTO("a1:a"&LUNGHEZZA(A1)));1)));RIF.RIGA(INDIRETTO("a1:a"&LUNGHEZZA(A1)));""))-5)

e inseriscila premendo contemporaneamente ctrl maiusc invio

Nella cella C1 metti:
=SOSTITUISCI(A1;B1;"")

ivano


eliano

unread,
Oct 17, 2007, 11:38:01 AM10/17/07
to

"Frank" ha scritto:

Ciao francesco.
E ce lo potevi dire subito.:-))
Prova, con l'anagrafico in colonna A:

Public Sub provaCap2()
Dim CL As Object


Dim RNG As Range
Dim B() As String
Dim I As Long
Dim Cap As Long

Dim P As Long
Dim cerca


Dim test As String
Dim X As Long
Sheets("Foglio1").Select

Cap = 5


Set RNG = Range("a1:a100") ' <----- da variare

For Each CL In RNG

X = 0
B = Split(CL, " ")
For I = LBound(B) To UBound(B)
If B(I) = "" Then Exit Sub
test = B(I)
If IsNumeric(test) Then
If Len(test) = Cap Then
X = X + 1

P = InStr(CL, B(I))
CL.Offset(0, 1).Value = Left(CL, P - 1)
CL.Offset(0, 2).Value = Right(CL, Len(CL) - P + 1)


End If
End If
Next
Next
End Sub

Facci sapere.
Eliano

eliano

unread,
Oct 17, 2007, 11:46:03 AM10/17/07
to

"eliano" ha scritto:

C'è rimasto un "Dim cerca" usato per controllo; lo puoi cancellare se ti da
fastidio.

Frank

unread,
Oct 17, 2007, 12:01:25 PM10/17/07
to
Frank ha scritto:
> Ciao a tutti !!

Risolto !!!

Mi e' stato piu' congeniale x il mio uso il consiglio di ivano, comunque
grazie a tutti per la disponibilita', alla prossima ...

Francesco ;-)

am A.

unread,
Oct 18, 2007, 4:23:28 PM10/18/07
to
Il 17/10/2007, fernando cinquegrani ha detto :

lungi da me confutare :-@ ....ma cosi mi sembra decisamente + semplice

Public Function Cap(C As Range)
Dim RegEX As Object, RegCollection As Object, RegMatch As Object,
MyCap As String
Set RegEX = CreateObject("vbscript.regexp")

With RegEX
.Global = True
.Pattern = "\d{5,5}"
End With
MyCap = ""
Set RegCollection = RegEX.Execute(C.Value)
For Each RegMatch In RegCollection
MyCap = MyCap & RegMatch
Next
Cap = MyCap
Set RegCollection = Nothing
Set RegEX = Nothing
End Function

in B1 =Cap(A1)

--
am. A.

dal blog del " Vero Programmatore"
Il Vero Programmatore sa che il freelancing si fa nello spazio se si è
fedeli a microsoft.


fernando cinquegrani

unread,
Oct 18, 2007, 7:10:44 PM10/18/07
to
"am A." <a5.al...@TOGLIgmail.com> ha scritto nel messaggio
news:mn.953f7d7a1...@TOGLIgmail.com...

>>> Ho una stringa tipo questa "via carducci 33 34055 cologno BG".

> lungi da me confutare :-@ ....ma cosi mi sembra decisamente + semplice

si vuol conoscere la posizione del cap, non il cap
(leggi i post precedenti. convengo che anche questa
si potrebbe scrivere in 100 modi più semplici.
mi sono limitato a mostrare come andava corretto
un codice già postato).
.f

eliano

unread,
Oct 19, 2007, 11:18:00 AM10/19/07
to

"am A." ha scritto:

Ciao am.
Basta un Instr().

Public Function Cap(C As Range)
Dim RegEX As Object, RegCollection As Object, RegMatch As Object, MyCap As
String
Set RegEX = CreateObject("vbscript.regexp")

With RegEX
.Global = True
.Pattern = "\d{5,5}"
End With
MyCap = ""
Set RegCollection = RegEX.Execute(C.Value)
For Each RegMatch In RegCollection
MyCap = MyCap & RegMatch
Next

Cap = InStr(C, MyCap) <-----------

Set RegCollection = Nothing
Set RegEX = Nothing
End Function

Comunque per la semplicità, cioè per la comprensibilità da parte dei non
iniziati come me, resto fedele alle mie "artigianali".:-))
Eliano

fernando cinquegrani

unread,
Oct 19, 2007, 11:58:19 AM10/19/07
to

"eliano" <eli...@discussions.microsoft.com> ha scritto nel messaggio
news:519D9361-B821-4365...@microsoft.com...

> Ciao am.
> Basta un Instr().

non basta.
prova con via carducci 33 0013 roma
o con via carducci 33 roma :-)
.f


eliano

unread,
Oct 19, 2007, 1:07:01 PM10/19/07
to

"fernando cinquegrani" ha scritto:

Ja mein lieben freund fernando.
La preoccupazione principale nella realizzazione di un progetto dovrebbe
riguardare proprio il non farsi fregare da errori, dimenticanze, et similia
dovute ad utenti distratti o tanto sfaticati da non digitare addirittura il
Cap, cappero.:-))
Grazie, provvedo per quanto riguarda la mia routine e ti saluto con
l'estrema reverenza, baciando le medaglie, oh mein fuhrer.:-))
Eliano

am A.

unread,
Oct 19, 2007, 4:17:31 PM10/19/07
to
Sembra che eliano abbia detto :

> "am A." ha scritto:

>> Il 17/10/2007, fernando cinquegrani ha detto :
>>> "Frank" <levamif...@levamiemail.it> ha scritto nel messaggio
>>> news:%23KiySbK...@TK2MSFTNGP05.phx.gbl...
>>>> Ho una stringa tipo questa "via carducci 33 34055 cologno BG".
>>>>
>>>> Con la funzione "=TROVA("34055";B1)" vorrei trovare la posizione iniziale
>>>> del CAP , dopo ci faccio altre elaborazioni che non sto a elencarvi.

> Ciao am.
> Basta un Instr().

> Public Function Cap(C As Range)
> Dim RegEX As Object, RegCollection As Object, RegMatch As Object, MyCap As
> String
> Set RegEX = CreateObject("vbscript.regexp")

> With RegEX
> .Global = True
> .Pattern = "\d{5,5}"
> End With
> MyCap = ""
> Set RegCollection = RegEX.Execute(C.Value)
> For Each RegMatch In RegCollection
> MyCap = MyCap & RegMatch
> Next
> Cap = InStr(C, MyCap) <-----------
> Set RegCollection = Nothing
> Set RegEX = Nothing
> End Function

> Comunque per la semplicità, cioè per la comprensibilità da parte dei non
> iniziati come me, resto fedele alle mie "artigianali".:-))
> Eliano

come mi ha fatto notare Fernando avevo male interpretato il post..cmq
giusto per studio :D si potrebbe trasformare in

Public Sub Cap()


Dim RegEX As Object, RegCollection As Object, RegMatch As Object, MyCap
As String
Set RegEX = CreateObject("vbscript.regexp")

Dim C As Range, D As Range
Set C = Selection
Dim DStr As Long
Dim FstStr As Long


With RegEX
.Global = True
.Pattern = "\d{5,5}"
End With

For Each D In C
DStr = Len(D)
MyCap = ""
Set RegCollection = RegEX.Execute(D.Value)


For Each RegMatch In RegCollection
MyCap = MyCap & RegMatch
Next

FstStr = InStr(D, MyCap) - 1
D.Offset(0, 1) = Left(D, FstStr)
D.Offset(0, 2) = Right(D, DStr - FstStr)
Next


Set RegCollection = Nothing
Set RegEX = Nothing

End Sub

..ma concordo sul fatto che esistano vie + semplici
------


>non basta.
>prova con via carducci 33 0013 roma

>o con via carducci 33 roma f.

avevo capito che si volesse dividere la stringa prima e dopo il CAP

>>Ho bisogno di dividere quella stringa in 2,
>>il risultato deve essere cosi' :

>>Prima stringa "via carducci 33"
>>Seconda stringa "34055 cologno BG"

--
am. A.

dal blog del " Vero Programmatore"

Il Vero Programmatore va in giro in mech; non in porche.


eliano

unread,
Oct 19, 2007, 5:27:01 PM10/19/07
to

"fernando cinquegrani" ha scritto:

Ciao fernando.
La mia artigianale dovrebbe funzionare anche nei due casi da te evidenziati,
nel senso che non avendo niente da dividere (cap non valido o comunque
mancante) dovrebbe lasciare le colonne B e C bianche. Dico dovrebbe perchè
non avendo excel su questo catorcio potrò provarla solodomani.
Mi sono accorto di una cosa: per motivi di controllo veloce della routine
avevo inserito un exit sub che poi mi ero dimenticato di eliminare, per cui
si fermava alla prima riga del file. Scuse al NG e grazie rinnovate a te.
La routine dovrebbe essere questa nella versione definitiva:


Public Sub provaCap2()
Dim CL As Object
Dim RNG As Range
Dim B() As String
Dim I As Long
Dim Cap As Long
Dim P As Long

'Dim cerca questo non c'entra niente


Dim test As String
Dim X As Long
Sheets("Foglio1").Select
Cap = 5
Set RNG = Range("a1:a100") ' <----- da variare
For Each CL In RNG
X = 0
B = Split(CL, " ")
For I = LBound(B) To UBound(B)

' If B(I) = "" Then Exit Sub <--- inserito per prove e dimenticato


test = B(I)
If IsNumeric(test) Then
If Len(test) = Cap Then
X = X + 1
P = InStr(CL, B(I))
CL.Offset(0, 1).Value = Left(CL, P - 1)
CL.Offset(0, 2).Value = Right(CL, Len(CL) - P + 1)
End If
End If
Next
Next
End Sub

Con un cordiale saluto
Eliano

0 new messages