Correction de macro

Shinichi

XLDnaute Junior
Bonjour à tous!

J'arrive au bout (grace à votre aide), mais je voudrais voir avec vous comment corriger des macros qui ne marchent pas ou qui sont écrites de manières brouillonnes.

Pourriez vous m'expliquer comment les améliorer ou où sont mes erreurs

Marche mais est très moche (sur le forum vous déconseillez d'avoir recours à trop de "select")
Code:
Worksheets("tampon").Select
Range("B2").End(xlToRight).Select
col1 = ActiveCell.Column
Cells(500, col1).Select
ActiveCell.End(xlUp).Select
lig1 = ActiveCell.Row
Range(Cells(3, col1), Cells(lig1, col1 + Count - 1)).Select

Ne marche pas - plante au niveau du range(cells...):
Code:
   Application.CutCopyMode = False
    Charts.Add
    ActiveChart.ChartType = xlRows
    ActiveChart.SetSourceData Source:=Sheets("Feuil1").Range(Cells(3, col1), Cells(lig1, col1 + Count - 1)).Select
    ActiveChart.Location Where:=xlLocationAsNewSheet, Name:="Leak"
    With ActiveChart
        .HasTitle = False
        .Axes(xlCategory, xlPrimary).HasTitle = False
        .Axes(xlValue, xlPrimary).HasTitle = False
    End With

Avec la meme série de données (Sheets("Feuil1").Range(Cells(3, col1), Cells(lig1, col1 + Count - 1))), je voudrais passer par une méthode qui me semble plus propre avec "seriescollection", mais je n'arrive pas à définir mes séries abs et ord...
Mes abscisses seraient alors [A3:A & lig1] et j'aurais une série de valeur pour chaque ligne (de la colonne col1 à la colonne col1 + Count - 1).

Par avance merci pour votre aide

A+

Bruno
 

Gorfael

XLDnaute Barbatruc
Re : Correction de macro

Salut Shinichi et le forum
Ton code, en plus court
Code:
col1 = Worksheets("tampon").Range("B2").End(xlToRight).Column
lig1 = Worksheets("tampon").Cells(500, col1).End(xlUp).Row
Range(Cells(3, col1), Cells(lig1, col1 + Count - 1)).Select
Pour ton autre macro, pas assez d'infos : "plante au niveau" => pas assez précis
Code:
Sheets("Feuil1").Range(Cells(3, col1), Cells(lig1, col1 + Count - 1)).Select
Juste une remarque : Ce que tu omets d'écrire, VBA le remplace par les valeurs par défaut, donc tu as écrit :
Code:
Sheets("Feuil1").Range(ActiveSheet.Cells(3, col1), ActiveSheet.Cells(lig1, col1 + Count - 1)).Select
Ce qu'excel a du mal à comprendre.
Tu y affectes un .select => source de problème, hormis si tu ne travailles que sur la feuille active.

Petite remarque : tu fournis un code erroné. Qu'est-ce qui te pousses à croire qu'on va pouvoir en retirer ce qu'elle devrait faire ?
À partir d'un algorithme sans code, on peut faire le code.
À partir d'un code correct, on a du mal à trouver l'algorithme : il dépend de ta méthode de raisonnement, de ta manière de solutionner un problème dont on ne connaît rien. Alors sur un code faux...
A+
 

Shinichi

XLDnaute Junior
Re : Correction de macro

Bonsoir Gorfael

Merci pour tes réponses.

La ou je pensais que vous pourriez peut etre m'aider était sur le pourquoi un Range(Cells(x,y):Cells(f,i)).select ne selectionne rien mais met une erreur alors que le simple Cells(x,y).select ou Cells(f,i)).select selectionne bien les cellule extreme de ma selection...

D'autre part saurais tu m'expliquer quelle est la typo pour définir les variables de mon chart (Xlvalues et Values si j'ai bien compris)

Merci pour ta correction

A+

Bruno
 

Gorfael

XLDnaute Barbatruc
Re : Correction de macro

Salut Shinichi et le forum
pourquoi un Range(Cells(x,y):Cells(f,i)).select ne selectionne rien mais met une erreur
:confused: Si en français tu n'emploies pas la bonne syntaxe, tu te retrouves avec une mauvaise note, et tu trouves ça anormal ?
Il y a une syntaxe à respecter dans Excel, et si tu ne la respectes pas, tu as la sanction => erreur.
Range(Cells(x,y), cells(f,i)) ne retournera pas d'erreur, puisque c'est la bonne syntaxe, de même que
Range(Cells(x,y).address & ":" & Cells(f,i).address)
On ne peut pas faire ce qu'on veut, il y a des obligations.
D'autre part saurais tu m'expliquer quelle est la typo pour définir les variables de mon chart (Xlvalues et Values si j'ai bien compris)
Non, je ne peux pas t'expliquer la typo (?) des variables de ton chart :
xlValues : je pense que c'est une variable définie par Excel (du fait du xl en début de nom)
Value : c'est une propriété
A+
 

enquetedusavoir

XLDnaute Nouveau
Re : Correction de macro

bonjour,

je voudrais aussi que qq'un me dise ce qu'il pense de ma macro, je l'ai composé en partie garce a ce site mais je sais que physiquement elle n'est pas très catholique, mais elle fonctionne correctement. mnt si qq'un a une idée pour l'améliorer ou la modifier pour qu'elle respecte + de règle je suis tout oui.

Sub impression_enregistrement_remiseazéro()
Sheets("récap").Select
ActiveSheet.Unprotect
Sheets("liste1").Select
ActiveSheet.Unprotect
Sheets("liste2").Select
ActiveSheet.Unprotect
Sheets("liste3").Select
ActiveSheet.Unprotect
If MsgBox("voulez-vous valider la commande (copie dans récap)?", vbYesNo) = vbYes Then
Dim s As Worksheet
Application.ScreenUpdating = False
For Each s In ThisWorkbook.Worksheets
If Not s.Name Like "récap" And Not s.Name Like "client" And Not s.Name Like "vins" Then
s.Range("A20:A71").SpecialCells(xlCellTypeConstants).EntireRow.Copy Sheets("récap").[A82].End(xlUp)(2)
End If
Next s
Application.ScreenUpdating = True
If MsgBox("voulez-vous imprimer la commande(2exemplaires)?", vbYesNo) = vbYes Then
Sheets("récap").Select
ActiveWindow.SelectedSheets.PrintOut Copies:=2, Collate:=True
End If
If MsgBox("voulez vous enregistrer la commande?", vbYesNo) = vbYes Then
Sheets("récap").Select
Sheets("récap").Copy
ActiveSheet.Unprotect
Dim str As String
Dim dir As String
dir = "C:\Users\françois\Desktop\PG VIN\commande\"
Range("I1").Select
str = dir & ActiveCell.Text & ".xls"
ActiveWorkbook.SaveAs Filename:= _
str, FileFormat:=xlNormal, _
Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
CreateBackup:=False
ActiveWorkbook.Close
End If
If MsgBox("voulez vous effacer et en faire une nouvelles la commande?", vbYesNo) = vbYes Then
Sheets("liste2").Select
Range("A21,a23,a25,a27,a29,a31,a33,a35,a37,a39,a41,a43,a45,a47,a49,a51,a53,a55,a57,a59,a61,a63,a65,a67,a69,A71").Select
Selection.ClearContents
Range("a21").Select
Sheets("liste3").Select
Range("A21,a23,a25,a27,a29,a31,a33,a35,a37,a39,a41,a43,a45,a47,a49,a51,a53,a55,a57,a59,a61,a63,a65,a67,a69,A71").Select
Selection.ClearContents
Range("a21").Select
Sheets("liste1").Select
Range("A21,a23,a25,a27,a29,a31,a33,a35,a37,a39,a41,a43,a45,a47,a49,a51,a53,a55,a57,a59,a61,a63,a65,a67,a69,A71,F12:h14").Select
Range("A71").Activate
Selection.ClearContents
Range("A21").Select
Range("a17").Value = Range("a17").Value + 1
Range("F5:H5").Select
Selection.ClearContents
Range("F5:H5").Select
Sheets("récap").Select
ActiveSheet.Unprotect
Rows("19:81").Select
Range("A75").Activate
Selection.ClearContents
Selection.RowHeight = 15
ActiveSheet.Protect
End If
End If
Sheets("liste1").Select
ActiveSheet.Protect
Sheets("liste2").Select
ActiveSheet.Protect
Sheets("liste3").Select
ActiveSheet.Protect
Sheets("liste1").Select
Range("f5").Select

End Sub

bien a vous
 

Softmama

XLDnaute Accro
Re : Correction de macro

Bonjour à vous, Bonjour aux autres,

<- Houlà mal à la la tête !

Par contre la macro, très bien, J'adore tous ces petits 'a' suivis de numéros et séparés par des virgules, ça donne un effet esthétique certain à l'ensemble. De même que tous ces .select qui permettent très certainement de prendre le temps pour mieux voir ce qui se passe et d'aller se chercher un café. Et puis c'est original de pas voir tous ces screenupdating ou autres xlcalculation qui finalement chargent inutilement le code. Enfin, je trouve tellement plus simple et bien pensé de ne travailler que sur un seul objet : l'objet 'Selection' qui permet de ne pas se mélanger les pédales entre workbooks, sheets ou autre ranges...

Donc, mais là je laisse libre cours à mon esprit de créatif sur-dimensionné, et pour juste un peu pinailler, il me semble que quelques couleurs ou une mise en forme plus avenante, avec des retraits, des caractères en gras, ou -soyons fous - des italiques soulignés, agrémenterait de façon plus avenante cette macro déja assez jolie à regarder au demeurant. Ou alors des emoticones ? :D;)

[NB- Il y a un message dans le message]
 

enquetedusavoir

XLDnaute Nouveau
Re : Correction de macro

bonjour,

je sais qu'elle est tres lourde et lente, et vraiment pas belle.:eek:

pour que ce soit un peut plus agréable pour vous et que vous puissiez m'aider a la rendre plus esthétique, vous voudriez des couleurs sur quoi, des retrais sur quoi? elles est si moche que je ne vois pas comment faire....
 

Gorfael

XLDnaute Barbatruc
Re : Correction de macro

Salut enquetedusavoir et le forum
et vraiment pas belle : on s'en fout. Le but d'un code est d'être efficace en remplissant sa fonction

pour que ce soit un peut plus agréable pour vous et que vous puissiez m'aider a la rendre plus esthétique Je crois que tu n'as pas compris le but des indentations (retraits) et des couleurs sur un code.

Rouge : tu as fais une erreur, VBA ne reconnaît pas l'instruction
Vert : C'est un commentaire il commence par REM ou une apostrophe : sert à indiquer ce que la l'instruction, pour s'y retrouver dans le code.

Indentations : sert à s'y retrouver dans les boucles, les tests, etc...

esthétique : ça veut dire quoi :confused: :p
Code:
Sub impression_enregistrement_remiseazéro()
'Déclarations ===================================================
Dim s As Worksheet
Dim str As String
Dim dir As String
Dim X As Long
'Mise à l'État Initial ==========================================
Application.ScreenUpdating = False
Sheets("récap").Unprotect
Sheets("liste1").Unprotect
Sheets("liste2").Unprotect
Sheets("liste3").Unprotect
'Traitements ====================================================
If MsgBox("voulez-vous valider la commande (copie dans récap)?", vbYesNo) = vbYes Then
    'Boucle Chargement feuille récap ----------------------------
    For Each s In ThisWorkbook.Worksheets
        If Not s.Name Like "récap" And Not s.Name Like "client" And Not s.Name Like "vins" Then _
            s.Range("A20:A71").SpecialCells(xlCellTypeConstant).EntireRow.Copy _
            Sheets("récap").[A82].End(xlUp)(2)
    Next s
    'Impression commande ----------------------------------------
    If MsgBox("voulez-vous imprimer la commande(2exemplaires)?", vbYesNo) = vbYes Then
        Sheets("récap").PrintOut Copies:=2, Collate:=True
    End If
    'Enregistrement commande ------------------------------------
    If MsgBox("voulez vous enregistrer la commande?", vbYesNo) = vbYes Then
        Sheets("récap").Copy
        dir = "C:\Users\françois\Desktop\PG VIN\commande\"
        str = dir & Sheets("récap").Range("I1") & ".xls"
        ActiveWorkbook.SaveAs Filename:=str, FileFormat:=xlNormal, _
            Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
            CreateBackup:=False
        ActiveWorkbook.Close
    End If
    'RAZ commande -----------------------------------------------
    If MsgBox("voulez vous effacer et en faire une nouvelles la commande?", vbYesNo) = vbYes Then
        For X = 21 To 71 Step 2
            Sheets("liste1").Range("A" & X).ClearContents
            Sheets("liste2").Range("A" & X).ClearContents
            Sheets("liste3").Range("A" & X).ClearContents
        Next X
        Sheets("liste1").Range("a17") = Sheets("liste1").Range("a17").Value + 1
        Sheets("liste1").Range("F5:H5").ClearContents
        With Sheets("récap").Range("A75")
            .ClearContents
            .RowHeight = 15
        End With
    End If
End If
'Remise en état =================================================
Sheets("liste1").Protect
Sheets("liste2").Protect
Sheets("liste3").Protect
Sheets("récap").Protect

Sheets("liste1").Activate
Range("F5").Activate

Application.ScreenUpdating = True
End Sub
Ton code rendu plus lisible (pour moi). Attention, je l'ai un peu modifié, mais pas testé.

Les déclarations : toujours les regrouper : les rechercher dans une infinité de lignes de code est absurde. Surtout que quelque soit l'endroit de leurs déclaration, VBA effectue un premier passage pour leur réserver l'espace mémoire nécessaire avant de commencer la première instruction.
De même, vu ton code, autant faire les dé-protections en début, et tout re-protéger en sortie : ça évite des oublis.

Select/Selection/Activate/Activecell : plus tu les évites, plus ton code devient rapide et lisible. En plus, ça ne fonctionne que sur la feuille active, du livre actif. Et sur les macro automatiques, ça déclenche des erreurs, alors que c'est rarement nécessaire.

Petite remarque : Tu imprimes la commande => OK. Mais pourquoi demander l'autorisation de sauvegarde dans ce cas ? Ce ne devrait pas être automatique ?

Pourquoi rendre un code lisible, déclarer des variables ?
Aucun but en soit, mais... au premier dépannage, bizarrement, tu comprends l'utilité de savoir que tu es dans telle boucle, tel test, avec telle variable.
A+
 

Softmama

XLDnaute Accro
Re : Correction de macro

Re,

Je salue le travail de Gorfael. J'allais m'y coller, mais ce qu'il a fait est juste semblable à ce que j'allais faire, à part :
Code:
        For X = 21 To 71 Step 2
            Sheets("liste1").Range("A" & X).ClearContents
            Sheets("liste2").Range("A" & X).ClearContents
            Sheets("liste3").Range("A" & X).ClearContents
        Next X

que j'aurais remplacé par :
VB:
            For X = 21 To 71 Step 2
            For Y = 1 to 3
                Sheets("liste"& Y).Range("A" & X).ClearContents
            Next Y
        Next X

et un petit application.screenupdating = False en début de macro qui peut pas faire de mal.
++
 
Dernière édition:

enquetedusavoir

XLDnaute Nouveau
Re : Correction de macro

bonjour, je fait encore appel a vous car j'ai encore un probleme avec une macro, je crois qu'elle est incomplète.

'des qu'une cellule est modifiée la macro s'active

Private Sub Worksheet_change(ByVal Target As Range)

'sélection de toutes les pages sauf "récap" "client" et "vins" et copie de toute les ligne ce trouvant entre (a20:a71) et dont [a] <>""

Dim s As Worksheet
Application.ScreenUpdating = False
For Each s In ThisWorkbook.Worksheets
If Not s.Name Like "récap" And Not s.Name Like "client" And Not s.Name Like "vins" Then
s.Range("A20:A71").SpecialCells(xlCellTypeConstants).EntireRow.Copy Sheets("récap").[A82].End(xlUp)(2)
End If
Next s
Application.ScreenUpdating = True

End Sub


voila le probleme, la macro fonctionne quand je l'applique a un bouton (et que je change le nom), mais la pas. j'ai choisis un mauvais nom de macro:confused:?

bien a vous

et merci d'avance
 

Gorfael

XLDnaute Barbatruc
Re : Correction de macro

Salut enquetedusavoir et le forum
Pense à utiliser les balises de code (icone #)
Pour un dépannage, on a toujours besoin de :
- ce qu'est supposé faire la macro
- le code en intégralité
- ce qui se passe réellement
Et n'oublie jamais que les évidences ne le sont que pour celui qui les croit évidentes : ce qui est évident quand on travaille avec un fichier et certaines connaissances ne l'est pas pour celui qui ne connaît pas le fichier et qui n'a pas les mêmes expériences.
voila le problème, la macro fonctionne quand je l'applique a un bouton (et que je change le nom), mais la pas. j'ai choisis un mauvais nom de macro ?
Pas sûr de tout comprendre.

Private Sub Worksheet_Change(ByVal Target As Range)
C'est le titre d'une macro à lancement automatique : le "change" au lieu de "Change" me fait supposé un titre manuel en remplacement de l'autre => le module n'est pas forcément le bon.
Comme tu dis que c'est tes premiers codes en VBA :

Clic-droit sur le nom d'un onglet => Menu contextuel>>Visualiser le code
Tu te retrouves sur un module particulier : celui lié à la feuille.
Comme c'est un module de classe, il a certaines macros de préprogrammées.
Case de gauche haut dessus de la feuille de code (Général), tu sélectionnes "Worksheet".
Dans le menu de la case de droite, tu as toutes les macros évènementielles de la feuille. Tu y trouveras Change, qui te crée une macro "Worksheet_Change" qui se déclenche lorsque tu sorts d'une cellule passée en mode édition.

Il ne suffit pas de donner un nom à une macro pour qu'elle réagisse à l'évènement que tu veux : il faut que VBA ait été paramétrer pour cela.
Dans le même ordre d'idée, tu as le module "ThisWorkBook" qui lancent les macros automatiques liées au classeur.

Pour ton code :
Tu dis qu'il fonctionne. N'ayant que la version 2003, VBA me détecte une erreur avec le s dans
Code:
s.Range("A20:A71").SpecialCells(xlCellTypeConstant  [COLOR=Red]s[/COLOR]).EntireRow.Copy
Donc, je ne peux vérifier son fonctionnement (et comme je n'ai ni les données, ne ce qu'il doit faire... :p), mais...
=> worksheet_Change => à chaque fois que tu double-cliques (ou F2 ou entres une données manuellement dans la feuille), tu lances ta macro, qui copie A20:A71 de toutes les feuilles (hormis celles exclues par ton test).
Et quelque soit la cellule concernée => Tu vas remplir ta feuille avec des doublons totalement inutiles.

=> si tu copies toutes les feuilles, ça veut dire que toutes les feuilles sont concernées => Module ThisWorkBook, macro
Code:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Avec un test discriminatoire sur Sh.Name (Nom de l'onglet qui subit une modification et un autre, vraisemblablement sur Target avec Intersect(target, [A20:A71] is nothing.

Mais ce ne sont que des suppositions, n'ayant pas assez de données.
A+
 
Dernière édition:

JCGL

XLDnaute Barbatruc
Re : Correction de macro

Bonjour à tous,

Ton code non testé, évidement... Mais avec les balises et une indentation qui font un code plus agréable à lire...

VB:
Option Explicit

Sub impression_enregistrement_remiseazéro()
    Sheets("récap").Unprotect
    Sheets("liste1").Unprotect
    Sheets("liste2").Unprotect
    Sheets("liste3").Unprotect

    If MsgBox("voulez-vous valider la commande (copie dans récap)?", vbYesNo) = vbYes Then
        Dim s As Worksheet
        With Application
            .ScreenUpdating = False
            .Calculation = xlCalculationManual
        End With
        For Each s In ThisWorkbook.Worksheets
            If Not s.Name Like "récap" And Not s.Name Like "client" And Not s.Name Like "vins" Then
                s.Range("A20:A71").SpecialCells(xlCellTypeConstants).EntireRow.Copy Sheets("récap").[A82].End(xlUp)(2)
            End If
        Next s

        If MsgBox("Voulez-vous imprimer la commande(2 exemplaires)?", vbYesNo) = vbYes Then
            Sheets("récap").Select
            ActiveWindow.SelectedSheets.PrintOut Copies:=2, Collate:=True
        End If
        If MsgBox("Voulez vous enregistrer la commande?", vbYesNo) = vbYes Then
            Sheets("récap").Select
            Sheets("récap").Copy
            ActiveSheet.Unprotect
            Dim str As String
            Dim dir As String
            dir = "C:\Users\françois\Desktop\PG VIN\commande\"
            Range("I1").Select
            str = dir & ActiveCell.Text & ".xls"
            ActiveWorkbook.SaveAs Filename:= _
                                  str, FileFormat:=xlNormal, _
                                  Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
                                  CreateBackup:=False
            ActiveWorkbook.Close
        End If
        If MsgBox("voulez vous effacer et en faire une nouvelles la commande?", vbYesNo) = vbYes Then
            Sheets("liste2").Range("A21,a23,a25,a27,a29,a31,a33,a35,a37,a39,a41 ,a43,a45,a47,a49,a51,a53,a55,a57,a59,a61,a63,a65,a 67,a69,A71").ClearContents
            Range("a21").Select
            Sheets("liste3").Range("A21,a23,a25,a27,a29,a31,a33,a35,a37,a39,a41 ,a43,a45,a47,a49,a51,a53,a55,a57,a59,a61,a63,a65,a 67,a69,A71").ClearContents
            Range("a21").Select
            Sheets("liste1").Range("A21,a23,a25,a27,a29,a31,a33,a35,a37,a39,a41 ,a43,a45,a47,a49,a51,a53,a55,a57,a59,a61,a63,a65,a 67,a69,A71,F12:h14").ClearContents
            Range("A21").Select
            Range("a17").Value = Range("a17").Value + 1
            Range("F5:H5").ClearContents
            Range("F5:H5").Select
            With Sheets("récap")
                .Unprotect
                Rows("19:81").Select
                With Range("A75")
                    .ClearContents
                    .RowHeight = 15
                    ActiveSheet.Protect
                End With
            End With
        End If
    End If
    Sheets("liste1").Protect
    Sheets("liste2").Protect
    Sheets("liste3").Protect
    Sheets("liste1").Range("f5").Select

    With Application
        .ScreenUpdating = True
        .Calculation = xlCalculationAutomatic
    End With

End Sub

Il y aurait encore un peu de ménage à faire notamment à propos des cellules en A21 à A71 qui pourraient être déclarées Plage en début de code

A+ à tous
 

Discussions similaires

Réponses
1
Affichages
194
Réponses
0
Affichages
175
Réponses
2
Affichages
525

Statistiques des forums

Discussions
312 451
Messages
2 088 517
Membres
103 873
dernier inscrit
Sabin