Discussion:
eliminare spazi vuoti da stringa di testo
(troppo vecchio per rispondere)
Da#
2006-04-06 10:41:14 UTC
Buongiorno
mi ritrovo con questo problemino
Ho delle celle che contengono una stringa di testo del tipo :
" La prima parte di questa frase e fatta di spazi vuoti e anche
l'ultima "

Devo eliminare tutti gli spazi vuoti a partire dall'ultimo carattere sino
alla fine ma non devo eliminare gli spazi vuoti all'inizio ( che sono un
rientro necessario per l'ordinamento)

A complicare la cosa va detto che sia gli spazi vuoti presenti prima e dopo
la frase non sono costanti bensi in numero variabile.


quindi la funzione ANNULLA.SPAZI mi serve a poco perchè elimina anche gli
spazi all'inizio.

la funzione SINISTRA ( testo; n) non è utilizzabile per il fatto che le
frasi hanno lunghezza variabile .

avete qualche idea suggerimento su come affrontare o risolvere il problema ?

grazie per l'aiuto
knulp

--
Norman Jones
2006-04-06 11:35:36 UTC
Post by Da#
Buongiorno
mi ritrovo con questo problemino
" La prima parte di questa frase e fatta di spazi vuoti e anche
l'ultima "
Devo eliminare tutti gli spazi vuoti a partire dall'ultimo carattere sino
alla fine ma non devo eliminare gli spazi vuoti all'inizio ( che sono un
rientro necessario per l'ordinamento)
A complicare la cosa va detto che sia gli spazi vuoti presenti prima e
dopo la frase non sono costanti bensi in numero variabile.
quindi la funzione ANNULLA.SPAZI mi serve a poco perchè elimina anche gli
spazi all'inizio.
la funzione SINISTRA ( testo; n) non è utilizzabile per il fatto che le
frasi hanno lunghezza variabile .
avete qualche idea suggerimento su come affrontare o risolvere il problema ?
grazie per l'aiuto
knulp
'---------------------------

Ciao Knulp,

Prova:

'=============>>
Public Sub DeleteEndSpaces()
Dim Rng As Range
Dim rCell As Range
Dim sStr As String
Dim i as Long

Set Rng = Selection

For Each rCell In Rng.Cells
sStr = rCell.Value
For i = Len(sStr) To 1 Step -1
If Right(sStr, 1) = " " Then
sStr = Left(sStr, i - 1)
Else
Exit For
End If
Next i
rCell.Value = sStr
Next rCell
End Sub
'<<=============

---
Regards,
Norman
Roberto Restelli
2006-04-06 13:01:11 UTC
Ciao Norman Jones.
Post by Norman Jones
For i = Len(sStr) To 1 Step -1
If Right(sStr, 1) = " " Then
sStr = Left(sStr, i - 1)
Else
Exit For
End If
Next i
rCell.Value = sStr
Aggiungo un piccolo contributo accademico (i miei 2 cents alla causa :-) ).
Se volessimo aggiungere qualche ottimizzazione, propongo queste:

- le operazioni sulle stringhe sono in genere onerose in termini di risorse.
Anzichè *parsare* la stringa a partire dal fondo ed effettuare ogni volta
una trasformazione della stringa stessa (applicando tutte le volte la
funzione LEFT) si potrebbe più semplicemente effettuare un loop che
conteggia quale dovrebbe essere la lunghezza della stringa depurata dagli
spazi finali, per poi applicare solamente una volta la funzione LEFT.

- le funzioni LEFT, RIGHT e parecchie altre che in genere vengono usate per
manipolare il testo, hanno delle funzioni "gemelle" che terminano con il
simbolo di "$". Ad esempio esiste sia LEFT che LEFT$. La differenza tra le
due? Prendo pari-pari la definizione dall'object browser:
Function Left(String, Length As Long)
Function Left$(String As String, Length As Long) As String
La prima funzione restituisce un risultato di tipo *Variant*; la seconda
restituisce un risultato di tipo *String*. (Si potrebbe fare la stessa
considerazione anche per il primo parametro della funzione). Se utilizzi la
prima funzione assegnando il risultato ad una variabile stringa costringi il
sistema ad effettuare una ulteriore conversione (conversione implicita) che
può essere risparmiata con l'uso della seconda funzione.
Parliamo ovviamente del risparmio di qualche centesimo o millesimo di
secondo, ma su vasta scala (e soprattutto nell'uso di loop molto spinti),
può avere il suo vantaggio. :-)

