Appels de sub bizarres

  • Initiateur de la discussion Initiateur de la discussion mécano41
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

mécano41

XLDnaute Accro
Bonjour à tous,

Dans une feuille, j'ai un tableau, un graphe et des boutons.

Pour imprimer juste le graphe j'ai le petit sub suivant (je le mets à tout hasard car je pense qu'il n'y est pour rien) :

Code:
Sub ImprimeGraphe()
Dim NombCopies As Integer
' -----
With Workbooks(Range("MemNomClasseur").Value)
    Application.ScreenUpdating = False
    Call NombreDeCopies(NombCopies)
    ActiveSheet.ChartObjects(1).Activate
    ActiveChart.ChartArea.Select
    ActiveChart.ShowWindow = True
    ActiveWindow.SelectedSheets.PrintOut Copies:=NombCopies, Collate:=True
    ActiveWindow.Visible = False
    RMtravail.Activate
    Range("A1").Select
    Application.ScreenUpdating = True
End With
End Sub

Si je l'appelle directement, dedans par F5 ou par le sub suivant placé dans le même module ou dans un autre, et dans lequel je fais F5 :

Code:
Sub essai4()
Call ImprimeGraphe
End Sub

l'impression donnée est bien celle du graphe seul comme je le souhaite.

Si je l'appelle par un bouton de la feuille au moyen de :

Code:
Private Sub BoutonImprGraph_Click()
Call ImprimeGraphe
End Sub

cela imprime toute la feuille, tableau, graphe et boutons.

Quelqu'un a-t-il une idée?

Merci d'avance

Cordialement


[EDIT] j'ai essayé avec ou sans ActiveChart.ShowWindow = True cela ne change rien
 
Re : Appels de sub bizarres

Bonsoir à tous,

Merci pour vos réponses. J'ai sorti la partie qui nous intéresse.

Si je clique sur le bouton, j'ai toute la feuille

Si je mets le curseur dans le sub + F5 c'est bon, j'ai juste le graphe

Si je mets le curseur dans essai 4 + F5 c'est bon

Si je mets le curseur dans le sub du bouton_click + F5 c'est bon


Cordialement
 

Pièces jointes

Re : Appels de sub bizarres

Re, Mécano41

Chez moi en cliquant sur le bouton, ça fonctionne parfaitement !?

Il faut que tu mettes un point d'arrêt dasn le code de ton bouton pour voir ce qui ne va pas chez toi !

A+
 
Re : Appels de sub bizarres

Bonsoir mécano41, BrunoM45, tatiak,

Ton bouton ImpressionGraphe ---> propriété TakeFocusOnClick à mettre sur False.😉

Cordialement,

Bosoir à tous,

Effectivement ça marche mais j'aimerais comprendre pourquoi, je ne vois pas le lien avec le défaut de sélection avant envoi à l'imprimante... ; dans l'aide ce n'est pas très clair 😡

Merci beaucoup.

Cordialement
 
Re : Appels de sub bizarres

Re,

