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

Macros et VBA Excel Discussion :

Convertir plage en minuscule [Toutes versions]


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Points : 132
    Points
    132
    Par défaut Convertir plage en minuscule
    Bonjour à tous,

    Je souhaite, dans une macro, convertir une plage (ma 1ere ligne) en minuscule.
    J'y suis parvenu avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Rows("1:1").Select
        Dim c As Excel.Range
        For Each c In Selection
        c.Value = LCase(c)
        Next c
    Mais comme mon tableau contient près d'une cinquantaine de colonnes [edit] 187 colonnes, l'opération est assez longue.
    Je me demande donc s'il n'y aurait pas plus rapide, en traitant directement la plage, et non cellule par cellule.
    Mais je ne sais pas faire : est-ce possible, et si oui, comment ?

    Merci pour votre aide !

  2. #2
    Membre du Club
    Homme Profil pro
    Ingénierie de Maintenance
    Inscrit en
    Août 2018
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénierie de Maintenance

    Informations forums :
    Inscription : Août 2018
    Messages : 28
    Points : 42
    Points
    42
    Par défaut Convertir plage en minuscule
    Bonjour !

    Fait à la machette pendant la coupure ….

    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
    Sub minuscules()
     
    'la zone utilisée
    T = ActiveSheet.UsedRange
     
    'les max lignes et colonnes
    Lmax = UBound(T, 1)
    Cmax = UBound(T, 2)
     
    'le range
    c = Range(Cells(1, 1), Cells(Lmax, Cmax))
     
    For Each c In Selection
        c.Value = LCase(c)
    Next c
     
    End Sub

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Points : 132
    Points
    132
    Par défaut
    Merci thekat,
    Malheureusement, l’exécution est toujours aussi lente.
    Et ce qui est long, c'est le fait de passer cellule par cellule.
    J'ai revérifié, il y a 187 colonnes dans mon tableur : peut-être n'est-ce pas possible d'aller plus vite, en fait.

  4. #4
    Membre confirmé
    Homme Profil pro
    Responsable des études(en disponibilité)
    Inscrit en
    Juin 2007
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable des études(en disponibilité)
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 365
    Points : 631
    Points
    631
    Par défaut
    En copiant le texte en minuscule dans le tableau T

    Puis le tableau T dans ta feuille

    le problème devrait être solutionné.

    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
    Sub minusculesTableau()
     
    'la zone utilisée
    T = ActiveSheet.UsedRange
     
    'les max lignes et colonnes
    Lmax = UBound(T, 1)
    Cmax = UBound(T, 2)
     
    For ligne = 1 To Lmax
    For colonne = 1 To Cmax
    T(ligne, colonne) = LCase(T(ligne, colonne))
     
    Next
    Next
     
      ActiveSheet.UsedRange = T
     
     
    End Sub

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Points : 132
    Points
    132
    Par défaut
    Merci a_diard,
    Malheureusement, j'ai une erreur "Erreur d'exécution '13': Incompatibilité de type" " à cette ligne : T(ligne, colonne) = LCase(T(ligne, colonne))

  6. #6
    Membre du Club
    Homme Profil pro
    Ingénierie de Maintenance
    Inscrit en
    Août 2018
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénierie de Maintenance

    Informations forums :
    Inscription : Août 2018
    Messages : 28
    Points : 42
    Points
    42
    Par défaut
    Cà devrait être plus rapide

    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
    Sub minuscules()
     
    'fige la mise à jour de l'écran
    Application.ScreenUpdating = False
     
    'la zone utilisée
    T = ActiveSheet.UsedRange
     
    'les max lignes et colonnes
    Lmax = UBound(T, 1)
    Cmax = UBound(T, 2)
     
     
    'le tableau ne sert plus à rien
    Erase T
     
     
    For L = 1 To Lmax
     
      For c = 1 To Cmax
     
        Cells(L, c).Value = LCase(Cells(L, c))
     
      Next c
     
    Next L
     
    Application.ScreenUpdating = True
     
    End Sub

  7. #7
    Membre éprouvé Avatar de Alex020181
    Homme Profil pro
    Prestataire informatique développeur d'application Excel, Access, VBA
    Inscrit en
    Juin 2012
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Prestataire informatique développeur d'application Excel, Access, VBA

    Informations forums :
    Inscription : Juin 2012
    Messages : 569
    Points : 1 006
    Points
    1 006
    Par défaut
    Bonjour,

    De ce que je comprends tu souhaites mettre en minuscules toutes les données de ta ligne 1 qui comporte pas loin de 200 colonnes le plus rapidement possible.
    Tu as eu des réponses mais:
    - le résultat est trop lent
    - l'exécution du code donné aboutit sur une erreur d'exécution

    Problématique trop lent:
    - Il faut savoir qu'à chaque mise à jour d'une des cellules de la feuille Excel recalcule toutes les formules. Donc si tu mets à jour tes cellules 1 par 1 et que tu en as 200 bein c'est 200 fois le temps de recalcul dans les dents (tu n'as peut-être pas de recalculs dans ton cas je parle ici d'une généralité).
    - Il faut également prendre en compte le code événementiel que ton classeur ou ta feuille peut contenir (tu peux par exemple mettre du code qui se déclenche dès qu'une cellule de ta feuille est modifiée alors avec 200 colonnes...) (tu n'as peut-être pas de code événementiel dans ton cas je parle ici d'une généralité)

    Problématique erreur d'exécution:
    - Les données dans ta cellule ne représentent-elles pas une erreur Excel ? ("#...")

    En PJ tu trouveras un fichier Excel. J'ai mis une valeur en majuscule de A1 à GR1. C'est à dire sur 200 colonnes. Le code lancé par le bouton "GO" passe toutes ces valeurs en minuscules instantanément et ignore les erreurs. Mais c'est un exemple simple sans recalculs à faire ni code événementiel.

    J'ai mis un compteur qui indique le temps mis par le code pour faire la conversion en minuscules PUIS pour faire tous les recalculs (s'il y en a).

    Nom : compteur.png
