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 :

Comment simplifier ma macro [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre actif
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2018
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2018
    Messages : 254
    Points : 217
    Points
    217
    Par défaut Comment simplifier ma macro
    Bonjour à tous,

    A partir de l'enregistreur de macro, de codes à la réponse à mes post précédents (merci à Chris78, Menhir, Halaster08) et de codes trouvés sur le forum, je vous propose la macro "Génération_Ecriture". Elle fonctionne bien mais elle est vraiment le fruit d'un débutant.

    Si quelqu'un pouvait y jeter un oeil et, pour que je progresse dans le VBA, m'apporte ses commentaires, corrections, simplifications, ...

    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
     
    Sub Génération_Ecriture()
    '
    ' génére l'écriture et la colle dans le journal VT
    ' 19/04 Fonctionne
     
        Sheets("Matrice Facture").Select
     
        ' En X2 on a le pays de facturation
        ' Si X2 = FRANCE METROPOLITAINE alors Range("M57:S60").Copy
        ' Sinon Range("M64:S66").Copy
     
        If Range("X2") = "FRANCE METROPOLITAINE" Then
        ' Pour import journal Ventes en France
        Range("M57:S60").Copy 'copie l'écriture avec TVA
        End If
     
        If Range("X2") <> "FRANCE METROPOLITAINE" Then
        ' Pour import journal Ventes hors France sans TVA
        Range("M64:S66").Copy 'copie l'écriture sans TVA
        End If
     
        Sheets("Journal VT").Select
        Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).PasteSpecial (xlPasteValues) 'collage spécial
     
        ' Pour mettre Bordures de l'écriture importée qui sont "perdues" pendant le copier / collage spécial
        Selection.Borders(xlDiagonalDown).LineStyle = xlNone
        Selection.Borders(xlDiagonalUp).LineStyle = xlNone
        With Selection.Borders(xlEdgeLeft)
            .LineStyle = xlContinuous
            '.ColorIndex = 0
            '.TintAndShade = 0
            .Weight = xlThin
        End With
        With Selection.Borders(xlEdgeTop)
            'LineStyle = xlContinuous
            '.ColorIndex = 0
            '.TintAndShade = 0
            .Weight = xlThin
        End With
        With Selection.Borders(xlEdgeBottom)
            .LineStyle = xlContinuous
            '.ColorIndex = 0
            '.TintAndShade = 0
            .Weight = xlThin
        End With
        With Selection.Borders(xlEdgeRight)
            .LineStyle = xlContinuous
            '.ColorIndex = 0
            '.TintAndShade = 0
            .Weight = xlThin
        End With
        With Selection.Borders(xlInsideVertical)
            .LineStyle = xlContinuous
            '.ColorIndex = 0
            '.TintAndShade = 0
            .Weight = xlThin
        End With
        With Selection.Borders(xlInsideHorizontal)
            .LineStyle = xlContinuous
            '.ColorIndex = 0
            '.TintAndShade = 0
            .Weight = xlThin
        End With
     
        'trouve la dernière ligne dans G
        Cells(Rows.Count, "G").End(xlUp).Select
     
        'Supprimer la dernière ligne collée si elle contient 0 colonne G (si O = frais de port à 0 donc dernière ligne pas nécessaire
        If Cells(Rows.Count, "G").End(xlUp).Value = 0 Then
        Selection.Delete Shift:=xlUp                'supprime la valeur de la cellule sélectionnée
        Cells(Rows.Count, "F").End(xlUp).Select
        Selection.Rows.Delete Shift:=xlUp
        Cells(Rows.Count, "E").End(xlUp).Select
        Selection.Rows.Delete Shift:=xlUp
        Cells(Rows.Count, "D").End(xlUp).Select
        Selection.Rows.Delete Shift:=xlUp
        Cells(Rows.Count, "C").End(xlUp).Select
        Selection.Rows.Delete Shift:=xlUp
        Cells(Rows.Count, "B").End(xlUp).Select
        Selection.Rows.Delete Shift:=xlUp
        Cells(Rows.Count, "A").End(xlUp).Select
        Selection.Rows.Delete Shift:=xlUp
        End If
     
        ' Pour déselectionner l'écriture
        Sheets("Matrice Facture").Select
        Range("S60").Select
        Application.CutCopyMode = False
     
        Sheets("Accueil").Select ' Retour_Accueil
        Range("L11").Select
    End Sub
    Merci à vous

    Philippe

  2. #2
    Membre expérimenté Avatar de Transitoire
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2017
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 724
    Points : 1 454
    Points
    1 454
    Par défaut
    Bonsoir, Je ne suis pas sur que ça va marcher, mais le premier Collage spécial colle la valeur et le deuxième le Format.
    Si ça fonctionne, ça permettrais d'enlever tout le reste du formatage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).PasteSpecial (xlPasteValues) 'collage spécial Valeurs
    Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlFormats 'collage spécial Format
    Cordialement
    On a deux vies, la deuxième commence quand on se rend compte qu'on n'en a qu'une.
    Confucius

  3. #3
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour
    Pourquoi ne pas utiliser la méthode Range.copy (qui copie tout, format de cellules compris) et ne corriger au besoin que ce qui ne conviendrait pas (couleur de fond et de police) ?
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  4. #4
    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
    re
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub Génération_Ecriture()
        Dim sh1 As Worksheet, sh2 As Worksheet, plage As Range
        Set sh1 = Sheets("Matrice Facture")
        Set sh2 = Sheets("Journal VT")
        Set plage = IIf(Range("X2") = "FRANCE METROPOLITAINE", Range("M57:S60"), Range("M64:S66"))
        plage.Copy Destination:=sh2.Cells(Rows.Count, "A").End(xlUp).Offset(1, 0)
    '....le formatage est envoyé avec 
    '....
    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

  5. #5
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Set plage = IIf(Range("X2") = "FRANCE METROPOLITAINE", Range("M57:S60"), Range("M64:S66"))
        plage.Copy Destination:=sh2.Cells(Rows.Count, "A").End(xlUp).Offset(1, 0)
    Voir même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        IIf(Range("X2") = "FRANCE METROPOLITAINE", Range("M57:S60"), Range("M64:S66")).Copy Destination:=sh2.Cells(Rows.Count, "A").End(xlUp).Offset(1, 0)
    Ca évite une variable.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  6. #6
    Membre actif
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2018
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2018
    Messages : 254
    Points : 217
    Points
    217
    Par défaut
    Bonjour,

    Merci pour vos interventions.

    Transitoire
    Bonsoir, Je ne suis pas sur que ça va marcher, mais le premier Collage spécial colle la valeur et le deuxième le Format.
    Si ça fonctionne, ça permettrais d'enlever tout le reste du formatage.

    1 Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).PasteSpecial (xlPasteValues) 'collage spécial Valeurs
    2 Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlFormats 'collage spécial Format
    Cette solution colle le format en dessous du collage spécial valeurs.
    J'ai réussi en jouant sur le Offset en mettant -3 pour faire remonter la selection, cela fonctionne pour les lgnes au dessus mais pas pour la dernière ligne qui n'a donc pas le format.


    patricktoulon
    Sub Génération_Ecriture()
    Dim sh1 As Worksheet, sh2 As Worksheet, plage As Range
    Set sh1 = Sheets("Matrice Facture")
    Set sh2 = Sheets("Journal VT")
    Set plage = IIf(Range("X2") = "FRANCE METROPOLITAINE", Range("M57:S60"), Range("M64:S66"))
    plage.Copy Destination:=sh2.Cells(Rows.Count, "A").End(xlUp).Offset(1, 0)
    '....le formatage est envoyé avec
    '....
    End Sub
    Je ne comprends pas comment on sait que Range("X2") .... se trouve dans Sheets("Matrice Facture").
    Dans Set plage cela n'y fait pas référence.

    La solution fonctionne mais comme un copier/coller classique donc les formules sont collées. J'ai besoin de copier les valeurs (et non les formules)


    Menhir, ta solution fonctionne mais même remarques que ci dessus.

    Merci encore pour votre aide

    Philippe

  7. #7
    Membre expérimenté Avatar de Transitoire
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2017
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 724
    Points : 1 454
    Points
    1 454
    Par défaut
    Bonjour,
    Je vois l'erreur, essayé cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).select
    With selection
          .PasteSpecial (xlPasteValues) 'collage spécial Valeurs
          .PasteSpecial Paste:=xlFormats 'collage spécial Format 
    EndWith
    Cordialement
    On a deux vies, la deuxième commence quand on se rend compte qu'on n'en a qu'une.
    Confucius

  8. #8
    Membre actif
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2018
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2018
    Messages : 254
    Points : 217
    Points
    217
    Par défaut
    Re,

    Merci transitoire, cela fonctionne bien (juste un espace entre End et With).

    Sans abuser, aurais tu une astuce pour simplifier les lignes 71 à 85 du code de mon premier message.

    Philippe

  9. #9
    Membre expérimenté Avatar de Transitoire
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2017
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 724
    Points : 1 454
    Points
    1 454
    Par défaut
    Re, exact pour l'espace, dans les modules, il se met tout seul
    Si toute la ligne est libre J'essayerais ça. Possible d'adapter?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Cells(Rows.Count, "G").End(xlUp).Select
                            'Supprimer la dernière ligne collée si elle contient 0 colonne G (si O = frais de port à 0 donc dernière ligne pas nécessaire
    If Cells(Rows.Count, "G").End(xlUp).Value = 0 Then
           Cells(Rows.Count, "G").End(xlUp).EntireRow.Delete
    else
    End if
    sinon si la ligne n'est pas vide après G , il faut sélectionner la zone (Ax : Gx) et Delete
    Cordialement
    On a deux vies, la deuxième commence quand on se rend compte qu'on n'en a qu'une.
    Confucius

  10. #10
    Membre actif
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2018
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2018
    Messages : 254
    Points : 217
    Points
    217
    Par défaut
    Bonjour Transitoire,

    Cela fonctionne très bien.

    Merci beaucoup

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/08/2014, 11h34
  2. [vbexcel]Comment stopper une macro sans la planter.
    Par Mugette dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 30/11/2005, 14h45
  3. Comment utiliser la macro TRACE()?
    Par Crisanar dans le forum MFC
    Réponses: 6
    Dernier message: 16/09/2005, 10h48
  4. Réponses: 7
    Dernier message: 19/07/2005, 08h31

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