2010-06-03 15 views
5

J'ai ce qui semble être un problème simple avec certaines données dans Excel. J'ai beaucoup de données avec les espaces principaux collés d'une table de Web, et je voudrais me débarasser de l'espace initial. J'ai criblé le code suivant (je suis complètement nouveau à VBA), mais cela ne semble pas fonctionner. Quand je le traverse dans le débogueur, il ressemble à une boucle infinie. Toute aide serait appréciée!Découper des cellules en utilisant VBA dans Excel

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

EDIT: Il ne ressemble à la fonction TRIM est en cours d'exécution dans des problèmes avec un caractère « espace ». Ce code:

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 

Changé la valeur des cellules, donc je suppose que c'est un des espaces non-espace! Une idée sur la façon de se débarrasser de ceux-ci?

+1

chr (255) apparaît comme un espace dans Excel. C'est souvent une cause de problèmes. – Fionnuala

Répondre

7

Si vous avez un caractère non-impression à l'avant de la chaîne essayez ceci


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

Je reçois toujours un caractère espace devant les cordes –

1

fonctionne bien pour moi avec un seul changement - quatrième ligne devrait être:

cell.Value = Trim(cell.Value) 

Edit: S'il semble être coincé dans une boucle, j'ajouter

Debug.Print cell.Address 

à l'intérieur de votre boucle For ... Next pour obtenir un peu plus d'informations sur ce qui se passe.

Je soupçonne également que Trim ne supprime que des espaces - êtes-vous sûr de ne pas avoir un autre type de caractère non affiché?

0

La boucle infinie est le résultat d'une instruction On Error Resume Next quelque part plus haut dans votre code. Débarrassez-vous maintenant. Si votre code fonctionne uniquement avec On Error Resume Next en vigueur, il nécessite une révision instantanée et complète. Pendant que vous y êtes, placez un Option Explicit sur votre module. Cela vous force à déclarer toutes les variables, une protection contre les bogues gênants qui sont le résultat de noms de variables mal typés. (Vous pouvez modifier les préférences de l'éditeur VBA pour que cette option soit définie automatiquement la prochaine fois, ce qui est fortement recommandé.)

Le problème immédiat avec votre code est qu'une cellule est un objet et que les objets ne peuvent pas être rognés. Vous voulez découper le texte de la cellule, donc vous devez le faire:

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

Ceci est la seule macro dans mon classeur personnel. Et ça ne marche toujours pas avec la version cell.Value. –

+0

@Greg Reynolds: Mon mauvais, cela aurait dû être «.Text», j'ai corrigé ma réponse. – Tomalak

+1

Ce n'est généralement pas une bonne idée d'utiliser .text car cela vous donne la valeur formatée par Excel (qui pourrait être ### si l'utilisateur a changé la largeur de la colonne) plutôt que la valeur réelle. La propriété par défaut d'un objet Range est également .value, donc Trim (Cell) fonctionne correctement si Cell est un objet Range. –

0

Cela devrait accomplir ce que vous voulez faire. Je l'ai juste testé sur une feuille de moi; laissez-moi savoir si cela ne fonctionne pas. LTrim est si vous avez seulement des espaces de premier plan; La fonction Trim peut être utilisée ainsi que les espaces de début et de fin. Remplacer la plage de cellules dans la zone que j'ai comme "A1: C50" et assurez-vous également de changer "Sheet1" pour le nom de la feuille sur laquelle vous travaillez.

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

Je voudrais essayer de résoudre ceci sans VBA. Il suffit de sélectionner cet espace et d'utiliser remplacer (changer pour rien) sur cette feuille de calcul que vous essayez de se débarrasser de ces espaces.

Si vous voulez vraiment utiliser VBA je crois que vous pouvez sélectionner le premier caractère

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

et utiliser remplacer la fonction en VBA de la même manière

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

ou

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

Cela fonctionne bien pour moi. Il utilise un tableau de sorte que vous ne parcourez pas chaque cellule. Fonctionne beaucoup plus rapidement sur les grandes sections de feuille de calcul.

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

La seule chose qui a fonctionné pour moi cette fonction:

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

a marché pour moi tout à fait comme ceci:

Trims toutes les cellules sélectionnées. Attention à la sélection de colonnes/lignes complètes: 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 
Questions connexes