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 :

Ajouter par VBA somme fixe aux cellules colonne suivant 2 ou 3 critères


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2013
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 73
    Points : 21
    Points
    21
    Par défaut Ajouter par VBA somme fixe aux cellules colonne suivant 2 ou 3 critères
    Bonjour, .
    Je suis sur Windows 10 et Office 2003.
    Voici mon problème. J’ai un classeur avec des colonnes de A à I.
    Je voudrais par VBA
    1°) Ajouter la somme de 10 € au montant des cellules non vides de la colonne G si les cellules correspondantes de la colonne D .ne sont pas vides.
    2°) Ajouter à nouveau la somme de 10 € au montant des cellules non vides de la colonne G si les cellules correspondantes de la colonne D .ne sont pas vides et si le contenu des cellules correspondantes de la colonne A est "Double".
    3°) Afficher ensuite la feuille complète.
    Actuellement je procède manuellement. J'inscris 10 € dans une cellule vide que j’enregistre. J’utilise ensuite le filtre automatique et le collage spécial, Addition.
    J’essaie maintenant de faire les mêmes opérations avec un code que je voudrais incorporer dans une macro : je n’y arrive pas. Avec mes remerciements à ceux qui pourront m’aider.

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 593
    Points : 34 257
    Points
    34 257
    Par défaut
    Bonjour,

    je t'encourage a passer dans un premier temps par l'enregistreur de macros
    http://fauconnier.developpez.com/tut...istreur-macro/

    Une fois le code cree, on devrait avoir une bonne base pour t'aider a le generaliser.
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2013
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 73
    Points : 21
    Points
    21
    Par défaut
    Bonjour Jean-Philippe,
    Comme conseillé, j’ai utilisé l’enregistreur de macros. Comme toujours avec l’enregistreur, il y a beaucoup de "select". J’ai intercalé des commentaires pour les parties du code que je comprends et un ? pour celles qui m’échappent. Enfin, reste le problème de la sélection des plages résultant du filtrage. Le code les définit par la cellule début et de fin . Mais d’une opération à l’autre les plages ne sont jamais identiques. Comment faire pour ne sélectionner que les plages filtrées mais toutes les pages filtrées ? Voici donc le code. Il y a encore du travail pour le généraliser et peut-être le rendre plus élégant.
    J'aurai bien besoin de ton aide !
    Bon week-end
    Homère

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    Sub Macro1AjouterSomme()
    '
    ' Macro1AjouterSomme Macro
    ' Macro enregistrée le 07/10/2016 par Ulysse
    '
    ' Touche de raccourci du clavier: Ctrl+Maj+P
     
     
    'Avant d'utiliser la macro issue de l'enregistreur on active le Fichier Test :
     Workbooks("Fichier test.xls").Activate
     
      'Insrire 10 € dans la cellule J2 et la mettre dans le presse papier :
      ActiveShhers.Range("J2").Select
        ActiveCell.FormulaR1C1 = "$10"
     
        Range("J2").Select
        Selection.Copy
       'Installer le filtre automatique :
       'et filtrer les cellules "Non Vides" des colonnes D et G :
        Application.CutCopyMode = False
        Selection.AutoFilter
        Selection.AutoFilter Field:=4, Criteria1:="<>"
        Selection.AutoFilter Field:=7, Criteria1:="<>"
         ' ?
         Application.CommandBars("Task Pane").Visible = False
     
        'On remplit le presse-paier (J2=10€)
        Range("J2").Select
        Selection.Copy
     
        'On sélectionne les cellules visibles de la colonne G :
        Range("G2:G16").Select
     
        ' Par collage spécial on ajoute 10 € aux cellules de la colonne G :
        Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlAdd, SkipBlanks:= _
            False, Transpose:=False
        Application.CutCopyMode = False
     
        '?
        ActiveSheet.ShowAllData
     
        'On filtre les cellules non vides de la colonne D :
        Selection.AutoFilter Field:=4, Criteria1:="<>"
     
        'On filire les cellules de la colonne A dont le contenu est "M Mme" :
        Range("A1").Select
        Selection.AutoFilter Field:=1, Criteria1:="M Mme"
     
        'On remplit le presse-paier (J2=10€) :
        Range("J2").Select
        Selection.Copy
     
        'On sélectionne les cellules visibles de la colonne A :
        Range("G2:G14").Select
     
        ' Par collage spécial on ajoute 10 € aux cellules de la colonne G :
        Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlAdd, SkipBlanks:= _
            False, Transpose:=False
        Application.CutCopyMode = False
     
        '?
        ActiveSheet.ShowAllData
        'On s'intéresse aux couples d'adhérents NON abonnés :
        Selection.AutoFilter Field:=1, Criteria1:="M Mme"
        Selection.AutoFilter Field:=6, Criteria1:="="
        ActiveWindow.SmallScroll Down:=-6 '?
         Application.CutCopyMode = False
        ActiveSheet.ShowAllData
        Selection.AutoFilter
    End Sub

  4. #4
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Bonjour,

    J'ai essayé de nettoyer ton code en y ajoutant quelques commentaires.
    Je précise que, n'ayant pas de données pour tester, je n'ai pas lancé ce code.
    A toi, donc, de l'essayer et de nous donner le résultat.
    Le nom de la feuille sur laquelle s'applique ce code est à préciser.
    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
    54
    55
    Option Explicit
     
    Sub Macro1AjouterSomme()
    '
    ' Macro1AjouterSomme Macro
    ' Macro enregistrée le 07/10/2016 par Ulysse
    '
    ' Touche de raccourci du clavier: Ctrl+Maj+P
      Dim wbk As Workbook
      Dim wks As Worksheet
     
      'Avant d'utiliser la macro issue de l'enregistreur on assigne le Fichier Test à la variable wbk:
      Set wbk = Workbooks("Fichier test.xls")
      ' On assigne la feuille "NomDeLaFeuille" (à adapter) à la variable wks
      Set wks = wbk.Sheets("NomDeLaFeuille")
     
      ' Vu qu'on va travailler sur la feuiile "NomDeLaFeuille", on crée un bloc With / End With
      With wks
        'Insrire 10 € dans la cellule J2 et la mettre dans le presse papier :
        .Range("J2").Value = "$10" ' .Value plutôt que .FormulaR1C1 puisqu'il s'agit d'une valeur et pas une formule
     
        .Range("J2").Copy
        'Installer le filtre automatique :
        'et filtrer les cellules "Non Vides" des colonnes D et G :
        Application.CutCopyMode = False ' Tiens, pourquoi? Ceci annule le Copy précédent
        .Range("J2").AutoFilter Field:=4, Criteria1:="<>", Field:=7, Criteria1:="<>"
     
        'On remplit le presse-paier (J2=10€)
        .Range("J2").Copy
     
        ' Par collage spécial on ajoute 10 € aux cellules de la colonne G :
        .Range("G2:G16").PasteSpecial Paste:=xlPasteAll, Operation:=xlAdd, SkipBlanks:= _
            False, Transpose:=False
        Application.CutCopyMode = False
     
        'On filtre les cellules non vides de la colonne D :
        .Range("G2:G16").AutoFilter Field:=4, Criteria1:="<>"
     
        'On filire les cellules de la colonne A dont le contenu est "M Mme" :
        .Range("A1").AutoFilter Field:=1, Criteria1:="M Mme"
     
        'On remplit le presse-paier (J2=10€) :
        .Range("J2").Copy
     
        ' Par collage spécial on ajoute 10 € aux cellules de la colonne G :
        .Range("G2:G14").PasteSpecial Paste:=xlPasteAll, Operation:=xlAdd, SkipBlanks:= _
            False, Transpose:=False
        Application.CutCopyMode = False
     
        'On s'intéresse aux couples d'adhérents NON abonnés :
        .Range("G2:G14").AutoFilter Field:=1, Criteria1:="M Mme", Field:=6, Criteria1:="="
        Application.CutCopyMode = False
        .ShowAllData
      End With
    End Sub
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  5. #5
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2013
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 73
    Points : 21
    Points
    21
    Par défaut
    Bonjour Jean-Philippe,
    Un grand merci pour le code nettoyé : il fonctionne parfaitement avec le Fichier test.
    Il ne me reste plus qu’à l’adapter au fichier réel…mais ça, je sais faire !
    Par ailleurs,en explorant le net, j’ai trouvé un bout de code plus élégant qui fonctionne parfaitement pour la première partie du problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     Workbooks("Fichier Test.xls").Sheets("Feuil1").Activate
      Dim Cel As Range
        For Each Cel In Range("G2", Range("G" & Rows.Count).End(xlUp))
           If Cel.Offset(, -3).Value <> "" And Cel.Value <> "" Then Cel = Cel.Value + 10
        Next Cel
    Mais quand pour la suite, j’écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If Cel.Offset(, -3).Value <> "" And Cel.Value <> "" And Cel.Offset(, -6).Value("M Mme") Then Cel = Cel.Value + 10
        Next Cel
    Cette ligne de code s’affiche en jaune et j’ai le message "Erreur 1004 : Erreur définie par l’application ou par l’objet ". Peut-on résoudre cette difficulté ?
    Si ce n’est pas le cas, je me contenterai de la macro de l’enregistreur... améliorée par Jean-Philippe.
    Avec mes excuses pour cette nouvelle demande.
    Bonne fin de journée et encore merci.

  6. #6
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Bonjour,

    Au cas où tu ne l'aurais pas remarqué, nous sommes plusieurs à te répondre.

    Quant à ta dernière question, je suppose que tu es parti de mon code (avec le With) et que tu n'as pas mis de point devant les 2 Range dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each Cel In Range("G2", Range("G" & Rows.Count).End(xlUp))
    Ce qui donne que VBA ne sait pas à quelle feuille ces Range correspondent.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  7. #7
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2013
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 73
    Points : 21
    Points
    21
    Par défaut
    Bonjour Alain Tech,
    Je te prie d'excuser ma confusion d'identités. Et merci à toi pour les aides apportées.
    Je reviens sur ton dernier message.
    Dans le bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Workbooks("Fichier Test.xls").Sheets("Feuil1").Activate
      Dim Cel As Range
        For Each Cel In Range("G2", Range("G" & Rows.Count).End(xlUp))
     If Cel.Offset(, -3).Value <> "" And Cel.Value <> "" And Cel.Offset(, -6).Value("M Mme") Then Cel = Cel.Value + 10
        Next Cel
    où faudrait-il mettre les points qui manquent devant les Range ?
    J'ai déjà dit que je n'étais pas très futé !

  8. #8
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Bonjour,

    L'ensemble de la routine devrait ressembler à ça:
    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
    Sub Macro1AjouterSomme()
    '
    ' Macro1AjouterSomme Macro
    ' Macro enregistrée le 07/10/2016 par Ulysse
    '
    ' Touche de raccourci du clavier: Ctrl+Maj+P
      Dim Cel As Range
      Dim wbk As Workbook
      Dim wks As Worksheet
     
      'Avant d'utiliser la macro issue de l'enregistreur on assigne le Fichier Test à la variable wbk:
      Set wbk = Workbooks("Fichier test.xls")
      ' On assigne la feuille "NomDeLaFeuille" (à adapter) à la variable wks
      Set wks = wbk.Sheets("Feuil1")
     
      ' Vu qu'on va travailler sur la feuiile "Feuil1", on crée un bloc With / End With
      With wks
        For Each Cel In .Range("G2", .Range("G" & .Rows.Count).End(xlUp))
          If Cel.Offset(, -3).Value <> "" And Cel.Value <> "" And Cel.Offset(, -6).Value("M Mme") Then Cel = Cel.Value + 10
        Next Cel
      End With
    End Sub
    Le point seul remplace l'objet défini dans le With (ici wks) suivi d'un point.

    Mais ton problème n'est pas là.
    A ton avis, que signifie cette partie de ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    And Cel.Offset(, -6).Value("M Mme")
    Compare cette partie avec les tests que tu fais sur le contenu des autres cellules.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  9. #9
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2013
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 73
    Points : 21
    Points
    21
    Par défaut
    Bonjour,
    Merci à nouveau pour cette dernière proposition.
    Je vais la tester sans tarder ... et tenter la comparaison que tu me suggères.
    Mais, je le crains, "ils ont des yeux et ne voient pas" ...
    Bonne journée.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2013
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 73
    Points : 21
    Points
    21
    Par défaut
    Re Bonjour,
    Je viens de tester la routine. J'ai un message :"Erreur 1004 : Incompatibilité de type"
    Et la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Cel.Offset(, -3).Value <> "" And Cel.Value <> "" And Cel.Offset(, -6).Value("M Mme") Then Cel = Cel.Value + 5
    s'affiche en jaune. J'en suis là.

  11. #11
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Citation Envoyé par AlainTech Voir le message
    A ton avis, que signifie cette partie de ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    And Cel.Offset(, -6).Value("M Mme")
    Compare cette partie avec les tests que tu fais sur le contenu des autres cellules.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  12. #12
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2013
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 73
    Points : 21
    Points
    21
    Par défaut
    Bonsoir,
    Il m'a fallu du temps pour me rendre à l'évidence : l'affichage de la valeur doit être précédé d'un signe de comparaison. Ici = ( <> pour les autres valeurs du code).
    Merci pour m'avoir mis sur la voie. Le code devient :

    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
    Sub Macro1AjouterSomme()
     
       Dim Cel As Range
      Dim wbk As Workbook
      Dim wks As Worksheet
     
      'Avant d'utiliser la macro issue de l'enregistreur on assigne le Fichier Test à la variable wbk:
      Set wbk = Workbooks("Fichier test.xls")
      ' On assigne la feuille "NomDeLaFeuille" (à adapter) à la variable wks
      Set wks = wbk.Sheets("Feuil1")
     
      ' Vu qu'on va travailler sur la feuiile "Feuil1", on crée un bloc With / End With
      ' On ajoute 5€ aux dons de tous les cotisants :
        With wks
        For Each Cel In .Range("G2", .Range("G" & .Rows.Count).End(xlUp))
          If Cel.Offset(, -3).Value <> "" And Cel.Value <> "" Then Cel = Cel.Value + 5
            'And IF Cel.Offset(, -6).Value("M Mme")
        Next Cel
      End With
     
      'On ajoute 5€ supplémentaires aux dons des couples (doubles cotisants) :
      With wks
        For Each Cel In .Range("G2", .Range("G" & .Rows.Count).End(xlUp))
          If Cel.Offset(, -3).Value <> "" And Cel.Value <> "" And Cel.Offset(, -6).Value = ("M Mme") Then Cel = Cel.Value + 5
        Next Cel
      End With
    End Sub
    Et il fonctionne !
    Merci encore pour ta disponibilité et ton expertise.
    Bien cordialement

  13. #13
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Bonjour,

    Pourquoi 2 boucles?
    Pourquoi 2 blocs With?
    Pourquoi tester 2 fois la même chose?
    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
    Sub Macro1AjouterSomme()
     
      Dim Cel As Range
      Dim wbk As Workbook
      Dim wks As Worksheet
     
      'Avant d'utiliser la macro issue de l'enregistreur on assigne le Fichier Test à la variable wbk:
      Set wbk = Workbooks("Fichier test.xls")
      ' On assigne la feuille "NomDeLaFeuille" (à adapter) à la variable wks
      Set wks = wbk.Sheets("Feuil1")
     
      ' Vu qu'on va travailler sur la feuiile "Feuil1", on crée un bloc With / End With
      With wks
        For Each Cel In .Range("G2", .Range("G" & .Rows.Count).End(xlUp))
          If Cel.Offset(, -3).Value <> "" And Cel.Value <> "" Then
            ' On ajoute 5€ aux dons de tous les cotisants :
            Cel.Value = Cel.Value + 5
            If Cel.Offset(, -6).Value = "M Mme" Then
              'On ajoute 5€ supplémentaires aux dons des couples (doubles cotisants) :
              Cel.Value = Cel.Value + 5
            End If
          End If
        Next Cel
     
      End With
    End Sub
    Si la solution te convient, n'oublie pas de cliquer sur
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  14. #14
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2013
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 73
    Points : 21
    Points
    21
    Par défaut
    Bonjour,
    Bien reçu le code amélioré. Je l'ai testé et re testé : rien ne va plus !
    Voici le problème : au lieu d'ajouter 5€ aux dons de la colonne G, il les efface et inscrit uniformément 5€ dans chacune des cellules répondant aux critères.
    Je n'ai fait subir aucune modification au code proposé (copier-coller). Je ne vois pas où est la faille.
    Bon weekend et bien cordialement.

  15. #15
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Bonjour,

    Juste par curiosité...
    Peux-tu me mettre à disposition un fichier exemple anonymisé en format xls ou xlsx (pas xlsm)?
    La seule chose que j'imagine, suite au résultat que tu obtiens, c'est que la colonne G ne contient pas des nombres mais du texte.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  16. #16
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    Bonjour
    déjà dans ta routine que tu a trouvé il y a 3 erreurs une d' écriture et 2 erreur d'interprétation par rapport a ta demande initiale

    ton test c'est
    test1 =si la colonne G n'est pas vide

    test 2 =et si la colonne E n'est pas vide


    test 3 =et si la colonne E n'est pas vide plus (si la colonne A est double )

    on attend donc un numérique dans G quelque chose dans D et un décimal dans A

    l'erreur 1 en vert dans ta ligne de code
    If Cel.Offset(, -3).Value <> "" And Cel.Value <> "" And Cel.Offset(, -6).Value=("M Mme") Then Cel = Cel.Value + 10
    maintenant l'erreur2 d'interprétation de principe

    dans cette ligne tu teste les deux condition en même temps donc le test 3 tu zape le test 2

    ensuite erreur 3
    ta demande initiale était pour le dernier test si la cellule est "double" donc décimale

    et toi tu teste si il y dedans "M Mme" donc un string (variable texte)

    on est donc en dehors de ton contexte initial

    a moins que tu te soie mal exprimé !!!!

    donc si tes cellules g doivent être numériques et tes cellules D doivent pas être vides (numérique ou pas )pour un +10

    et tes cellules A doivent être double(décimal) plus la condition de pour D alors il faut selon ta demande initiale séparer les test en les imbriquant

    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 test()
      Workbooks("Fichier Test.xls").Sheets("Feuil1").Activate
        Dim Cel As Range
        For Each Cel In Range("G2", Range("G" & Rows.Count).End(xlUp))
            If Cel.Value <> "" And IsNumeric(Cel.Value) Then' teste G numeric et non vide 
                If Cel.Offset(, -3).Value <> "" Then 'test colonne "D" non vide 
                    Cel.Value 10   'ajout de +10 pour la première condition 
                     'et enfin test de la colonne A et D  car la condition A est imbriquée dans la condition   pour "D"               
                    If Cel.Offset(, -6).Value <> "" And Int(Cel.Offset(, -6)) = Cel.Offset(, -6) Then Cel = Cel.Value + 10
     
                End If
            End If
        Next Cel
    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

  17. #17
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2013
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 73
    Points : 21
    Points
    21
    Par défaut
    Bonjour à tous
    Je me suis sans doute mal exprimé. J’ai voulu donner à ma demande initiale une allure générale et je me suis mélangé les pinceaux.
    Le problème qui m’est posé est le suivant : le trésorier d’une association (entre 500 et 600 adhérents) veut éditer les reçus fiscaux pour les donateurs. Le fichier Excel des adhérents note les dons dans colonne G et le n° d’adhésion dans la colonne D. Le montant de la cotisation est de 5 € (10 € pour les couples). Pour les reçus fiscaux le montant de la cotisation est à ajouter au montant du don. Les reçus n’étant délivrés que pour un montant d’au moins 10 €, il n’est pad délivré de reçus pour les cotisants NON donateurs, sauf pour les couples (Doubles cotisants : d’où le Double de la colonne A, en réalité "M Mme").
    Mes derniers essais du code communiqué par Alain Tech.. bloquent sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cel.Value = Cel.Value + 5
    Erreur 13 : Incompatibilité de type
    Je joins un fichier test anonymisé et simplifié.
    Je ne sais pas si j’ai été suffisamment clair.
    Et toutes mes excuses pour le temps que je vous ai fait perdre.
    Bien cordialement.
    PS : Je ne sais si j'ai réussi à joindre la fichier

  18. #18
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Cette erreur confirme ce que je pensais. Ta cellule ne contient pas un nombre mais du texte.
    Ton fichier n'est pas joint.
    Est-il bien sauvé en xls ou xlsx (pas xlsm)?
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  19. #19
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2013
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 73
    Points : 21
    Points
    21
    Par défaut
    Bonjour,
    J’utilise Excel 2003 et je sauvegarde mes classeurs avec l’extension .xls .
    Autres précisions : la colonne A (CIVILITE) est au format Texte, la colonne D (COT) est au format Nombre, la colonne G (DON) est au format Monétaire. J’ai essayé de la passer au format Nombre. Même résultat : Incompatibilité de type.
    Je crois avoir réussi à joindre le fichier !

    Fichier Test.xls

    Merci de l'attention portée à mes petits problèmes malgré mes maladresses.
    Bien cordialement.

  20. #20
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Bonjour,

    Plusieurs problèmes dans ton fichier.
    Pour les personnes n'ayant pas fait de don, la cellule contient un espace. Ce qui est donc bien du texte et pas une valeur numérique.
    Pour, au moins, un couple, il y a un espace après "M Mme".

    De plus, il y a un problème dans ta logique.
    Pourquoi testes-tu si la cellule de la colonne G est non-vide?
    Si la personne n'a pas fait de don mais a payé la cotisation, sa cotisation doit être prise en compte.

    Voici le code corrigé en tenant compte de ce qui précède.
    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
    Option Explicit
     
    Sub Macro1AjouterSomme()
     
      Dim Cel As Range
      Dim wks As Worksheet
     
      ' On assigne la feuille "NomDeLaFeuille" (à adapter) à la variable wks
      Set wks = ThisWorkbook.Sheets("Feuil1")
     
      ' Vu qu'on va travailler sur la feuiile "Feuil1", on crée un bloc With / End With
      With wks
        For Each Cel In .Range("G2", .Range("G" & .Rows.Count).End(xlUp))
          If Cel.Offset(, -3).Value <> "" Then
            ' On ajoute 5€ aux dons de tous les cotisants :
            Cel.Value = Val(Cel.Value) + 5
            If Trim(Cel.Offset(, -6).Value) = "M Mme" Then
              'On ajoute 5€ supplémentaires aux dons des couples (doubles cotisants) :
              Cel.Value = Val(Cel.Value) + 5
            End If
          End If
        Next Cel
     
      End With
    End Sub
    Je suis aussi parti de l'idée que le code est dans le classeur contenant les données. Dis-moi si ce n'est pas le cas.

    Je te joins le fichier avec les données brutes et le code dans Module1.
    J'y ai ajouté une colonne "Contrôle" pour vérifier si la colonne G contient bien la valeur attendue.

    homere.xls

    En plus de ce qui précède, j'entrevois un autre problème.
    Si tu fais tourner plusieurs fois la macro, tes dons vont chaque fois s'incrémenter.
    J'aurais plutôt additionné les 5 ou 10 à la valeur de la colonne K pour les écrire dans la colonne G.
    Tu sauras faire?
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Toutes versions] Comment lister en VBA les références aux cellules présentes dans une formule.
    Par Philippe Tulliez dans le forum Excel
    Réponses: 6
    Dernier message: 04/09/2017, 05h13
  2. Ajouter une somme fixe aux cellules d’une colonne
    Par homère dans le forum Excel
    Réponses: 3
    Dernier message: 07/10/2016, 09h02
  3. Réponses: 1
    Dernier message: 25/01/2012, 12h11
  4. Réponses: 1
    Dernier message: 02/09/2010, 16h05

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