Manipolazione stringhe

Storico discussioni

STRINGHE di ENZO
AVREI UN QUESITO DA SOTTOPORVI:
SE IN UNA CELLA EXCEL, ES A1 HO UN INDIRIZZO CON UN NUMERO CIVICO COME POSSO ESTRARRE IL NUMERO CIVICO OSSIA ELIMINARLO DALLA CELLA A1 E SPOSTARLO IN UN ALTRA CELLA ES. B1
HO PROVATO CON STRINGAESTRAI MA NON ME LA ELIMINA FISICAMENTE DALLA PRIMA CELLA
PONENDO LA DOMANDA IN UN ALTRO MODO:
DATO UN ELENCO DI INDIRIZZI POSTI IN A1 A2 A3 ETC
CHE MACRO POSSO COSTRUIRE AFFINCHE DA QUESTE CELLE VENGANO TOLTI I NUMERI CIVICI E POSTI NELLE CELLE ADIACENTI B1 B2 B3 ETC
GRAZIE

di Apoben64
Ciao Enzo, per quanto attiene da una parte del tuo quesito posto che in A1 hai : Viale Europa 36 , in B2 per estrarre il 36, digiti la formula =DESTRA(A1;2), dove "2" sono i caratteri che ti servono.

di Mauro
Potresti crearti una routine in vba che partendo da dx scansioni byte x byte estrae i numeri e li pone su una stringa mentre il resto in un'altra. Nella sezione sintassi c'è un paragrafo che tratta le funzioni di manipolazione delle stringhe in VB.
Dovrebbero bastarti le funzioni: Mid(), Len() e l'operatore IsNumeric.
Se hai voglia provaci, poi fammi sapere!
Probabilmente, con un po' di ingegno, c'è il modo di farlo anche con le formule di excel, senza chiamare in gioco VBA.

di ENZO
CARO MAURO HO PROVATO CON QUELLO CHE MI HAI DETTO TU. ES IN A1 HO "VIA PIPPO 2"
CON LA ROUTINE
A = Len(Range("A1.Value)
Range("B" & I).Select
ActiveCell.Value = A
OTTENGO IN B1 LA LUNGHEZZA DELLA MIA STRINGA
NON CAPISCO COME POSSO UTILIZZARE LE FUNZIONI MID E IS NUMERIC
CON MID ESTRAGGO DA UNA STRINGA QUELLO CHE VOGLIO MA DEVO INDICARGLI DA CHE POSIZIONE PARTIRE QUANTI BYTE E COSA ESTRARRE
CON ISNUMERIC OTTENGO VERO O FALSO SE LA STRINGA CONTIENE SOLO NUMERI O SOLO LETTERE
MA SE ES HO INDIRIZZI CON NUMERI CIVICI DIVERSI COME POSSO FARE ES VIA AAA 5 VIA AAA 55
TU MI PARLAVI DI ANALIZZARE DA DESTRA UNA STRINGA BYTE PER BYTE MA COME FACCIO A FARGLI RICONOSCERE I NUMERI ED ESTRARLI
ME PUOI THANKS

di mauro
... ma si va, giusto xchè 6 tu...

VarIni = "via Ugo Foscolo 3210"
LVarIni = Len(VarIni)
For I = LVarIni To 0 Step -1
If Not IsNumeric(Mid(VarIni, I, 1)) Then
Exit For
End If
Next
MsgBox Mid(VarIni, 1, I)
MsgBox Mid(VarIni, I + 1, LVarIni)

problema è se hai un numero civico 31/B.

di ENZO
TI RINGRAZIO SEI STATO VERAMENTE MOLTO GENTILE
PS. INFATTI IL PROBLEMA SI PONE SE IL NUMERO CIVICO E' 3/B

di enzo
caro mauro ma secondo te non c'e' il modo di baypassare la lettera del numero civico, considerando che il blocco del numero civico si distacca dall'indirizzo con degli spazi?

di Mauro
Puoi provare a mettere un altro ciclo in testa ke testi sempre byte x byte ma ke questa volta esca x isnumeric. e quindi estrarre la coda alfabetica della stringa. Devi essere sicuro però ke ci sia il numero civico, se no tagli fuori tutto.
Ad ogni modo adesso gli strumenti ci sono tutti, basta metterci solo un po' di logica ed il gioco è fatto.
Fammi sapere!
A presto.

di ENZO
GRAZIE MAURO PER IL TUO INTERVENTO
ORA NON MI CHIAMARE ROMPISCATOLE MA AVREI UN ALTRO QUESITO
AVENDO UN INDIRIZZO DEL TIPO 88 AVENUE XXXX
HO MODIFICATO LA TUA ROUTINE COSI
VarIni = "88 AVENUE XXXX"
LVarIni = Len(VarIni)
For I = 1 TO LVarIni Step 1
If Not IsNumeric(Mid(VarIni, I, 1)) Then
Exit For
End If
Next
MsgBox Mid(VarIni, 1, I)
MsgBox Mid(VarIni, I + 1, LVarIni)

IL PROBLEMA E' CHE MI ESTRAE IL NUMERO CIVICO PARTENDO DA DESTRA MA IPOTIZZANDO CHE L'INDIRIZZO NON ABBIA IL NUMERO CIVICO, NEL PRIMO CASO LASCIAVA BLANK MENTRE ADESSO MI ESTRARE LO STESSO IL NUMERO CIVICO
ESEMPIO
VarIni = "AVENUE XXXX"
LVarIni = Len(VarIni)
For I = 1 TO LVarIni Step 1
If Not IsNumeric(Mid(VarIni, I, 1)) Then
Exit For
End If
Next
MsgBox Mid(VarIni, 1, I)
MsgBox Mid(VarIni, I + 1, LVarIni)
NELLA PRIMA MSGBOX HO A
NELLA SECONDA VENUE XXXX
DOVE SBAGLIO??

di Mauro
Sai ke io vi aiuto volentieri se poi partecipate attivamente (e nn solo passivamente) al forum.
Prova con:

VarIni = " AVENUE XXXX"
LVarIni = Len(VarIni)
For I = 1 To LVarIni Step 1
If Not IsNumeric(Mid(VarIni, I, 1)) Then
Exit For
End If
Next
'se I = 1 vuol dire ke non c'è numero civico
'quindi muovo zero su I
If I = 1 Then
I = 0
End If
MsgBox Mid(VarIni, 1, I)
MsgBox Mid(VarIni, I + 1, LVarIni)

di ENZO
TI RINGRAZIO MA C'E' UN PROBLEMA
LA ROUTINE COSI' VA BENE MA SE L'INDIRIZZO DIVENTA 888 AVENUE XXX, 888 NON VIENE ESTRATTO
IN POCHE PAROLE IO DESIDEREREI CHE LA ROUTINE CHE MI AVEVI SUGGERITO INIZIALMENTE PER ESTRARRE I NUMERI CIVICI PARTENDO DA DESTRA FUNZIONASSE ANCHE PARTENDO CON I NUMERI CIVICI DA SINISTRA
GRAZIE PER L'INTERESSAMENTO

di Mauro
A questo punto le casistiche si sprecano, sta a te vedere le problematiche e cercare di risolvere secondo le tue esigenze. Forza so ke ce la puoi fare!

Cognolato Studio © 2005