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 :

Mise en page d'un fichier après passage en majuscule [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Août 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paramétreur de progiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2015
    Messages : 12
    Par défaut Mise en page d'un fichier après passage en majuscule
    Bonjour à tous,

    je suis à la recherche d'un code en vba afin d’améliorer une macro que j'ai mise en place.
    J'ai pour mission de retravailler des tables de base de données. Dans un premier temps j'ai crée un macro pour passer tous les caractères en majuscule de cette façon :

    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
    Sub ConvertingUcase()
    Dim TheString As String, TheLetter As String, TheUcase As String
    Dim i As Byte
        Application.EnableEvents = False
        For Each c In Selection
            TheString = c.Value
            For i = 1 To Len(TheString)
                TheLetter = Mid(TheString, i, 1)
                Select Case TheLetter
                Case Chr(224), Chr(225), Chr(226), Chr(227), Chr(228), Chr(229) 'Les "A"
                    TheLetter = Chr(65)
                    TheUcase = TheUcase & TheLetter
                Case Chr(232), Chr(233), Chr(234), Chr(235) ' les "E"
                    TheLetter = Chr(69)
                    TheUcase = TheUcase & TheLetter
                Case Chr(236), Chr(238), Chr(238), Chr(239) 'Les "I"
                    TheLetter = Chr(73)
                    TheUcase = TheUcase & TheLetter
                Case Chr(243), Chr(243), Chr(244), Chr(245), Chr(246) 'Les "O"
                    TheLetter = Chr(79)
                    TheUcase = TheUcase & TheLetter
                Case Chr(249), Chr(250), Chr(251), Chr(252) 'Les "U"
                    TheLetter = Chr(85)
                    TheUcase = TheUcase & TheLetter
                Case Else
                TheLetter = UCase(TheLetter)
                TheUcase = TheUcase & TheLetter
                End Select
            Next
            c.Value = TheUcase
            TheUcase = ""
        Next
        Application.EnableEvents = True
    End Sub
    cette macron fonctionne tres bien, mais, cela modifie aussi les fonction VRAI / FAUX, cette valeur est considérée comme un texte et passe en alignement a gauche (c'est le seul moyen de repérer que la valeur n'est plus considérée comme VRAI/FAUX lors de la réimportation de ces tables dans la base de données...) si je double clic sur la cellule et que je change de cellule, la valeur repasse en alignement centré et est considérée comme valeur VRAI / FAUX...
    je ne sais pas si j'ai été clair :-/

    Auriez vous une idée de ce que je pourrais ajouter comme code afin que ma macro je puisse ne pas modifier les valeur VRAI/FAUX de mes tables ?

  2. #2
    Membre Expert Avatar de QuestVba
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2012
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2 475
    Par défaut
    Bonjour,

    tu pourrais faire un test pour voir si ta cellule contient une formule. Une aide: http://www.developpez.net/forums/d93...tient-formule/

  3. #3
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Août 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paramétreur de progiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2015
    Messages : 12
    Par défaut
    bonjour, merci pour votre réponse, mais j'ai essayé ce code seul dans un premier temps, cela met bien en rouge lorsqu'il y a une formule par contre, cela ne détecte pas pour un VRAI / FAUX...

  4. #4
    Membre éprouvé
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Août 2015
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Santé

    Informations forums :
    Inscription : Août 2015
    Messages : 74
    Par défaut Essayons de tester du numérique
    Bonjour
    Il ne faut pas faire le remplacement pur toutes les valeurs numérique s(dont VRAI et FAUX).
    Donc je propose de commencer par tester If Not IsNumeric(c.Value) Then avant de faire les différentes conversions.
    Car TheString = c.Value convertit la valeur en String, donc après forcément, c.Value = TheUcase convertiti ta cellule en texte.

    Il sufit donc d'ajouter le code en rouge :

    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
        For Each c In Selection
            If Not IsNumeric(c.Value) Then
                TheString = c.Value
                For i = 1 To Len(TheString)
                    TheLetter = Mid(TheString, i, 1)
                    Select Case TheLetter
                       Case Chr(224), Chr(225), Chr(226), Chr(227), Chr(228), Chr(229) 'Les "A"
                          TheLetter = Chr(65)
                          TheUcase = TheUcase & TheLetter
                       Case Chr(232), Chr(233), Chr(234), Chr(235) ' les "E"
                          TheLetter = Chr(69)
                          TheUcase = TheUcase & TheLetter
                       Case Chr(236), Chr(238), Chr(238), Chr(239) 'Les "I"
                          TheLetter = Chr(73)
                          TheUcase = TheUcase & TheLetter
                       Case Chr(243), Chr(243), Chr(244), Chr(245), Chr(246) 'Les "O"
                          TheLetter = Chr(79)
                          TheUcase = TheUcase & TheLetter
                       Case Chr(249), Chr(250), Chr(251), Chr(252) 'Les "U"
                          TheLetter = Chr(85)
                          TheUcase = TheUcase & TheLetter
                       Case Else
                          TheLetter = UCase(TheLetter)
                          TheUcase = TheUcase & TheLetter
                    End Select
                Next i
                c.Value = TheUcase
                TheUcase = ""
            End If
        Next c
    J'ai testé, ça marche sur mon exemple.
    Et pour toi ?

    Cdlt,
    Didier

  5. #5
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Août 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paramétreur de progiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2015
    Messages : 12
    Par défaut
    Bonjour Didier,
    merci pour cette explication. J'ai appliqué ta méthode et cela fonctionne !!

  6. #6
    Membre éprouvé
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Août 2015
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Santé

    Informations forums :
    Inscription : Août 2015
    Messages : 74
    Par défaut
    Alors un petit aiderait à la lecture du forum...
    (et pourquoi pas un petit au passage...)

  7. #7
    Membre Expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Par défaut
    Bonjour,

    Même si c'est résolu, je fais la suggestion suivante, en passant par le specialCells pour déjà ne retenir que ce qui est valeur constante (donc pas les formules)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub Conv_Value_toUpCase()
     
    Dim InpRng As Range, Cl As Range
     
    Set InpRng = ActiveSheet.Range("C9").CurrentRegion  'A adapter
    Debug.Print "Région: ", InpRng.AddressLocal
     
    Set InpRng = InpRng.SpecialCells(xlCellTypeConstants)
    Debug.Print "Valeur: "; InpRng.AddressLocal
     
    For Each Cl In InpRng.Cells
        Debug.Print Cl.Value, Cl.Address
        If Not (IsNumeric(Cl)) Then Cl.Value = UCase(Cl.Value)
    Next Cl

  8. #8
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Août 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paramétreur de progiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2015
    Messages : 12
    Par défaut
    Bonjour vinc_bilb,
    je ne vois pas trop comment ajouter ton code avec mon code... Désolé mais je suis vraiment novice dans le vba

  9. #9
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut heu
    bonjour
    il y avait beaucoup plus simple

    1 tester si la cellule contient une formule : en effet si tu a vrai/faux c'est qu'il y a une formule ,dans ce cas la tester
    if cells(x,y) hasformula

    ou tester directement si il y a vrai ou faux

    ensuite pour la conversion

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(x, y).Value = StrConv(Replace(UCase(Cells(x, y)), "A", "A"), vbProperCase)
    je pourrait aussi te parler des expressions rationnelles et de sa fonction replace si ca t'interesse bien sur

    bref 3 lignes de codes auraient suffit
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  10. #10
    Membre éprouvé
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Août 2015
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Santé

    Informations forums :
    Inscription : Août 2015
    Messages : 74
    Par défaut Je traduis...
    Pour quelqu'un de "novice en VBA", il faut traduire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       For Each c In Selection
            If Not IsNumeric(c.Value) And Not c.HasFormula() Then
                    c.Value = StrConv(Replace(UCase(c.Value), "A", "A"), vbUpperCase)
            End If
        Next c
    C'est clairement mieux comme code, merci patricktoulon !
    Par contre, @patricktoulon :
    1. Cela convertit les é en É, etc. ce qui n'était pas le cas de la macro initiale.
      Une idée pour rester sur l'ancien fonctionnement ? (convertir é en E)
    2. Pourquoi ces 3 fonctions imbriquées ?
      Un simple UCase ou StrConv(vbUpperCase) ne suffit pas ?

    Merci de tes précisions.

  11. #11
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonsoir didier

    oui j'ai cru betement que le ucase ferait sauter les accents

    maintenant il y a des solutions
    un peu comme celle ci:
    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
    Private Declare Function FoldString Lib "kernel32" Alias "FoldStringA" (ByVal dwMapFlags As Byte, ByVal lpSrcStr As Long, ByVal cchSrc As Long, ByVal lpDestStr As Long, ByVal cchdest As Long) As Long
    Function SANSACCENTS(Texte As String) As String
     Dim I As Integer
     SANSACCENTS = Space(Len(Texte))
     For I = 0 To Len(Texte) * 2 - 2 Step 2
      FoldString &H40, StrPtr(Texte) + I, 1, StrPtr(SANSACCENTS) + I, 1
     Next I
    SANSACCENTS = UCase(SANSACCENTS)
     End Function
     
    Sub test()
     For Each c In Selection
            If Not IsNumeric(c.Value) And Not c.HasFormula() Then
                    c.Value = SANSACCENTS(c.Value)
            End If
        Next c
     End Sub
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  12. #12
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Août 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paramétreur de progiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2015
    Messages : 12
    Par défaut
    bonsoir patricktoulon,
    j'ai testé ce code, mais ca bugue des la premiere ligne, il ne supporte pas ma version 64 bits ...?

    Nom : Capture.JPG
Affichages : 145
Taille : 24,3 Ko

  13. #13
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    essai de remplacer la 1 ere ligne par ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #if win64
    Private Declare ptrsafe Function FoldString Lib "kernel32" Alias "FoldStringA" (ByVal dwMapFlags As Byte, ByVal lpSrcStr As Long, ByVal cchSrc As Long, ByVal lpDestStr As Long, ByVal cchdest As Long) As Long
    #else
    Private Declare Function FoldString Lib "kernel32" Alias "FoldStringA" (ByVal dwMapFlags As Byte, ByVal lpSrcStr As Long, ByVal cchSrc As Long, ByVal lpDestStr As Long, ByVal cchdest As Long) As Long
    #end if 
    
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  14. #14
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Août 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paramétreur de progiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2015
    Messages : 12
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    bonsoir didier

    oui j'ai cru betement que le ucase ferait sauter les accents

    maintenant il y a des solutions
    un peu comme celle ci:
    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
    Private Declare Function FoldString Lib "kernel32" Alias "FoldStringA" (ByVal dwMapFlags As Byte, ByVal lpSrcStr As Long, ByVal cchSrc As Long, ByVal lpDestStr As Long, ByVal cchdest As Long) As Long
    Function SANSACCENTS(Texte As String) As String
     Dim I As Integer
     SANSACCENTS = Space(Len(Texte))
     For I = 0 To Len(Texte) * 2 - 2 Step 2
      FoldString &H40, StrPtr(Texte) + I, 1, StrPtr(SANSACCENTS) + I, 1
     Next I
    SANSACCENTS = UCase(SANSACCENTS)
     End Function
     
    Sub test()
     For Each c In Selection
            If Not IsNumeric(c.Value) And Not c.HasFormula() Then
                    c.Value = SANSACCENTS(c.Value)
            End If
        Next c
     End Sub
    Bonjour Patrick,
    pour la version 32 bits je l'ai testé avec un autre ordinateur, elle fonctionne bien sauf que parfois, l'apostrophe se transforme en caractère bizarre :

    Nom : Capture.JPG
Affichages : 136
Taille : 10,0 Ko
    et encore plus bizarre c'est pas pour tous les apostrophes dans le fichier, L'ALARME ou D'ALARME ne sont pas modifiés.
    J'ai aussi ETC... qui se transforme en ETC&
    merci pour ton aide.
    Jérôme

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

Discussions similaires

  1. mise en page de la saisie aprés l'enregistrement dans une bd
    Par biba158 dans le forum Interfaces Graphiques en Java
    Réponses: 13
    Dernier message: 20/06/2007, 16h29
  2. Réponses: 3
    Dernier message: 02/05/2007, 17h27
  3. [Excel] Récupérer la mise en page d'un fichier
    Par Zan dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 02/11/2006, 17h48
  4. Mise en page d un fichier texte
    Par mika95013 dans le forum Langage
    Réponses: 2
    Dernier message: 24/08/2006, 13h53
  5. Réponses: 1
    Dernier message: 05/05/2006, 11h36

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