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 :

Aide pour simplifier code macros


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 20
    Points : 13
    Points
    13
    Par défaut Aide pour simplifier code macros
    Bonjour,

    tout d'abord merci à vous tous pour le forum et les nombreux messages car étant débutant en macro excel, ça m'a beaucoup aidé.

    je vous joints un fichier et m'a question est :

    Pouvez vous me dire comment simplifier mes codes ?

    Ceci dans un but purement d'apprentissage ;-) Mes macros fonctionnent mais je pense qu'il y a plus simple (J'ai fait de la bidouille et c pas parfait).

    Pour expliquer mon fichier excel.

    Ce fichier est une aide à la comptabilité d'un magasin. La première feuille permet d'enregistrer l'argent encaissé pour un jour donné.

    Le premier bouton "valider données", permet de renvoyer le total (E4:G4) dans la feuille et cellule correspondante à la date.
    Le deuxieme bouton "déplacer données", permet de renvoyer les données enregistrées ligne 14 à 113 dans l'onglet "données" (ceci afin de faire une sauvegarde car une fois le transfert ok = delete).
    Le troisieme bouton permet d'envoyer à la compta par mail le mois que l'on souhaite.

    Il y a des incohérences que je n'arrive pas à rectifier.

    1) Le bouton "déplacer données" :
    Il fait bien le transfert mais j'aurais souhaité qu'il ne transfert que les lignes dans lesquelles il y a des données. Actuellement il fait un copier coller des 100 lignes.

    2) Le bouton "envoi mail" :
    il envoie le classeur alors que j'aurai bien aimé qu'il envoie que la feuille.

    Merci beaucoup pour votre aide

    Cdt

  2. #2
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonjour GateCrash, bonjour le forum,

    Peut-être comme ç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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    Option Explicit
     
     
    Private Sub CommandButton1_Click() 'bouton Valider les données
    Dim D As String 'déclare la date D
    Dim J As Byte 'déclare la jour J
    Dim M As Byte 'déclare le mois M
    Dim O As Object 'déclare l'onglet O
    Dim I As Byte 'déclare la variable I (Incrément)
    Dim T As Double 'déclare la variable T (Total)
     
    D = Range("C4") 'définit la date D
    J = Day(D) 'définit le jour J
    M = Month(D) 'définit le mois M
    Set O = Sheets(Format("1/" & M, "mmmm")) 'définit l'onglet O
     
    With Worksheets("calcul") 'prend en compte l'onglet "calcul"
        .Range(.Cells(4, 5), .Cells(4, 7)).Copy 'copie la plage E4:G4
    End With 'fin de la prose en compte de l'onglet "calcul"
    For I = 4 To 6 'bloucle sur les colonne 4 à 6 (=D à F)
        T = T + O.Cells(J + 4, I).Value 'définit la variable T (total des 3 cellules ligne J+4 à la fin de la boucle)
    Next I
    If T = 0 Then 'condition : si T=0
        O.Cells(J + 4, 4).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 'colle les valeurs copiés
    Else 'sinon
        MsgBox ("il y a déjà des données enregistrées pour ce jour") 'message
    End If 'fin de la condition
    End Sub
     
     
    Sub CommandButton2_Click() 'bouton "Déplacer les données"
    Dim C As Object 'déclare la variable C (onglet [c]alcul)
    Dim LI As Integer 'déclare la variable LI ([LI]gne)
    Dim D As Object 'déclare la variable D (onglet [d]onnées)
     
    Set C = Sheets("calcul") 'définit l'onglet C
    Set D = Sheets("données") 'définit l'onglet D
    LI = D.Cells(Application.Rows.Count, 1).End(xlUp).Row + 1 'définit la première ligne vide LI de la colonne 1 (=A) de l'onglet D
    C.Rows("14:113").Copy 'copie les lignes 14 à 113 de l'onglet C
    'colle les valeurs de la plage copiée dans la cellule ligne LI, colonne 1 (=A) de l'onglet D
    D.Cells(LI, 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=True, Transpose:=False
    C.Range("D14:F113").ClearContents 'efface le contenu de la plage D14:F113
    C.Select 'sélectionne l'onglet C
    C.Range("D14").Select 'sélectionnen la cellule D14
    End Sub
    Attention ! j'ai renommé les onglets des mois avec les accents pour qu'ils soient pris en compte par le code (février, août et décembre...
    Le fichier :

  3. #3
    Membre à l'essai
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 20
    Points : 13
    Points
    13
    Par défaut Aide pour simplifier code macros
    Bonjour Thautheme ,

    merci beaucoup pour ton retour.
    Je trouve vraiment bien de mettre des commentaires en fin de phrase car on comprend mieux ce que l'on veut faire avec le code.
    Je vais mettre ça dans mes bonnes pratiques :-)

    - Super pour le bouton "valider les données" , ça évite de faire :

    If mois = "01" Then Worksheets("janvier").Activate
    etc...

    je vais regarder ça de plus près car j'ai pas tout compris mais je vais m'y plonger et reviens vers toi si pb.

    - Par contre pour le bouton "Déplacer les données"
    j'ai toujours le pb quand tu valides le bouton 2 fois de suite.
    Le code copie et colle les 100 lignes mêmes si il n'y a pas de données dans toutes les lignes.

    En tout cas merci beaucoup.
    Cdt

  4. #4
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonjour GateCrash, bonjour le forum,

    Le code du bouton Déplacer les données modifié :

    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
    Sub CommandButton2_Click() 'bouton "Déplacer les données"
    Dim C As Object 'déclare la variable C (onglet [c]alcul)
    Dim LI As Integer 'déclare la variable LI ([LI]gne)
    Dim D As Object 'déclare la variable D (onglet [d]onnées)
    Dim PL As Range 'déclare la variable PL ([PL]age)
    Dim LIS As Integer 'déclare la variable LIS ([LI]gne[S])
    Dim COL As Byte 'décalre la variable COL ([COL]onne)
     
    Set C = Sheets("calcul") 'définit l'onglet C
    Set D = Sheets("données") 'définit l'onglet D
    LI = D.Cells(Application.Rows.Count, 1).End(xlUp).Row + 1 'définit la première ligne vide LI de la colonne 1 (=A) de l'onglet D
    Set PL = C.Range("C13") 'définit (initialise) la plage PL
    For LIS = 14 To 113 'boucle 1 : sur les lignes 14 à 113
        For COL = 4 To 6 'boucle 2 : sur les colonnes 4 à 6
            If C.Cells(LIS, COL).Value <> "" Then 'condition : si la cellulle en ligne LIS, colonne COL n'est pas vide
                GoTo suite: 'va à l'étiquette "suite"
            End If 'fin de la condition
        Next COL 'prochaine colonne de la boucle 2
        GoTo fin 'va à l'étiquette fin (à ce stade la ligne ne contient aucune donnée, d'après ce que j'ai compris, les autres lignes non plus)
    suite: 'étiquette
        'définit la plage PL (si la plage PL ne contient qu'une seule cellule (voir initialisation), PL devient la ligne LIS
        'sinon PL devient l'union de PL et de la ligne LIS. Au final PL ne contiendra que les lignes éditées
        Set PL = IIf(PL.Cells.Count = 1, Rows(LIS), Application.Union(PL, Rows(LIS)))
    Next LIS 'prochaine ligne de la boucle 1
    fin: 'étiquette
    PL.Copy 'copie les lignes 14 à 113 de l'onglet C
    'colle les valeurs de la plage copiée dans la cellule ligne LI, colonne 1 (=A) de l'onglet D
    D.Cells(LI, 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=True, Transpose:=False
    C.Range("D14:F113").ClearContents 'efface le contenu de la plage D14:F113
    C.Select 'sélectionne l'onglet C
    C.Range("D14").Select 'sélectionnen la cellule D14
    End Sub

  5. #5
    Membre à l'essai
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 20
    Points : 13
    Points
    13
    Par défaut Aide pour simplifier code macros
    Bonjour Thautheme,

    merci beaucoup pour tes réponses, mais j'aurai besoin que tu m'aiguilles sur le bouton 1 "valider données"

    J'ai vraiment du mal à comprendre :

    T = T + O.Cells(J + 4, I).Value

    je comprends le résultat = déterminer si valeur 0 ou pas .

    En fait je ne comprends pas à quel moment tu détermines la bonne feuille à utiliser pour le test si = 0
    et surtout pourquoi T = T+

    Merci d'avance
    Cdt

  6. #6
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonjour GateCrash, bonjour le forum,

    Dans ton code initial tu vérifiais si la cellule de la colonne 4 (=D) était vide pour soit Coller soit envoyer une message.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    If ActiveCell.Value = 0 Then
         Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
    Else
         MsgBox ("il y a déjà des données enregistrées pour ce jour")
    End If
    Les données doivent être copiées dans la ligne du jour J. Le premier jour commence toujours à la ligne 5. Donc la ligne du jour = J+4. Mais cette ligne pourrait très bien n'avoir que des chèques ou que des cartes bleues. Bref, ne pas être vide en ayant, malgré tout, la cellule de la colonne D vide. Il fallait donc vérifier les 3 colonnes D,E et F pour être sûr que la ligne soit vide. J'aurais pu écrire (si j'avais été moins stupide) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If O.Cells(J + 4, 4) = 0 And O.Cells(J + 4, 5).Value = 0 And OCells(J + 4, 6).Value = 0 Then
       '...copy
    Else
       'message
    End If
    J'ai préféré faire une boucle sur les 3 colonnes et la variable T (des fois je me demande pourquoi je fais compliqué ?)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For I = 4 To 6 'bloucle sur les colonne 4 à 6 (=D à F)
        T = T + O.Cells(J + 4, I).Value 'définit la variable T (total des 3 cellules ligne J+4 à la fin de la boucle)
    Next I
    Au départ T = 0. À chaque passage T = T + la valeur de la cellule O.Cells(J + 4, I).Value. Donc, si la cellule contient une valeur positive, T ne sera plus nul. À la fin de la boucle, si T est nul cela signifie que la ligne contient au moins une valeur non nulle donc, Message, sinon, cela signifie que la ligne est vierge, donc Copie/Colle...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If T = 0 Then 'condition : si T=0
        O.Cells(J + 4, 4).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 'colle les valeurs copiés
    Else 'sinon
        MsgBox ("il y a déjà des données enregistrées pour ce jour") 'message
    End If 'fin de la condition

    J'espère que c'est plus clair
    ... En tout cas plus clair que moi qui suis allé chercher midi à 14 heures...

  7. #7
    Membre à l'essai
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 20
    Points : 13
    Points
    13
    Par défaut Aide pour simplifier code macros
    Merci beaucoup Thautheme, tes explications sont super.


    Je vais juste t’embêter une dernière fois sur l'onglet 0.

    tu déclares
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    D = Range("C4") 'définit la date D
    J = Day(D) 'définit le jour J
    M = Month(D) 'définit le mois M
    Set O = Sheets(Format("1/" & M, "mmmm")) 'définit l'onglet O
    puis tu dis :
    If O.Cells(J + 4, 4) = 0 And O.Cells(J + 4, 5).Value = 0 And O.Cells(J + 4, 6).Value = 0 Then

    Ma question :
    comment la macro peut reconnaître le bonne onglet à ouvrir par rapport à la date D (janvier, février etc..) ?
    ou se situe le test ? car on ne dit pas si D ou J = Janvier , ouvrir l'onglet janvier .

    Est ce que tu vois ce que je veux dire ?


    Cdt

  8. #8
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonjour GateCrash, bonjour le forum,

    Le code : Format("1/" & M, "mmmm") va renvoyer [janvier] si M = 1, [février] si M = 2, etc. Donc Set O = Sheets(Format("1/" & M, "mmmm")) va définit l'onglet O par rapport au mois M... C'est pour cela que j'ai renommé tes onglets avec les accents (février, août et décembre) sinon ce code ne les aurait pas reconnus...

  9. #9
    Membre à l'essai
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 20
    Points : 13
    Points
    13
    Par défaut Aide pour simplifier code macros
    super.
    merci beaucoup .

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

Discussions similaires

  1. Aide pour simplifier un code et comprendre le mécanisme
    Par nicdodo dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 02/04/2015, 15h50
  2. Aide pour simplifier un code VBA Excel
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 24/01/2008, 16h15
  3. aide pour un code
    Par foulla002 dans le forum Sécurité
    Réponses: 3
    Dernier message: 03/08/2006, 09h56
  4. aide pour un code
    Par foulla002 dans le forum Langage
    Réponses: 7
    Dernier message: 18/07/2006, 11h04
  5. aide pour du code svp
    Par rootsngaia dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 12/04/2006, 23h40

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