Quelquefois, lorsque tu cliques sur un bouton ActiveX placé sur une feuille de calcul, ce dernier à la fâcheuse tendance de garder le focus , ce qui peut donc remettre en cause les Activate et autres Select sur autres objets de feuille que tu peux mettre dans ton code... (sur Excel97 par exemple, c'est systématique !).
Ainsi, en jouant sur la propriété TakeFocusOnClick du bouton, tu peux donc désactiver le focus sur ce dernier et tes Activate prendront tout leur effet...

Cela dit, la VRAIE solution reste encore d'appliquer ce qu'on répète à longueur de temps dans ce Forum, à savoir : il faut éviter les Activate et Select en code VBA, c'est souvent inutile et source de problème... (comme le tien).

Tu devrais donc pouvoir aussi remplacer ta procédure par celle-ci :
Code:
[COLOR=NAVY]Sub[/COLOR] ImprimeGraphe()
[COLOR=NAVY]Dim[/COLOR] NombCopies [COLOR=NAVY]As Integer[/COLOR]
    NombCopies = 1
    ActiveSheet.ChartObjects(1).Chart.PrintOut Copies:=NombCopies, Collate:=[COLOR=NAVY]True
End Sub[/COLOR]
(pardon, je n'avais pas pris le temps d'analyser ton code tout à l'heure)

Cordialement,
 
Re : Appels de sub bizarres

Bonjour,

Une question suite à la remarque de myDearFriend! :

Comment faire pour éviter les Activate et les Select dans le cas où je dois changer de classeur ( je suis dans NomDeCeClasseur, par ex.) ? :

Code:
        Windows(NomAutreClasseur).Activate
        Worksheets(RMmemoire.Name).Select
        Range("Entree").value=....
        Windows(NomDeCeClasseur).Activate

De plus, si je masque ladite feuille RMmemoire, ça plante!

Que faire? Merci d'avance.

Cordialement
 
Re : Appels de sub bizarres

Bonjour mécono41, le fil, le Forum,

Bonjour,

Une question suite à la remarque de myDearFriend! :

Comment faire pour éviter les Activate et les Select dans le cas où je dois changer de classeur ( je suis dans NomDeCeClasseur, par ex.) ? :

Code:
        Windows(NomAutreClasseur).Activate
        Worksheets(RMmemoire.Name).Select
        Range("Entree").value=....
        Windows(NomDeCeClasseur).Activate
De plus, si je masque ladite feuille RMmemoire, ça plante!

Que faire? Merci d'avance.

Cordialement
Ca plante justement parce que tu fais du Activate et du Select, mais pas si tu fais comme ça :
Code:
Workbooks(NomAutreClasseur).Sheets(RMmemoire.Name).Range("Entree").Value = "CeQueTuVeux"
Cordialement,

😉
 
Dernière édition:
Re : Appels de sub bizarres

Bonjour,

Toujours pour supprimer mes Activate et Select , je ne comprends pas ceci :

Code:
Set PlageValeursAIF = Range(...)
Tampon = PlageValeursAIF    ' Met les valeurs dans un tampon Variant
' ----- dans l'appli.
With RMmemoire
     Range("Aire").Value = AireAIF     ' Met l'aire dans la feuille mémoire de l'appli.
     Range(Range("Entree"), Range("Entree").End(xlDown)).ClearContents               ' Efface la plage
     Range(Range("Entree"), Range("Entree").Offset(BorneSup - BorneInf, 0)).Value = Tampon   ' et colle le tampon
End With
' ----- dans l'autre appli.
With Workbooks(NomAutreAppli).Worksheets(RMmemoire.Name)
      .Range("Aire").Value = AireAIF   ' Met l'aire dans la feuille mémoire de l'autre appli.
       Range(Range("Entree"), Range("Entree").End(xlDown)).ClearContents                ' Efface la plage
       Range(Range("Entree"), Range("Entree").Offset(BorneSup - BorneInf, 0)).Value = Tampon     ' et colle le tampon
End With

Dans la partie ' ---- dans l'appli : cela fonctionne
Dans la partie ' ---- dans l'autre appli :
- si je ne mets pas de point devant la première des 3 lignes de Range(....), il ne fait rien. Avec le point, c'est bon

- si je ne mets pas de point devant les deux autre lignes de Range(...), l'effacement ne se fait pas dans le bon classeur et le collage ne se fait pas

- si je mets des points, j'ai une erreur 1004 sur les deux lignes


Qu'est-ce qui ne va pas?

Merci d'avance

Cordialement
 
Re : Appels de sub bizarres

Bonjour mécano41, le fil, le Forum,

Avant tout, il te faut bien comprendre la relation des objets entre eux et respecter leur hiérarchie, c'est la base de VBA.
Et il te faut aussi bien comprendre l'utilité de l'instruction de bloc With.... End With.

En clair, dans ton exemple, si tu ne mets pas les "points", alors tes With... End with ne servent à rien. Mais il ne s'agit pas de mettre un point en début de ligne, il s'agit de mettre un point devant chaque objet Range de chaque ligne contenue dans le bloc :

Code:
[COLOR=NAVY]Set[/COLOR] PlageValeursAIF = Range(...)
Tampon = PlageValeursAIF    [COLOR=GREEN]' Met les valeurs dans un tampon Variant[/COLOR]
[COLOR=GREEN]' ----- dans l'appli.[/COLOR]
[COLOR=NAVY]With[/COLOR] RMmemoire
     .Range("Aire").Value = AireAIF     [COLOR=GREEN]' Met l'aire dans la feuille mémoire de l'appli.[/COLOR]
     .Range(.Range("Entree"), .Range("Entree").[COLOR=NAVY]End[/COLOR](xlDown)).ClearContents               [COLOR=GREEN]' Efface la plage[/COLOR]
     .Range(.Range("Entree"), .Range("Entree").Offset(BorneSup - BorneInf, 0)).Value = Tampon   [COLOR=GREEN]' et colle le tampon[/COLOR]
[COLOR=NAVY]End With[/COLOR]
[COLOR=GREEN]' ----- dans l'autre appli.[/COLOR]
[COLOR=NAVY]With[/COLOR] Workbooks(NomAutreAppli).Worksheets(RMmemoire.Name)
    .Range("Aire").Value = AireAIF   [COLOR=GREEN]' Met l'aire dans la feuille mémoire de l'autre appli.[/COLOR]
    .Range(.Range("Entree"), .Range("Entree").[COLOR=NAVY]End[/COLOR](xlDown)).ClearContents                [COLOR=GREEN]' Efface la plage[/COLOR]
    .Range(.Range("Entree"), .Range("Entree").Offset(BorneSup - BorneInf, 0)).Value = Tampon     [COLOR=GREEN]' et colle le tampon[/COLOR]
[COLOR=NAVY]End With[/COLOR]
Ainsi, on n'écrit pas :
Code:
.Range(Range("Entree"), Range(...
Mais on qualifie CHAQUE objet Range avec le point :
Code:
.Range([COLOR=BLUE][B].[/B][/COLOR]Range("Entree"), [COLOR=BLUE][B].[/B][/COLOR]Range(...
(avec un "point" devant chaque expression Range)

Le With représente l'objet Parent. Si tu ne mets pas le point, alors l'objet Parent n'est pas pris en compte, et tu ne cibles plus le bon objet.

En espérant t'avoir aidé...

Cordialement,
 
Dernière édition:
Re : Appels de sub bizarres

Bonjour à tous,

Je croyais avoir tout compris mais...il y a ceci, que je ne comprends pas :

(j'ai laissé le début pour la compréhension car il y a deux graphes à établir dans chaque feuille RMpatlak de chaque classeur "nomappli" et "nomautreappli")

Le problème (probablement dans la partie rouge) est que je n'arrive pas à faire faire le travail dans "nomautreappli". Selon ce que je mets comme instructions, il écrit tout dans le classeur "nomappli" ou bien il y a une erreur (avec point devant Charts.Add par exemple)

Au moment du Charts.Add, je suis pourtant bien dans la bonne feuille du bon classeur...

Code:
sub TraceCourbes(....)

....

' ----- dans l'appli.
For Graphe = 1 To NbGraphes
    Select Case Graphe
        Case 1
            Decal = 0
            Efface = True
        Case 2
            Decal = DecEntGraphPat
            Efface = False
    End Select
    Call TraceNuagePoints(Workbooks(NomAppli), NLignes, Decal, Efface)
 Next Graphe
' ----- dans l'autre appli.
For Graphe = 1 To NbGraphes
    Select Case Graphe
        Case 1
            Decal = 0
            Efface = True
        Case 2
            Decal = DecEntGraphPat
            Efface = False
    End Select
    Call TraceNuagePoints(Workbooks(NomAutreAppli), NLignes, Decal, Efface)
 Next Graphe
End Sub

' ============== Trace le nuage de points
Sub TraceNuagePoints(WkBook As Workbook, NbLignes As Integer, Dec As Integer, Effacer As Boolean)
Dim PlageGraphe As Range
Dim PenteKi As String
Dim OrdOrVd As String
' ----- Définition des plages des séries du graphe dans la feuille mémoire
With WkBook.Worksheets(RMmemoire.Name)
    Select Case Graphe
        Case 1
            Set PlageGraphe = Union(.Range(.Range("EntSurAire"), .Range("EntSurAire").Offset(NbLignes, 0)), .Range(.Range("Comp1SurAire"), .Range("Comp1SurAire").Offset(NbLignes, 0)))
        Case 2
            Set PlageGraphe = Union(.Range(.Range("EntSurAire"), .Range("EntSurAire").Offset(NbLignes, 0)), .Range(.Range("Comp2SurAire"), .Range("Comp2SurAire").Offset(NbLignes, 0)))
    End Select
End With
[COLOR="Red"]With WkBook.Worksheets(RMpatlak.Name)
    ' ----- Effacement des graphes et des étiquettes précédentes sur la feuille RMpatlak
    If Effacer = True Then .ChartObjects.Delete                                       ' On efface seulement si premier graphe
    ' ----- Création du graphe
    Charts.Add
    With ActiveChart
        .ChartType = xlXYScatter
        .SetSourceData Source:=PlageGraphe, PlotBy:=xlColumns
        .HasLegend = False
        .HasTitle = True
        .Location Where:=xlLocationAsObject, Name:=RMpatlak.Name  [/COLOR]                 ' Met le graphe sur la feuille
    End With
    ' ----- Dimensions, décalage et couleur du cadre -------------------
    With ActiveSheet.ChartObjects(Graphe)
            .Left = 20
            .Top = 60 + Dec
            .Width = 390
   .....

Autre question qui n'a rien à voir : si, après le end select, je mets PlageGraphe.select pour vérifier ma plage, j'ai une erreur 1004. Pourquoi?

Merci d'avance

Cordialement
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
10
Affichages
663
  • Question Question
Microsoft 365 worksheet_change
Réponses
29
Affichages
1 K
Réponses
0
Affichages
663
Retour