Affichages : 97
Taille : 5,4 Ko

    Essaye de faire tourner ce code dans le fichier joint directement (en mettant d'autres valeurs en ligne 1 pour vérifier) puis applique ce code à ton cas précis. Mets nous ensuite le résultat ici et on aura une idée plus précise de ce qui pourrait clocher.

    Teste et dis nous.

    PS; le nombre de colonnes pris en compte est automatiquement adapté.
    Fichiers attachés Fichiers attachés
    C'est toujours sympa de savoir si on vous a aidé ou non. Pensez-y

    N'hésitez pas à marquer le sujet comme résolu le cas échéant.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Points : 132
    Points
    132
    Par défaut
    Salut à tous !
    Je réponds d'abord à thekat, qui m'a permit de passer de plus de 25s à 7s de temps d’exécution, rien qu'avec le Application.ScreenUpdating = False auquel je n'avais pas pensé ().
    Alex020181, je regarde ton code et te réponds au plus vite (désolé si ce n'est pas dans la foulée, je suis sur d'autres sujets en même temps) : mais MERCI déjà pour tous ces conseils !

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Points : 132
    Points
    132
    Par défaut
    Citation Envoyé par Alex020181
    Essaye de faire tourner ce code dans le fichier joint directement (en mettant d'autres valeurs en ligne 1 pour vérifier) puis applique ce code à ton cas précis. Mets nous ensuite le résultat ici et on aura une idée plus précise de ce qui pourrait clocher.
    SUPER !!!!
    J'ai testé d'abord dans ton fichier, puis intégré dans mon classeur, et l’exécution est INSTANTANÉE sur toutes mes colonnes !!!
    (je n'ai pas de formules basées sur ces entêtes, ni de codes évènementiels dans mon classeur)

    Bon, je vais maintenant devoir me pencher sur ce code pour le comprendre : pas une mince affaire pour moi, mais ça va me faire bien progresser !

    MERCI !!!

  10. #10
    Membre expérimenté
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 747
    Points : 1 332
    Points
    1 332
    Par défaut
    Bonjour,

    une version adaptée de celle d'Alex, sans transposition

    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
    48
    49
    50
    51
    52
    53
    Sub test()
     
    Dim colonne_cours As Long
    Dim nbre_max_colonne As Long
    Dim lettre_max_colonne As String
     
    Dim debut_mise_minuscules As Date
    Dim fin_mise_minuscules As Date
    Dim delai_mise_minuscules As Date
     
    Dim fin_recalcul As Date
    Dim delai_recalcul As Date
     
    Dim tablo_donnees
    Dim Calc As Long
     
    Application.ScreenUpdating = False
    Calc = Application.Calculation
    Application.Calculation = xlCalculationManual
     
    debut_mise_minuscules = Time
     
    With ActiveSheet
     
        nbre_max_colonne = .Cells(1, .Columns.Count).End(xlToLeft).Column
     
        tablo_donnees = .Range("A1", .Cells(1, nbre_max_colonne)).Value
     
        For colonne_cours = 1 To nbre_max_colonne
     
            On Error Resume Next
            tablo_donnees(1, colonne_cours) = LCase(tablo_donnees(1, colonne_cours))
            On Error GoTo 0
     
        Next colonne_cours
     
        .Range("A1", .Cells(1, nbre_max_colonne)).Value = tablo_donnees
     
    End With
     
    fin_mise_minuscules = Time
    delai_mise_minuscules = fin_mise_minuscules - debut_mise_minuscules
     
    Application.Calculation = Calc
     
    fin_recalcul = Time
    delai_recalcul = fin_recalcul - fin_mise_minuscules
     
    Application.ScreenUpdating = True
     
    MsgBox "Fin de macro." & vbNewLine & vbNewLine & "Début mise minuscules:" & Chr(9) & debut_mise_minuscules & vbNewLine & "Fin mise minuscules:" & Chr(9) & fin_mise_minuscules & vbNewLine & "Délai mise minuscules:" & Chr(9) & delai_mise_minuscules & vbNewLine & vbNewLine & "Début recalcul:" & Chr(9) & fin_mise_minuscules & vbNewLine & "Fin recalcul:" & Chr(9) & fin_recalcul & vbNewLine & "Délai recalcul:" & Chr(9) & delai_recalcul & vbNewLine & vbNewLine, vbInformation, "Tadaaaaa"
     
    End Sub

  11. #11
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    Bonsoir à vous, Bonsoir au Forum,

    Je pense qu'il faudrait aussi gérer les évènements tels que EnableEvents et rétablir le mode de calcul initial après l'avoir changé en manuel

    A adapter

    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
    48
    49
    50
    51
    52
    Option Explicit
     
    Public Sub essai_minuscule()
     
    Dim Ti As Single
    Ti = Timer
     
    Dim mode_calc As Variant
     
    With Application
            .EnableEvents = False
            .ScreenUpdating = False
            mode_calc = .Calculation
            .Calculation = xlCalculationManual
    End With
     
    Dim dern_row As Long, dern_column As Long
    Dim i As Long, j As Long
     
    'Mise en minuscules
    With Sht_Essai
     
            dern_column = .Cells(1, .Columns.Count).End(xlToLeft).Column
            dern_row = .Cells(.Rows.Count, 1).End(xlUp).Row
     
            ReDim T(1 To dern_row, 1 To dern_column)
            T = .Range("A1", .Cells(dern_row, dern_column)).Value
     
            For i = LBound(T, 1) To UBound(T, 1)
                    For j = LBound(T, 2) To UBound(T, 2)
                            T(i, j) = LCase(T(i, j))
                    Next j
            Next i
     
            With .Range("A1").Resize(UBound(T, 1), UBound(T, 2))
                    .ClearContents
                    .Value = T
            End With
     
            .Calculate
     
    End With
     
    With Application
            .Calculation = mode_calc
            .EnableEvents = True
            .ScreenUpdating = True
    End With
     
    Debug.Print Timer - Ti
     
    End Sub
    Ce n'était pas une hypothèse de départ.
    S'il s'agit d'une table de données (tableau structuré), ce qu'il faut préconiser avant tout, alors le code en aurait été simplifié.

    Bien Cordialement.

    Marcel

    Dernier billet:
    Suppression des doublons d'un tableau structuré, gestion d'un array

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


  12. #12
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    Bonjour,

    Je reviens avec le mode tableau structuré

    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
    48
    49
    50
    51
    Option Explicit
     
    Public Sub essai_minuscule_tblostruc()
     
    Dim Ti As Single
    Ti = Timer
     
    Dim mode_calc As Variant
     
    With Application
            .EnableEvents = False
            .ScreenUpdating = False
            mode_calc = .Calculation
            .Calculation = xlCalculationManual
    End With
     
    Dim tablo As ListObject
    Set tablo = Range("T_famille").ListObject
     
    Dim i As Long, j As Long
     
    With tablo
            If Sht_trav2.FilterMode = True Then .AutoFilter.ShowAllData
            ReDim T(1 To .ListRows.Count, 1 To .ListColumns.Count)
            With .DataBodyRange
                    T = .Value
                    .Delete
            End With
            For i = LBound(T, 1) To UBound(T, 1)
                    For j = LBound(T, 2) To UBound(T, 2)
                            T(i, j) = LCase(T(i, j))
                    Next j
            Next i
            .ListRows.Add.Range.Cells(1, 1).Resize(UBound(T, 1), UBound(T, 2)).Value = T
    End With
     
    Erase T
     
    Set tablo = Nothing
     
    Sht_trav2.Calculate
     
    With Application
            .Calculation = mode_calc
            .EnableEvents = True
            .ScreenUpdating = True
    End With
     
    Debug.Print Timer - Ti
     
    End Sub
    A noter que, sur le tableur, le bloc With est affecté au seul tableau.

    Bien Cordialement.

    Marcel

    Dernier billet:
    Suppression des doublons d'un tableau structuré, gestion d'un array

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 03/12/2007, 20h34
  2. Réponses: 4
    Dernier message: 22/10/2007, 13h51
  3. Réponses: 5
    Dernier message: 12/12/2006, 10h19
  4. [XSLT] Convertir toutes les noms de balise en minuscule ?
    Par ghohm dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 13/07/2006, 12h49
  5. [Flash MX]Convertir en Minuscule sous
    Par europa-conseils dans le forum Flash
    Réponses: 3
    Dernier message: 26/01/2004, 18h34

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