2010-06-03 26 views
5

Ho un problema con alcuni dati in Excel. Ho molti dati con gli spazi iniziali incollati da una tabella Web e vorrei liberarmi dello spazio iniziale. Ho inserito il seguente codice (sono completamente nuovo in VBA), ma non sembra funzionare. Quando lo passo nel debugger sembra un ciclo infinito. Qualsiasi aiuto sarebbe apprezzato!Trim celle che utilizzano VBA in Excel

Sub DoTrim() 
    For Each cell In Selection.Cells 
    If cell.HasFormula = False Then 
     cell = Trim(cell) 
    End If 
    Next 
End Sub 

EDIT: Sembra proprio la funzione TRIM è in esecuzione in problemi con un carattere "spazio". Questo codice:

Sub DoTrim() 
Dim cell As Range, areaToTrim As Range 
Set areaToTrim = Selection.Cells 
For Each cell In areaToTrim 
    cell.Value = "MUPPET" 
Next cell 
End Sub 

cambiato il valore delle celle, quindi credo che sia uno spazio bianco non-spazio! Qualche idea su come sbarazzarsi di quelli?

+1

chr (255) viene visualizzato come spazio in Excel. Spesso è una causa di problemi. – Fionnuala

risposta

7

Se hai un carattere non stampabile nella parte anteriore della stringa prova questo


Option Explicit 
Sub DoTrim() 
    Dim cell As Range 
    Dim str As String 
    Dim nAscii As Integer 
    For Each cell In Selection.Cells 
     If cell.HasFormula = False Then 
      str = Trim(CStr(cell)) 
      If Len(str) > 0 Then 
       nAscii = Asc(Left(str, 1)) 
       If nAscii < 33 Or nAscii = 160 Then 
        If Len(str) > 1 Then 
         str = Right(str, Len(str) - 1) 
        Else 
         strl = "" 
        End If 
       End If 
      End If 
      cell=str 
     End If 
    Next 
End Sub 
+0

Ricevo ancora un carattere di spazio davanti alle stringhe –

1

funziona bene per me con una modifica - quarta riga dovrebbe essere:

cell.Value = Trim(cell.Value) 

Edit: Se sembra essere bloccato in un ciclo, mi piacerebbe aggiungere

Debug.Print cell.Address 

all'interno del tuo ciclo For ... Next per avere un po 'più di informazioni su cosa sta succedendo.

Ho anche il sospetto che lo spazio Trim metta a nudo solo gli spazi: sei sicuro di non avere un altro tipo di carattere senza display?

0

Il ciclo infinito è il risultato di un'istruzione On Error Resume Next da qualche parte più in alto nel codice. Liberati di questo ora. Se il tuo codice funziona solo con On Error Resume Next, ha bisogno di una revisione istantanea e completa.

E mentre ci sei, posizionare un Option Explicit sopra il tuo modulo. Ti costringe a dichiarare tutte le variabili, una salvaguardia contro i fastidiosi bug che sono il risultato di nomi di variabili errate. (È possibile modificare le preferenze dell'editor VBA affinché questa opzione venga impostata automaticamente la prossima volta, il che è altamente raccomandato.)

Il problema immediato con il proprio codice è che una cella è un oggetto e che gli oggetti non possono essere ritagliati. Vuoi tagliare il testo della cella, quindi devi farlo:

cell.Text = Trim(cell.Text) 
+0

Questa è l'unica macro nella mia cartella di lavoro personale. E non funziona ancora con la versione cell. Valve. –

+0

@Greg Reynolds: Mio male, questo avrebbe dovuto essere '.Text', ho corretto la mia risposta. – Tomalak

+1

Generalmente non è una buona idea usare .text perché questo ti dà il valore formattato da Excel (che potrebbe essere ### se l'utente ha cambiato la larghezza della colonna) piuttosto che il valore reale. Anche la proprietà predefinita di un oggetto Range è .valore, quindi Trim (Cell) funziona correttamente se Cell è un oggetto intervallo. –

0

Questo dovrebbe portare a termine quello che vuoi fare. L'ho appena testato su un mio foglio; fammi sapere se questo non funziona. LTrim è se hai solo spazi iniziali; la funzione Trim può essere utilizzata così come si prende cura degli spazi iniziali e finali. Sostituisci l'intervallo di celle nell'area che ho come "A1: C50" e assicurati anche di cambiare "Foglio1" con il nome del foglio su cui stai lavorando.

Dim cell As Range, areaToTrim As Range 
Set areaToTrim = Sheet1.Range("A1:C50") 
For Each cell In areaToTrim 
    cell.Value = LTrim(cell.Value) 
Next cell 
0

Proverei a risolvere questo senza VBA. Basta selezionare questo spazio e usare replace (cambia in niente) su quel foglio di lavoro che stai cercando di sbarazzarti di quegli spazi .

Se davvero si vuole utilizzare VBA credo si possa selezionare primo carattere

strSpace = left(range("A1").Value,1) 

e utilizzare la funzione di sostituire in VBA stesso modo

Range("A1").Value = Replace(Range("A1").Value, strSpace, "") 

o

for each cell in selection.cells 
cell.value = replace(cell.value, strSpace, "") 
next 
8

Questo funziona bene per me. Usa una matrice in modo che non stiate eseguendo il ciclo di ogni cella. Viene eseguito molto più velocemente su sezioni di foglio di lavoro di grandi dimensioni.

Sub Trim_Cells_Array_Method() 

Dim arrData() As Variant 
Dim arrReturnData() As Variant 
Dim rng As Excel.Range 
Dim lRows As Long 
Dim lCols As Long 
Dim i As Long, j As Long 

    lRows = Selection.Rows.count 
    lCols = Selection.Columns.count 

    ReDim arrData(1 To lRows, 1 To lCols) 
    ReDim arrReturnData(1 To lRows, 1 To lCols) 

    Set rng = Selection 
    arrData = rng.value 

    For j = 1 To lCols 
    For i = 1 To lRows 
     arrReturnData(i, j) = Trim(arrData(i, j)) 
    Next i 
    Next j 

    rng.value = arrReturnData 

    Set rng = Nothing 
End Sub 
0

L'unica cosa che ha funzionato per me è questa funzione:

Sub DoTrim() 
Dim cell As Range 
Dim str As String 
For Each cell In Selection.Cells 
    If cell.HasFormula = False Then 
     str = Left(cell.Value, 1) 'space 
     While str = " " Or str = Chr(160) 
      cell.Value = Right(cell.Value, Len(cell.Value) - 1) 
      str = Left(cell.Value, 1) 'space 
     Wend 
     str = Right(cell.Value, 1) 'space 
     While str = " " Or str = Chr(160) 
      cell.Value = Left(cell.Value, Len(cell.Value) - 1) 
      str = Right(cell.Value, 1) 'space 
     Wend 
    End If 
Next cell 
End Sub 
1

ha lavorato per me perfettamente come questo:

assetta tutte le celle selezionate. Attenzione a selezionare colonne/righe complete: P.

Sub TrimSelected()  
Dim rng As Range, cell As Range  
Set rng = Selection 

For Each cell In rng  
cell = Trim(cell) 

Next cell  

End Sub