J'ai ce qui semble être un simple problème avec certaines données dans Excel. J'ai beaucoup de données avec des espaces de premier plan collés à partir d'une table Web et j'aimerais supprimer l'espace initial. J'ai écrit le code suivant (je suis complètement nouveau dans VBA), mais cela ne semble pas fonctionner. Lorsque je le passe dans le débogueur, cela ressemble à une boucle infinie. Toute aide serait appréciée!
Sub DoTrim()
For Each cell In Selection.Cells
If cell.HasFormula = False Then
cell = Trim(cell)
End If
Next
End Sub
EDIT: Il semble que la fonction TRIM rencontre 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
Changement de la valeur des cellules, donc je suppose que c'est un espace non-espace! Une idée sur la façon de s'en débarrasser?
Si vous avez un caractère non imprimable à 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
Cela fonctionne bien pour moi. Il utilise un tableau afin que vous ne parcouriez pas chaque cellule. S'exécute beaucoup plus rapidement sur les grandes sections de la 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
A fonctionné pour moi parfaitement comme ça:
Coupe toutes les cellules sélectionnées. Attention à ne pas sélectionner des 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
Cela me convient avec un changement - la quatrième ligne devrait être:
cell.Value = Trim(cell.Value)
Edit: S'il semble être bloqué dans une boucle, j'ajouterais
Debug.Print cell.Address
dans 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 visible dans celui-ci?
La seule chose qui a fonctionné pour moi est 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
La boucle infinie est le résultat d'une instruction On Error Resume Next
située quelque part plus haut dans votre code. Débarrassez-vous maintenant. Si votre code ne fonctionne qu'avec On Error Resume Next
en vigueur, il doit être révisé instantanément et de manière exhaustive.
Et pendant que vous y êtes, placez un Option Explicit
au-dessus de votre module. Il vous oblige à déclarer toutes les variables, une protection contre les bogues gênants résultant de noms de variables mal typés. (Vous pouvez modifier les préférences de l'éditeur VBA pour que cette option soit automatiquement définie la prochaine fois, ce qui est vivement recommandé.)
Le problème immédiat avec votre code est qu'une cellule est un objet et que les objets ne peuvent pas être supprimés. Vous voulez couper le texte de la cellule, vous devez donc le faire:
cell.Text = Trim(cell.Text)
Cela devrait accomplir ce que vous voulez faire. Je viens de le tester sur une feuille de la mienne; laissez-moi savoir si cela ne fonctionne pas. LTrim est si vous avez seulement des espaces de début; la fonction Découper peut être utilisée aussi bien qu’elle s’occupe des espaces de début et de fin. Remplacez la plage de cellules de la zone que j’ai sous le nom "A1: C50" et veillez également à remplacer "Feuille1" par 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
J'essayerais de résoudre ceci sans VBA. Il suffit de sélectionner ce espace et d’utiliser replace (changer en rien) dans la feuille de calcul que vous essayez de supprimer des espaces .
Si vous voulez vraiment utiliser VBA, je pense que vous pouvez sélectionner le premier caractère.
strSpace = left(range("A1").Value,1)
et utiliser la fonction de remplacement dans 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