web-dev-qa-db-fra.com

Couper les cellules en utilisant VBA dans Excel

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?

6
Greg Reynolds

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
7
Charles Williams

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
8
JimmyPena

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
1
Pavel Skuhrovec

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?

1
e100

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
0
Johan van der Veen

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)
0
Tomalak

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
0
Michael

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
0
Marek