Visto che poi, in questo caso, ricorriamo all'utilizzo di VBA potemmo
utilizzare più semplicemente la funzione RTRIM (che deriva da "right-trim",
e meglio ancora: RTRIM$) che elimina direttamente tutti gli spazi a destra
all'interno di una stringa. Tra le funzioni molto simili ricordo la LTRIM
("left-trim", che quindi toglie gli spazi a sinistra) e la TRIM (che toglie
tutti gli spazi).

Ciao
Roberto
--
Roberto Restelli
Microsoft MVP - Office Systems - Outlook
************************************************
La prima raccolta delle FAQ del newsgroup Microsoft di Outlook:
http://erredue.altervista.org
Da#
2006-04-06 16:41:44 UTC
Grazie ma sono un principiante e
di Macro ( e di Inglese) non capisco un acca ( so usare solo il comando
registra nuova macro .....)
cmq copio e conservo le istruzioni ( che non capisco ) per poterle applicare
quando avro studiato .

Nel frattempo non ci sarebbe qualcosa di più spartano tipo formule
nidificate o come poter fare un copia incolla delle istruzioni ?

knulp
Post by Roberto Restelli
Ciao Norman Jones.
Post by Norman Jones
For i = Len(sStr) To 1 Step -1
If Right(sStr, 1) = " " Then
sStr = Left(sStr, i - 1)
Else
Exit For
End If
Next i
rCell.Value = sStr
Aggiungo un piccolo contributo accademico (i miei 2 cents alla causa :-) ).
- le operazioni sulle stringhe sono in genere onerose in termini di
risorse. Anzichè *parsare* la stringa a partire dal fondo ed effettuare
ogni volta una trasformazione della stringa stessa (applicando tutte le
volte la funzione LEFT) si potrebbe più semplicemente effettuare un loop
che conteggia quale dovrebbe essere la lunghezza della stringa depurata
dagli spazi finali, per poi applicare solamente una volta la funzione
LEFT.
- le funzioni LEFT, RIGHT e parecchie altre che in genere vengono usate
per manipolare il testo, hanno delle funzioni "gemelle" che terminano con
il simbolo di "$". Ad esempio esiste sia LEFT che LEFT$. La differenza tra
Function Left(String, Length As Long)
Function Left$(String As String, Length As Long) As String
La prima funzione restituisce un risultato di tipo *Variant*; la seconda
restituisce un risultato di tipo *String*. (Si potrebbe fare la stessa
considerazione anche per il primo parametro della funzione). Se utilizzi
la prima funzione assegnando il risultato ad una variabile stringa
costringi il sistema ad effettuare una ulteriore conversione (conversione
implicita) che può essere risparmiata con l'uso della seconda funzione.
Parliamo ovviamente del risparmio di qualche centesimo o millesimo di
secondo, ma su vasta scala (e soprattutto nell'uso di loop molto spinti),
può avere il suo vantaggio. :-)
Visto che poi, in questo caso, ricorriamo all'utilizzo di VBA potemmo
utilizzare più semplicemente la funzione RTRIM (che deriva da
"right-trim", e meglio ancora: RTRIM$) che elimina direttamente tutti gli
spazi a destra all'interno di una stringa. Tra le funzioni molto simili
ricordo la LTRIM ("left-trim", che quindi toglie gli spazi a sinistra) e
la TRIM (che toglie tutti gli spazi).
Ciao
Roberto
--
Roberto Restelli
Microsoft MVP - Office Systems - Outlook
************************************************
http://erredue.altervista.org
Mauro Gamberini
2006-04-06 16:57:29 UTC
Post by Da#
Grazie ma sono un principiante e
di Macro ( e di Inglese) non capisco un acca ( so usare solo il comando
registra nuova macro .....)
cmq copio e conservo le istruzioni ( che non capisco ) per poterle applicare
quando avro studiato .
Nel frattempo non ci sarebbe qualcosa di più spartano tipo formule
nidificate o come poter fare un copia incolla delle istruzioni ?
Mix Norman(grandi ieri sera!!!) e Roberto.
ALT+F11 e sei nell'editor del vba
Inserisci-->Modulo
Copia incolla questo:

