IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Discussion :

Code pour éliminer les espaces (TRIM) dans un tableau


Sujet :

Contribuez

  1. #1
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 772
    Points : 28 633
    Points
    28 633
    Billets dans le blog
    53
    Par défaut Code pour éliminer les espaces (TRIM) dans un tableau
    Bonjour,
    J'ai du effectuer ce jour, un travail de suppression d'espaces dans les cellules (TRIM) sur un gros tableau.
    Je vous en fait profiter.
    Pour 20.600 lignes et 44 colonnes, cela a pris 9 secondes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    Option Explicit
    ' Programme qui enlève les espaces avant et après une chaine de caractère dans un tableau
    ' Author  : Philippe Tulliez
    ' Date    : 2012/02/12
    ' Version : 1
    '
    ' Contraintes
    ' Le tableau doit être dans une feuille du classeur où se trouve le tableau
    ' Le tableau doit nécessairement commencer en A1
    ' Si des cellules contiennent des formules, c'est la valeur qui est retournée.
    ' - si une formule renvoie une erreur (exemple : #VALEUR!). L'erreur est renvoyée sous forme de chaine de caractère.
    '
    Dim wkb As Workbook, sht As Worksheet, rng As Range
    Const shtName = "shtR" ' <<<< Entrer le nom de la feuille où se trouve le tableau
    Dim myTable() As Variant
    Sub main()
     Debug.Print Time
     Application.ScreenUpdating = False
     Init      ' Initialisation des variables
     TrimTable ' Parcoure le tableau en mémoire, enlève
     Application.ScreenUpdating = True
     Debug.Print Time
    End Sub
    Private Sub Init()
     ' Initialisation des variables
     Set wkb = ThisWorkbook
     Set sht = wkb.Worksheets(shtName)
     Set rng = sht.Range("A1").CurrentRegion
    End Sub
    Private Sub TrimTable()
     ' Supression des espaces avant et après la cellule
     Dim wRow As Double, wCol As Double
     myTable() = rng
     For wCol = 1 To UBound(myTable, 2)
      For wRow = 1 To UBound(myTable, 1)
       On Error Resume Next ' Si erreur renvoyée par une formule
       myTable(wRow, wCol) = Trim(myTable(wRow, wCol))
       On Error GoTo 0
      Next wRow
     Next wCol
     rng = myTable()
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  2. #2
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 949
    Points
    2 949
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Erreur ou utilité?
    Pourquoi en fin de procédure "main" un ScreenUpdating = false? Ne serait ce pas plutôt True?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub main()
     Debug.Print Time
     Application.ScreenUpdating = False
     Init      ' Initialisation des variables
     TrimTable ' Parcoure le tableau en mémoire, enlève
     Application.ScreenUpdating = False 
    Debug.Print Time
    End Sub
    Cordialement,
    Franck

  3. #3
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 772
    Points : 28 633
    Points
    28 633
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Exact, c'est une erreur.
    Merci de l'avoir relevé, je corrige cela tout de suite
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 21
    Points : 46
    Points
    46
    Par défaut un code super rapide !
    Bonjour Philippe,

    Un code super rapide qui tombe à pic.

    Je chercais une routine capable d'effectuer ce type de traitement sur de très grosses tables.

    C'est chose faite !

    Juste une adaptation de code, en remplaçant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set rng = sht.Range("A1").CurrentRegion
    par

    où 'selection' est une plage contigüe de cellules.

    Pour éviter une sélection sur des plages multiples on peut placer un contrôle du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    If Selection.Areas.Count > 1 Then
        MsgBox "Vous ne pouvez pas exécuter cette commande sur des plages multiples", 48, "Avertissement"
        Exit Sub
    End If
    merci pour cette contribution

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 772
    Points : 28 633
    Points
    28 633
    Billets dans le blog
    53
    Par défaut
    Bonjour Henri,
    Ravi que cette procédure t'ai aidée et merci pour le retour.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 036
    Points : 1 917
    Points
    1 917
    Billets dans le blog
    5
    Par défaut
    Bonjour Philippe.

    Je suis étonné.
    Très étonné que malgré ta grande expérience d'Excel, tu passes souvent par des méthodes de débutants.
    Ousmane


    Quand on tombe dans l'eau, la pluie ne fait plus peur.

  7. #7
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 772
    Points : 28 633
    Points
    28 633
    Billets dans le blog
    53
    Par défaut
    Bonjour,

    C'est à dire ?
    Cela me ferait plaisir que tu développes un peu ton appréciation.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  8. #8
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 036
    Points : 1 917
    Points
    1 917
    Billets dans le blog
    5
    Par défaut
    Voilà:
    Le code est sensé servir des débutants.
    L'exemple ne leur apprend pas la considération des principes que tu préconises toi même souvent dans tes réponses.
    1_ tu fais des déclarations au niveau module sans que cela soit utile
    2_ tu affectes une variable de type Workbook par l'objet ThisWorkBook que l'application te fournit déjà
    3_ les boucles imbriqué sur un tableau variant obtenu de la plage sont en contraste avec une de tes recommandations sur ce site d'explorer les possibilités offertes par l'application si elles sont satisfaisantes.

    Personnellement je n'irais pas par tout un détour pour des paramètres connus.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Set rng = ThisWorkBook.Sheets("machin").UsedRange 'Le code s'éxécutant dans thisworkbook, inutile de l'appeler, encore inutile d'affecter une variable par ThisWorkBook alors que celui ci est utilisable.
    wCol  = rng.Columns.Count
    rng.Offset(, wCol  + 1).Formula = "=TRIM(RC[-" & wCol & "])"
    rng.Value = r.Offset(, wCol  + 1).Value
    rng.Offset(, wCol + 1).Columns.Delete
    Ousmane


    Quand on tombe dans l'eau, la pluie ne fait plus peur.

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 21
    Points : 46
    Points
    46
    Par défaut Une question
    Bonjour NVCfrm,

    Sans rentrer sur le fond, j'ai des questions sur ta remarque :

    - quel est finalement le code le plus rapide ?
    - sur de très grosses tables (50000 lignes sur 15/20 colonnes par ex), n'y a t-il pas un risque de saturation mémoire vu que tu rajoute les colonnes sur la droite pour la supprimer après (si j'ai bien compris) ?


  10. #10
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 772
    Points : 28 633
    Points
    28 633
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Citation Envoyé par NVCfrm Voir le message
    Voilà:
    Le code est sensé servir des débutants.
    L'exemple ne leur apprend pas la considération des principes que tu préconises toi même souvent dans tes réponses.
    1_ tu fais des déclarations au niveau module sans que cela soit utile
    2_ tu affectes une variable de type Workbook par l'objet ThisWorkBook que l'application te fournit déjà
    J'utilise toujours des variables objets pour classeur, feuille et cellules et wkb sera Workbooks("Toto") ou le classeur sur lequel on travaille (ThisWorkbook).
    J'ai une procédure qui initialise des variables objets déclarées en tête de module qui sont publiques ou pas.
    Quand je développe, je change simplement dans cette procédure le nom du classeur ou de la feuille.
    3_ les boucles imbriqué sur un tableau variant obtenu de la plage sont en contraste avec une de tes recommandations sur ce site d'explorer les possibilités offertes par l'application si elles sont satisfaisantes.
    Personnellement je n'irais pas par tout un détour pour des paramètres connus.
    Une boucle dans un tableau est plus rapide que boucler sur une collection de cellules.
    Fais le test avec une grosse base de données entre le code que je propose et celui que tu préconises dans le tien.
    Par contre pour revenir sur ton point 3, oui je préconise d'explorer les possibilités offertes par l'application
    Par exemple si j'avais dû remplacer tous les espaces des cellules, j'aurais utilisé cette procédure.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub SupAllSpace()
     Dim rng As Range
     Set rng = shtDb.Range("A1").CurrentRegion
     rng.Replace what:=" ", replacement:=vbNullString
    End Sub
    Elle est plus courte et surtout encore nettement plus rapide.

    Je respecte toutes les méthodes et peut-être que tu trouves les miennes par moment peu orthodoxe mais je trouve que
    Très étonné que malgré ta grande expérience d'Excel, tu passes souvent par des méthodes de débutants.
    est un peu excessif.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  11. #11
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 036
    Points : 1 917
    Points
    1 917
    Billets dans le blog
    5
    Par défaut
    Salut

    Bonjour NVCfrm,

    Sans rentrer sur le fond, j'ai des questions sur ta remarque :

    - quel est finalement le code le plus rapide ?
    - sur de très grosses tables (50000 lignes sur 15/20 colonnes par ex), n'y a t-il pas un risque de saturation mémoire vu que tu rajoute les colonnes sur la droite pour la supprimer après (si j'ai bien compris) ?
    Je ne vois pas le problème. Je ne penses pas. Peut être faut-il tester. Pour bien juger la différence, rempli 15.000.000 de cellules d'un objet range avec quelque chose comme une formule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("a1:ac500000").formula="=Row()*Column()"
    et execute la même chose sur une boucle dans un tableau de dimension identique.
    dans le code de Philippe vous avez dû voir que le rafraîchissement d'écran est désactivé d'entrée. Ce qui fait que l'opération se traduit en mémoire et avant le rafraîchissement la plage est détruite.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub SupAllSpace()
     Dim rng As Range
     Set rng = shtDb.Range("A1").CurrentRegion
     rng.Replace what:=" ", replacement:=vbNullString
    End Sub
    Voilà une solution digne d'un pro de votre rang pour un cas donné!

    Fais le test avec une grosse base de données entre le code que je propose et celui que tu préconises dans le tien.
    Par contre pour revenir sur ton point 3, oui je préconise d'explorer les possibilités offertes par l'application
    Par exemple si j'avais dû remplacer tous les espaces des cellules, j'aurais utilisé cette procédure.
    Je penses faire des test de comparaison pour voir ce que ça donne et t'informes dès que possible.
    Ousmane


    Quand on tombe dans l'eau, la pluie ne fait plus peur.

  12. #12
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 772
    Points : 28 633
    Points
    28 633
    Billets dans le blog
    53
    Par défaut
    Bonjour NVCfrm,
    Je reconnais que ta procédure est aussi rapide et certainement plus courte en nombre de lignes que celle que j'ai proposée.
    Il est vrai aussi que cette contribution je l'ai déposée un peu rapidement sans l'avoir construite avec des arguments ce que je fais en principe toujours afin de la rendre indépendante. Ce travail était ponctuel et j'ai voulu le partager immédiatement.
    Etant en général extrêmement rigoureux et testant tous les codes que je dépose, je reste tout de même surpris de ce type de commentaire qui n'encourage guère au partage.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  13. #13
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 036
    Points : 1 917
    Points
    1 917
    Billets dans le blog
    5
    Par défaut
    Bonsoir Philippe.

    sincèrement navré de t'avoir touché avec un commentaire.
    C'était juste pour taquiner un petit peu.

    L'habitude nous conduit tous très souvent à produire des codes plus ou moins...parfaits.

    Remarque que par habitude basée sur un constat j’utilise presque jamais la propriété Find de Range qui ralenti certaines grandes manipulations de données.

    Cette bonne habitude passe pour une mauvaise habitude, puisque je n'y penses même pas quand c'est utile.
    Le code est bon de même que la discussion reste un bon sujet utile.
    Ousmane


    Quand on tombe dans l'eau, la pluie ne fait plus peur.

  14. #14
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 772
    Points : 28 633
    Points
    28 633
    Billets dans le blog
    53
    Par défaut
    Bonjour,

    Le code déposé initialement était ma première contribution sur ce site et je ne l'avais pas rendu indépendant de toutes procédures comme j'en ai l'habitude. C'est maintenant chose faite.

    Voici donc ce code placé dans une procédure (fonction) nommée TrimTable qui supprime tous les espaces d'une chaîne de caractères à l'exception des espaces entre les mots et qui renvoie un objet range qui correspond à la plage ou aux plages traitées avec passage de deux arguments dont un est obligatoire.
    La sélection de cellules non contiguës est autorisée, je l'ai cependant limitée à 255 sélections.

    Les arguments
    Obligatoire
    ShtRng : de type Objet peut-être un objet WorkSheet ou un objet Range. Si l'objet est une feuille, la plage doit commencer en A1.
    Optionnel
    ValueOnly : FALSE (défaut) copie les formules, TRUE si on veut avoir uniquement les valeurs.

    La syntaxe
    La procédure peut être invoquée comme une fonction ou comme procédure SUB
    Quelques exemples :

    Avec l'argument ShtRng comme Objet feuille (ici l'argument ValueOnly est omis donc False par défaut.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TrimTable ThisWorkbook.Worksheets("Test_")
    ou invoqué comme fonction avec l'argument ValueOnly à True
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox TrimTable(ThisWorkbook.Worksheets("Test_"), True).Address
    Avec l'argument ShtRng comme Objet Range.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TrimTable ThisWorkbook.Worksheets("Test_").Range("B2:H5")
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TrimTable(ThisWorkbook.Worksheets("Test_").Range("B2:H5")).Interior.Color = vbYellow
    Avec cellules non contigües
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TrimTable ThisWorkbook.Worksheets("Test_").Range("$A$6:$A$9,$C$11:$C$13,$D$6:$D$7,$C$6,$D$15")
    Avec les cellules sélectionnées
    La procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    Function TrimTable(ShtRng As Object, Optional ValueOnly As Boolean = False) As Range
     ' Supprime tous les espaces d'une chaîne de caractères à l'exception des espaces entre les mots
     ' Renvoie un objet Range
     ' Author : Philippe Tulliez
     ' Date : 19/01/2013 (17/01/2013)
     ' Version 2.3
     ' Arguments
     ' ShtRng - Object (WorkSheet ou Range)
     ' [ValueOnly] - Boolean si True transforme le résultat des formules en constante [d=False]
     ' Maximum 255 sélections de cellules non-contguës
     Const ErrTitle As String = "Procédure - TrimTable":
     Dim ErrMsg As String: ErrMsg = "*** Sortie de procédure ***" & vbCrLf & vbCrLf
     Dim myTable() As Variant, wRow As Double, wColumn As Double
     Dim area As Byte, Rng As Range, myRange As Range
     Select Case True ' Test 1er argument
      Case ShtRng Is Nothing ' 19/01/13
       MsgBox ErrMsg & "Problème argument (ShtRng Non affecté)", vbCritical, ErrTitle
       Set TrimTable = ActiveCell
       Exit Function ' Sortie de procédure
      Case TypeOf ShtRng Is Worksheet: Set Rng = ShtRng.Range("A1").CurrentRegion
      Case TypeOf ShtRng Is Range: Set Rng = ShtRng
      Case Else
       ErrMsg = ErrMsg & "Problème argument - ShtRng " & vbCrLf
       MsgBox ErrMsg & "* Objet mal défini (WorkSheet) ou (Range)", vbCritical, ErrTitle
       Set TrimTable = ActiveCell
       Exit Function ' Sortie de procédure
     End Select
     For area = 1 To Rng.Areas.Count
      Set myRange = Rng.Areas(area)
      '
      Select Case myRange.Count
       Case 1 ' Une cellule
        If ValueOnly Then myRange = Trim(myRange.Value) Else myRange = Trim(myRange.Formula)
       Case Else
         If ValueOnly Then myTable() = myRange.Value Else myTable() = myRange.Formula
         For wRow = 1 To UBound(myTable, 1)
          For wColumn = 1 To UBound(myTable, 2)
           On Error Resume Next ' Si erreur renvoyée par une formule (ex #N/A)
           myTable(wRow, wColumn) = Trim(myTable(wRow, wColumn))
           On Error GoTo 0
          Next wColumn
         Next wRow
         myRange = myTable()
      End Select
     Next area
     Set TrimTable = Rng: Set Rng = Nothing: Set myRange = Nothing
     End Function
    Malgré le soin apporté à la programmation de cette procédure et au multiples tests réalisés, il est possible qu'il subsiste une erreur qui m'aurait échappé. N'hésitez pas à m'en faire part.

    [EDIT]
    J'ai déposé une nouvelle version avec un test ShtRng Is Nothing (merci à NVCfrm de l'avoir signalé)
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  15. #15
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 036
    Points : 1 917
    Points
    1 917
    Billets dans le blog
    5
    Par défaut
    Bonsoir Philippe.
    Je tiens encore à m'excuser à nouveau pour mon précédent post désobligeant.


    Malgré le soin apporté à la programmation de cette procédure et au multiples tests réalisés, il est possible qu'il subsiste une erreur qui m'aurait échappé. N'hésitez pas à m'en faire part.
    Rien à dire si ce n'est une suggestion.
    Si Is Nothing...
    un blindage supplémentaire du premier paramètre. ...un risque de fournir à la fonction une variable de type range qui n'est pas affecté.

    Mille excuses encore.
    Ousmane


    Quand on tombe dans l'eau, la pluie ne fait plus peur.

  16. #16
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 772
    Points : 28 633
    Points
    28 633
    Billets dans le blog
    53
    Par défaut
    Bonjour NVCfrm (ce serait sympa d'avoir ton prénom),
    Citation Envoyé par NVCfrm Voir le message
    Bonsoir Philippe.
    Je tiens encore à m'excuser à nouveau pour mon précédent post désobligeant.
    C'est oublié.
    Rien à dire si ce n'est une suggestion.
    Si Is Nothing...
    un blindage supplémentaire du premier paramètre. ...un risque de fournir à la fonction une variable de type range qui n'est pas affecté.
    Mille excuses encore.
    Tu as raison, cela m'a échappé. Je corrige cela tout de suite.
    Merci pour ce retour.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  17. #17
    Membre régulier

    Inscrit en
    Janvier 2011
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 28
    Points : 75
    Points
    75
    Par défaut
    Bonjour Philippe,

    Merci pour cette fonction c'est justement ce dont j'ai besoin.

    Je déterre ce vieux sujet pour avoir quelques précisions :

    pourquoi dans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Case TypeOf ShtRng Is Worksheet: Set Rng = ShtRng.Range("A1").CurrentRegion
    utiliser "Range("A1").CurrentRegion" plutôt que "UsedRange" ?

    Question subsidiaire, pourquoi utiliser une "Function" plutôt qu'une "Sub" ?

    Sinon, j’apprécie beaucoup comment est écrit la procédure.

    Par avance, merci pour vos réponses

    A bientôt
    GM
    A bientôt
    Guy

  18. #18
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274
    Par défaut
    Salut, à lire.
    procédure / fonction : voir par exemple ici et .

  19. #19
    Membre régulier

    Inscrit en
    Janvier 2011
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 28
    Points : 75
    Points
    75
    Par défaut
    Bonjour Kiki29,

    Je te remercie de ta répojnse, je vais préciser mon questionnement.

    D'après Microsoft ( http://msdn.microsoft.com/fr-fr/libr...ice.15%29.aspx )
    [Range.CurrentRegion]Renvoie un objet Range qui représente la zone en cours.La zone en cours est une chaîne délimitée par n'importe quelle combinaison des lignes et colonnes vides.
    et (http://msdn.microsoft.com/fr-fr/libr...ice.15%29.aspx)
    [Worksheet.UsedRange] Renvoie un objet Range qui représente la plage utilisée dans la feuille de calcul spécifiée.
    donc quand "ShtRng" est une feuille "ShtRng.Range("A1").CurrentRegion" ne me semble pas adapté car une partie des cellules de la feuille risque de ne pas être traitées.

    Je connais la différence entre "Sub" et "Function". De mon point de vue pour ce cas, une procédure aurait parfaitement fait l'affaire. Quel est donc l'intérêt que créer une fonction qui retourne le range sur lequel les actions ont été menées ?

    Toutes ces questions ont pour objectif d'essayer de mieux comprendre les subtilités de VBA/Excel VBA et donc de programmer plus efficacement.

    Par avance, je vous remercie de vos réponses.

    A bientôt
    Guy
    A bientôt
    Guy

  20. #20
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274
    Par défaut
    Salut, c'est ce qui apparait dans le post de Joël, de la lecture VBA.

Discussions similaires

  1. [AC-2010] Problème de code pour éliminer les champs vide entre 2 tables
    Par kinine dans le forum VBA Access
    Réponses: 1
    Dernier message: 15/01/2013, 20h16
  2. [XL-2007] Macro pour supprimer les espaces dans les cellules
    Par ab1to dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 26/11/2009, 16h25
  3. Code pour ouvrir les formulaires dans la meme fenetre
    Par maxime350 dans le forum VBA Access
    Réponses: 2
    Dernier message: 13/04/2008, 16h54
  4. Éliminer les lignes blanches dans un tableau
    Par DenPro dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 18/11/2004, 01h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo