Majuscules et NomPropre -EXCEL

Résolu
gcpas13 -  
gcpas13 Messages postés 6 Statut Membre -
Bonjour,

Je fais du depouillement d'acte et j'aimerais que la saisie de certaine colonne soit automatisée.
que lorsque j'ecrit en minuscule, mes cellules ce transformes seules.
Car il y a plusieurs feuilles et des miliers de lignes dans chaques feuilles.

Par exemple:
1) Les colonnes B, D, F, J, K, N, R, T, X, AN, AQ doivent être en Majuscules.
2) Les colonnes C, E, M, O, S, U, W, Y, AO, AR doivent être en Nom propre (Chaque mot doit commencer par une majuscules)

Je n'y connais pas grand choses en BVA, sur la toile, j'ai trouver des codes, mais soit la feuilles completes est en Majuscules soit en Nompropre.

Merci pour ceux qui voudrons bien m'apporter leur aide.

Salutations
Configuration: Windows XP Internet Explorer 7.0 
OFFICE PRO 2007

11 réponses

  1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    J'avais mal lu, je te transforme la feuille après saisie...
    Sub ConvertiM()
        Dim colsM As Variant, colsNP As Variant, c As Variant, i As Long, j As Long
        'colonnes à convertir en majuscules
        colsM = Array("B", "D", "F", "J", "K", "N", "R", "T", "X", "AN", "AQ")
        'colonnes à convertir en Nom Propres
        colsNP = Array("C", "E", "M", "O", "S", "U", "W", "Y", "AO", "AR")
        For Each c In colsM
            For j = 1 To Range(c & "65536").End(xlUp).Row
                If Not IsNumeric(Range(c & j).Value) And Not IsDate(Range(c & j).Value) Then
                    Range(c & j) = UCase(Range(c & j))
                End If
            Next j
        Next c
        For Each c In colsNP
            For j = 1 To Range(c & "65536").End(xlUp).Row
                If Not IsNumeric(Range(c & j).Value) And Not IsDate(Range(c & j).Value) Then
                    Range(c & j) = Application.Proper(Range(c & j))
                End If
            Next j
        Next c
    End Sub

    Si tu veux vraiment au fil de l'eau redemande...
    eric
    1
    1. gcpas13 Messages postés 6 Statut Membre
       
      Salut Eric

      Merci de ta réponse...
      Ton code fonctionne à merveille sur des fichiers déjà "pleins".

      Par contre, ce que je recherche c'est la possibiliter de cette transformation dès la saisie, cela évite d'avoir à revenir à chaque fois sur le feuille.

      Donc si tu peux me redonner un coup de pouce...serait génial

      Merci

      Josyan
      0
  2. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    A mettre dans chaque feuille concernée :
    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim colsM As Variant, colsNP As Variant, c As Variant, col As String, i As Long, j As Long
        'colonnes à convertir en majuscules
        colsM = Array("B", "D", "F", "J", "K", "N", "R", "T", "X", "AN", "AQ")
        'colonnes à convertir en Nom Propres
        colsNP = Array("C", "E", "M", "O", "S", "U", "W", "Y", "AO", "AR")
        Application.EnableEvents = False
        col = Mid(Cells(1, Target.Column).Address, 2, Len(Cells(1, Target.Column).Address) - 3)
        For Each c In colsM
            If col = c Then
                If Not IsNumeric(Target.Value) And Not IsDate(Target.Value) Then
                    Target.Value = UCase(Target.Value)
                    
                End If
            End If
        Next c
        For Each c In colsNP
            If col = c Then
                If Not IsNumeric(Target.Value) And Not IsDate(Target.Value) Then
                    Target.Value = Application.Proper(Target.Value)
                End If
            End If
        Next c
        Application.EnableEvents = True
    End Sub


    eric
    1
  3. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    Voici la procédure complète :
    Private Sub Worksheet_Change(ByVal Target As Range)
        Application.EnableEvents = False
        'cellules en majuscules
        If Not Intersect(Target, Union([C12], [H12])) Is Nothing Then
            If Not IsNumeric(Target.Value) And Not IsDate(Target.Value) Then
                Target.Value = UCase(Target.Value)
            End If
        'cellules en Nom Propre
        ElseIf Not Intersect(Target, Union([C11], [H11])) Is Nothing Then
            If Not IsNumeric(Target.Value) And Not IsDate(Target.Value) Then
                Target.Value = Application.Proper(Target.Value)
            End If
        End If
        Application.EnableEvents = True
    End Sub

    Comme on retrouve la colonne C qui était déjà définie je suppose que c'est sur une autre feuille.

    Sinon, si c'est sur la même feuille, je suppose que ça doit prendre le dessus sur la macro qui traite toute la colonne et doit être exécuté après. Dans ce cas copier le code (sans sub, end sub et Application.EnableEvents) et le mettre à la fin de l'autre, avant Application.EnableEvents = True.

    eric
    1
  4. gcpas13 Messages postés 6 Statut Membre
     
    Un très très grand merci...

    Je viens de tester dur un dépouillement c'est GENIAL...
    Et en plus j'ai reussi a l'adapter à une autre feuille qui n'avait pas les même colonnes.
    Je te remercie vivement.

    Salutations
    Josyan.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Merci pour le retour et bonne continuation
    eric
    0
  7. gcpas13 Messages postés 6 Statut Membre
     
    Salut Eric....Encore moi,

    J'essaye de comprendre le cheminement de ce que tu m'a donner... mais dur dur, j'y comprends pas vraiment tout.

    Je reviens donc vers toi avec une autre question.
    Si je voulais faire la même chose que pour mes colonnes mais avec cette fois ci, juste pour des cellules...
    avec:
    cellules C12 et H12 en majuscules
    et cellules C11 et H11 en NomPropre...

    Que devrais-je modifier à ton code pour que cela fonctionne...

    Encore merci
    Josyan.
    0
  8. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Re,

    Vite fait un exemple car c'est l'heure du dodo :
    If Not Intersect(Target, Union([C12], [H12])) Is Nothing Then
        If Not IsNumeric(Target.Value) And Not IsDate(Target.Value) Then
            Target.Value = UCase(Target.Value)
        End If
    End If


    Tu peux ajouter autant de ref que tu veux dans union()
    Toujours dans l'evenement change
    eric
    0
  9. gcpas13 Messages postés 6 Statut Membre
     
    Salut,

    C'est vrai que pour toi c'est l'heure du dodo..moi j'ai moins 6h de décalage par rapport à toi.
    Merci de ta patience et de me répondre...

    Bon j'ai essayer de comprendre ... et bien c'est pas gagner...

    Dans le code Nº que tu m'avais noté, je crois comprendre que la ligne qui commence par Dim est la déclaration...
    ensuite la désignation des colonnes.
    Le reste j'ai pas tout suivis...donc je ne sais pas ou mettre le 3ème codes...

    Désolée, c'est pas trop mon truc et je rame.
    Mais comme j'aime bien savoir le pourquoi du comment je me permets de t'importuner de nouveau.

    Si tu pouvais me faire la meme chose pour mes cellules Majuscules et Nompropre en m'expliquant la démarche des formules employées.

    Je vais essayer aussi de trouver sur le net un "dictionnaire" de VBA.

    Encore merci merci de ton aide.
    Josyan
    0
  10. gcpas13 Messages postés 6 Statut Membre
     
    Bonjour Eric,

    Merci Merci....

    Je viens de tester sur ma feuille, une vrai merveille....

    Effectivement il s'agit d'une autre feuille, celle si c'est pour des communiants et des soldats.
    Je commence à comprendre un peut mieux, en fait pour chaque caractéristiques (majuscules, nompropre) il faut un nouveau code. Par contre pourquoi mettre une ligne qui semble vouloir dire, si c'est pas numerique ou si c'est pas une date?? celà a t'il vraiment une importance?.

    Bonne journée
    Josyan.
    0
  11. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    En vba il est préférable de ne faire travailler les fonctions que sur les types de données qu'elles attendent.
    Souvent ça génère une erreur car contrairement aux fonctions feuilles il n'y a pas de conversion automatique lorsque c'est nécessaire...
    Là, à-priori, on pourrait se passer du test isnumeric (d'ailleurs ça m'étonne) mais une date qui passe par Ucase se retrouve transformée en chaine. Un recherchev() par exemple ne la retrouvera plus.
    Ces fonctions travaillent sur des chaines, je ne leur passe que des chaines. De plus un traitement de chaine est souvent plus couteux en ressource qu'un test (bien que là toutes les cellules sont sensées être toutes des chaines donc toutes traitées, on est perdant...).
    eric
    0
  12. gcpas13 Messages postés 6 Statut Membre
     
    Encore merci..
    Merci aussi de tes explications, je comprends un peu mieux maintenant, surout que j'ai aussi trouver un "manuel" du language pour m'aider...
    Encore une grand merci et excuse moi de ma réponse tardive, j'etais absente aujourd'hui.
    Josyan
    0