XL 2019 Suppression espace de début et fin - Macro très rapide

Bastien43

XLDnaute Occasionnel
Bonjour,

J'ai créé cette macro pour supprimer les espaces de début et de fin de chaque cellule (de toute une colonne : 12000 lignes)

Comment accélérer la macro, ce n'est pas rapide... ?? Existe-t-il un code plus rapide ?

VB:
Sub SupEspace()

Dim plage, cellule

Set plage = Range("D2:D12000")

For Each cellule In plage

    cellule.Value = Trim(cellule.Value)

Next cellule

End Sub
 
Solution
Bonjour Bastien43

Par tableau (array)
VB:
Sub SupEspace2()

Dim plage As Range
Dim T As Variant
Dim i&, j&

Set plage = Range("D2:D12000")
T = plage
For i = LBound(T, 1) To UBound(T, 1)
    For j = LBound(T, 2) To UBound(T, 2)
        T(i, j) = Trim(T(i, j))
    Next j
Next i
plage.FormulaLocal = T
End Sub

Cordialement

patricktoulon

XLDnaute Barbatruc
re
sur 2013 32 bit ça fait pareil que 2007
demo7.gif


on l'avait déjà vu ça avec @Yeahou
sur 2016 et 365 les formules sont automatiquement converties en matricielle
la mienne créé la matricielle et est compatible toute version
et en plus sur 365 y a même plus les accolades pour nous signaler que c'est des matricielles
sur 2016 je sais pas
ça c'est une information qu'il faudrait faire remonter a MS car c'est gênant
si on veut pas faire des matricielles
sinon il va y avoir de sérieux problèmes de compatibilité entre les versions
 

job75

XLDnaute Barbatruc
sinon il va y avoir de sérieux problèmes de compatibilité entre les versions
Bah ce ne sera pas la 1ère fois que la compatibilité descendante n'est pas respectée.

Puisque ma macro du post #8 ne va pas utilisez celle-ci qui fonctionne sur toute version :
VB:
Sub SupEspace()
Application.ScreenUpdating = False
With [D2:D12000]
    .EntireColumn.Insert 'insère une colonne auxiliaire
    .Columns(0) = "=TRIM(RC[1])" 'SUPPRESPACE
    .Columns(0) = .Columns(0).Value 'supprime les formules
    .Value = .Columns(0).Value
    .Columns(0).EntireColumn.Delete
End With
End Sub
 

Pièces jointes

  • Test SupEspace(2).xlsm
    16.6 KB · Affichages: 6

patricktoulon

XLDnaute Barbatruc
a oui c'est une idée mais il y a
(deux calculate * le nombre de cells * le nombre de cells liées a celles ci par formule )de déclenchés
sur un range important ça va se sentir
avec la mienne il n'y en a qu'un(* le nombre de cellules liées à celles ci ) (normal puisque l'on change simplement la valeur dans les cellules elles mêmes
VB:
Function TriMAllCellsInRange(ByRef RnG As Range)'trim le left et right
'supprime les espace en debut et fin de chaine de  caracteres dans une plage  equivalent de "Ltrim" in one shoot
    With RnG.Parent.Range(RnG.Address)
        .Value = Evaluate("IF(ISTEXT(" & .Address & "),MID(" & .Address & ",FIND(MID(TRIM(" & .Address & "),1,2)," & .Address & ",1),LEN(" & .Address & ")),REPT(" & .Address & ",1))")
        TriMAllCellsInRange = Evaluate("IF(ISTEXT(" & .Address & "),MID(" & .Address & ",1,FIND(TRIM(RIGHT(SUBSTITUTE(TRIM(" & .Address & "), "" "", REPT("" "", 100)), 100))," & .Address & ",1)+LEN(TRIM(RIGHT(SUBSTITUTE(TRIM(" & .Address & "), "" "", REPT("" "", 100)), 100)))-1),REPT(" & .Address & ",1))")
    End With
End Function
'
'
'equivalent à application.trim de VBA(régularSpace)
Function SupprfirstAndNexAndDoubleSpaceInRange(ByRef RnG As Range)
'supprime tout les espaces avant et apres la chaine et tout les doubles espaces dans la chaine in one shoot
    With RnG
        SupprfirstAndNexAndDoubleSpaceInRange = Evaluate("IF(ISTEXT(" & .Address & "),TRIM(" & .Address & "),REPT(" & .Address & ",1))")
    End With
End Function '

Sub test() 'trim les valeurs dans la plage
    Dim DL, RnG As Range
    DL = Cells(Rows.Count, 3).End(xlUp).Row
    Set RnG = Sheets(1).Range("C2:C" & DL)
    RnG.Value = TriMAllCellsInRange(RnG)
End Sub

Sub test2() 'trim et supprime les espaces consécutif des valeurs
    Dim DL, RnG As Range
    DL = Cells(Rows.Count, 3).End(xlUp).Row
    Set RnG = Sheets(1).Range("C2:C" & DL)
    RnG.Value = SupprfirstAndNexAndDoubleSpaceInRange(RnG)
End Sub

c'est le rept qui recrée la matrice ,evaluate me renvoie alors une matrice et non un string comme dans ton post 8
 

job75

XLDnaute Barbatruc
J'ai testé sur 1 000 000 de lignes avec la plage C2:C1000000 remplie par =" "&LIGNE()&" ":

- macro du post #3 => 0,95 seconde

- macro du post #25 => 3,3 secondes

- macro test du post #26 => 10,4 secondes

- macro test2 du post #26 => 2,4 secondes.
 

Discussions similaires

  • Résolu(e)
Microsoft 365 supprimer espace
Réponses
41
Affichages
4 K
Réponses
12
Affichages
871

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
315 097
Messages
2 116 186
Membres
112 679
dernier inscrit
Yupanki