Public Function mTogliSpazi(ByVal var As Variant)

var = LTrim$(var)
var = RTrim$(var)

mTogliSpazi = var

End Function

ALT+F11 e torni in Excel
Mettiamo tu abbia la tua stringa in A1
In B1 scrivi:
=mTogliSpazi(A1)
Invio

Se le altre stringhe sono nelle celle successive
(A2, A3,A4, ecc),
puoi espandere la formula come fai normalmente.
--
----------------------------
Mauro Gamberini
Da#
2006-04-06 18:04:12 UTC
"Mauro Gamberini"
Post by Mauro Gamberini
Public Function mTogliSpazi(ByVal var As Variant)
var = LTrim$(var)
var = RTrim$(var)
mTogliSpazi = var
End Function
ALT+F11 e torni in Excel
Mettiamo tu abbia la tua stringa in A1
=mTogliSpazi(A1)
Invio
Fatto ma mi restituisce
#NOME?

uso excel in italiano
devo attivare qualche funzione aggiuntiva ?
grazie
Mauro Gamberini
2006-04-07 07:50:25 UTC
Post by Da#
Fatto ma mi restituisce
#NOME?
uso excel in italiano
devo attivare qualche funzione aggiuntiva ?
grazie
No, non dovrebbero esserci problemi.
Assicurati di avere le macro attivate.

In Excel:
Strumenti-->Macro-->Protezione
Seleziona: Media(ti verrà chiesto se vuoi
attivare le macro all'apertura del file).
Chiudi e riapri il file.
Inserisci la formula nella cella, invio.
--
---------------------------
Mauro Gamberini
Roberto Restelli
2006-04-07 08:57:02 UTC
Ciao Mauro.
Post by Mauro Gamberini
Public Function mTogliSpazi(ByVal var As Variant)
var = LTrim$(var)
var = RTrim$(var)
mTogliSpazi = var
End Function
La necessità di "knulp" è quella di eliminare solamente gli spazi di destra.
Post by Mauro Gamberini
var = LTrim$(var)
va eliminata, altrimenti verranno tolti anche gli spazi a sinistra.

Ciao
Roberto
--
Roberto Restelli
Microsoft MVP - Office Systems - Outlook
************************************************
La prima raccolta delle FAQ del newsgroup Microsoft di Outlook:
http://erredue.altervista.org
Mauro Gamberini
2006-04-07 09:15:33 UTC
Post by Roberto Restelli
La necessità di "knulp" è quella di eliminare solamente gli spazi di
Post by Mauro Gamberini
var = LTrim$(var)
va eliminata, altrimenti verranno tolti anche gli spazi a sinistra.
Ops! Ho letto più la tua prima risposta che la
domanda... 8-(

Quindi:

Public Function mTogliSpazi(ByVal var As Variant)

var = RTrim$(var)

mTogliSpazi = var

End Function
--
---------------------------
Mauro Gamberini
Norman Jones
2006-04-10 07:14:52 UTC
Ciao Mauro,

Chiedo scusa per il ritardo con cui ti rispondo, ma sono stato altrove.
Post by Mauro Gamberini
Mix Norman(grandi ieri sera!!!) e Roberto.
Grazie, Mauro.

---
Regards,
Norman
Norman Jones
2006-04-10 07:14:35 UTC
Ciao Roberto,

Chiedo scusa per il ritardo con cui ti rispondo, ma sono stato altrove.
Post by Roberto Restelli
Visto che poi, in questo caso, ricorriamo all'utilizzo di VBA potemmo
utilizzare più semplicemente la funzione RTRIM
Sì, certamente - ero momentaneamente cieco al evidente!

Grazie e saluti.



---
Regards,
Norman
Roberto Restelli
2006-04-10 11:10:16 UTC
Ciao Norman Jones.
Post by Norman Jones
Sì, certamente - ero momentaneamente cieco al evidente!
Hehe.. capita a tutti! Il bello della community è proprio la partecipazione
di più utenti ed il contributo collettivo :-)

Ciao
Roberto
--
Roberto Restelli
Microsoft MVP - Office Systems - Outlook
************************************************
La prima raccolta delle FAQ del newsgroup Microsoft di Outlook:
http://erredue.altervista.org