Macro lente et problème code
Bonjour,
J'ai réalisé une macro qui me permet de recopier un tableau dans une autre feuille avec une autre mise en forme (le tableau copier est dans la feuille "analyse des essais" et celui collé est dans "données graph").
Ma macro qui permet de copier coller les données du tableau est assez lente.
Celle-ci permet d'insérer une ligne automatiquement (ligne rempli d'espace : " ") entre chaque réf de la colonne "C" "feuille données graph". Cependant cette partie du code ne marche pas complètement car les 2 dernières références ne sont pas séparé par cette ligne. Je ne comprend pas pourquoi.
Cette macro ce lance via un bouton "actualiser les données" de la feuille "synthèse des résultats".
Ce tableau que j'ai recopié me permet de créer un graph dans la feuille "synthèse des résultats". Dans cette feuille j'ai 2 listbox qui permettent de sélectionner dans le tableau les références que je souhaite afficher dans mon graph. Seulement je sais pas comment faire pour cacher ou montrer ces références sélectionner dans mon graph.
Toutes mes macros se trouvent dans la feuille "synthèse des résultats".
merci d'avance.
voici le code pour copier coller mon tableau :
Private Sub CommandButton1_Click()
Sheets("données graph").Range("C5:AA2000").ClearContents
Dim J As Integer
Sheets("analyse des essais").Range("C4:C2000").Copy
Sheets("données graph").Range("C4:C2000").PasteSpecial Paste:=xlPasteFormulasAndNumberFormats
Sheets("analyse des essais").Range("T4:T2000").Copy
Sheets("données graph").Range("K4:K2000").PasteSpecial Paste:=xlPasteFormulasAndNumberFormats
Sheets("analyse des essais").Range("U4:Y2000").Copy
Sheets("données graph").Range("F4:J2000").PasteSpecial Paste:=xlPasteFormulasAndNumberFormats
Sheets("analyse des essais").Range("AB4:AC2000").Copy
Sheets("données graph").Range("D4:E2000").PasteSpecial Paste:=xlPasteFormulasAndNumberFormats
For J = 5 To Sheets("analyse des essais").Range("C65536").End(xlUp).Row
If Sheets("analyse des essais").Range("AA" & J) = "DT" Then
Sheets("analyse des essais").Range("AD" & J).Copy
Sheets("données graph").Range("L" & J).PasteSpecial Paste:=xlPasteFormulasAndNumberFormats
Sheets("analyse des essais").Range("AE" & J).Copy
Sheets("données graph").Range("O" & J).PasteSpecial Paste:=xlPasteFormulasAndNumberFormats
Sheets("données graph").Range("L4:L4").Value = "DT"
Sheets("données graph").Range("O4:O4").Value = "DT"
End If
Next
For J = 5 To Sheets("analyse des essais").Range("C65536").End(xlUp).Row
If Sheets("analyse des essais").Range("AA" & J) = "QT" Then
Sheets("analyse des essais").Range("AD" & J).Copy
Sheets("données graph").Range("M" & J).PasteSpecial Paste:=xlPasteFormulasAndNumberFormats
Sheets("analyse des essais").Range("AE" & J).Copy
Sheets("données graph").Range("P" & J).PasteSpecial Paste:=xlPasteFormulasAndNumberFormats
Sheets("données graph").Range("M4:M4").Value = "QT"
Sheets("données graph").Range("P4:P4").Value = "QT"
End If
Next
For J = 5 To Sheets("analyse des essais").Range("C65536").End(xlUp).Row
If Sheets("analyse des essais").Range("AA" & J) = "VT" Then
Sheets("analyse des essais").Range("AD" & J).Copy
Sheets("données graph").Range("N" & J).PasteSpecial Paste:=xlPasteFormulasAndNumberFormats
Sheets("analyse des essais").Range("AE" & J).Copy
Sheets("données graph").Range("Q" & J).PasteSpecial Paste:=xlPasteFormulasAndNumberFormats
Sheets("données graph").Range("N4:N4").Value = "VT"
Sheets("données graph").Range("Q4:Q4").Value = "VT"
End If
Next
For J = 6 To Sheets("données graph").Range("D65536").End(xlUp).Row
If Sheets("données graph").Range("K" & J) = "A" Then
Worksheets("données graph").Rows(J).Insert Shift:=xlDown
Worksheets("données graph").Rows(J).Value = " "
J = J + 1
End If
Next
End SubBonjour,
je ne suis pas un spécialiste en VBA comme certains sur ce forum.
Mais as-tu essayé "Application.ScreenUpdating = False" en début de macro ce qui évite le rafraichissement d'écran.
J'ai réalisée une macro (à l'aide du forum) relativement longue et sur un même fichier, le temps de traitement
s'est réduit d'1/4, non négligeable.
En fin de macro mettre "Application.ScreenUpdating =true".
Cela ne répondra pas à toutes tes questions, mais tu as déjà une réponse;
@+
Bonsoir
Comme d'habitude ton fichier me donne des soucis
Remplaces ta macro par celle-ci
Private Sub CommandButton1_Click()
Dim J As Long
Dim Colonne As Integer
Dim DerLig As Long
Dim WsSource As Worksheet
Dim WsDestin As Worksheet
Application.ScreenUpdating = False
Set WsSource = Sheets("Analyse des essais")
Set WsDestin = Sheets("données graph")
DerLig = WsSource.Range("C" & Rows.Count).End(xlUp).Row
With WsDestin
.Cells.Clear
'.Range("C5:AA2000").ClearContents
WsSource.Range("C4:C" & DerLig).Copy Destination:=.Range("C4")
WsSource.Range("T4:T" & DerLig).Copy Destination:=.Range("K4")
WsSource.Range("U4:Y" & DerLig).Copy Destination:=.Range("F4")
WsSource.Range("AB4:AC" & DerLig).Copy Destination:=.Range("D4")
For J = 5 To DerLig
Colonne = Switch(WsSource.Range("AA" & J) = "DT", 12, _
WsSource.Range("AA" & J) = "QT", 13, _
WsSource.Range("AA" & J) = "VT", 14)
.Cells(4, Colonne) = WsSource.Range("AA" & J)
.Cells(4, Colonne + 3) = WsSource.Range("AA" & J)
.Cells(J, Colonne) = WsSource.Range("AD" & J)
.Cells(J, Colonne + 3) = WsSource.Range("AE" & J)
Next J
For J = .Range("K" & Rows.Count).End(xlUp).Row To 6 Step -1
If .Range("K" & J) = "A" Then .Rows(J).Insert
Next J
.Cells.Borders.LineStyle = xlNone
End With
End SubMerci beaucoup Banzai64!!! Déja ça marche complètement pour l'ajout des lignes vides et en plus la macro s'exécute en une fraction de seconde!!! J'espère un jour pouvoir en faire tant!
J'ai encore juste un code que je n'arrive vraiment pas à trouver !
Sur ma feuille "synthése résultats" j'ai deux listbox.
La listbox1 me liste les références en colonne "C" de la feuille "données graph".
J'ai deux boutons "ajouter" et "enlever" qui me permettent de sélectionner les références listbox1, de les renvoyer dans la listbox2. J'aimerai afficher sur mon graphique (feuille "synthése résultats") les références présentes dans la listbox2. Pour cela je masque ou cache les lignes correspondant aux références présentes dans la listbox2.
Seulement moi j'arrive juste à afficher que la première ligne de la référence présente dans la listbox2.
Il faudrait que ça me sélectionne les lignes vides en dessous des référence de la colonne "C" (feuille "données graph") jusqu'à la dernière ligne avant la prochaine référence.
Je sèche complètement car j'ai beaucoup de mal à référencer les numéros de ligne sous excel!
Sinon aussi dans le code que tu as amélioré précédemment, est-il possible de mettre la plage de données de mon graphique pour qu'il prenne les dernières entrée (la dernière ligne non vide)?
Bonjour
lolo34140 a écrit :Sinon aussi dans le code que tu as amélioré précédemment, est-il possible de mettre la plage de données de mon graphique pour qu'il prenne les dernières entrée (la dernière ligne non vide)?
Pour ça aucune idée
A voir pour le reste
merci encore!
Alors le principe est bon mais ce que je souhaiterai c'est l'inverse en fait.
Afficher les références de la listbox2.
Cela veut dire qu'il faut un code pour masquer toutes les lignes du tableau dans le bouton "actualiser les données" (de la ligne 5 jusqu'à la dernière ligne non vide de la colonne "K"). Du coup le graphique est vide quand on actualise. Ensuite on ajoute les références à afficher sur le graph via les listbox et boutons.
Dans ce bouton toujours je pense qu'il est possible d'ajouter la sélection automatique de la plage de donnée du graphique avec un code du genre (la dernière ligne non vide étant encore dans la colonne "K"):
Dim DernLigne As long
DernLigne = Columns(11).Find("*", , , , xlByColumns, xlPrevious).Row
ActiveSheet.ChartObjects("Graphique 3").Activate
ActiveChart.SetSourceData Source:=Sheets("données graph").Range("C4" & ":Q" & DernLigne)Je pense que le plus dure est la dernière chose qui ne va pas encore. C'est que lorsque que l'on affiche sur le graph via les listbox1-2 les réf, il faudrait à chaque fois qu'elle soit séparée que d'une seule ligne pour des questions de lisibilité.
Et sinon dans les lignes insérées (bouton actualiser les données) entre chaque réf (colonne "C") il faudrait que cette ligne comporte un espace dans les cellules (" "). C'est encore une question de lisibilité par rapport aux étiquette du graphique.
En tout cas merci beaucoup pour ton aide car ça m'aide déjà énormément. Dommage que je ne comprenne pas encore tout!
Il me reste plus qu'à résoudre ces problèmes et après j'aurais enfin fini ce fichier que j'ai commencé il y a presque 1 moi déjà!!
je viens de me rendre compte que si l'on masque les données du graph (bouton actualiser les données) alors on voit plus les références à afficher. Je sais pas si c'est possible de voir quand même les lignes masquées. Je sais que c'est possible pour un graphique mais pour le reste...
Bonjour
Je ne sais pas si j'ai répondu à toutes les questions
A tester
Ça marche super bien merci beaucoup!!!! C'est exactement ça!
Par contre j'observe 2 petit bugs.
Le premier qui est plutôt embêtant concerne le bouton "actualiser les données". Lorsque je rajoute une référence avec des tests dans la feuille "analyse des essais" et que j'actualise les données, le tableau actualisé dans la feuille "donnée graph" n'ajoute que la première ligne de la nouvelle référence ajouté (et donc que je premier test A).
Par contre si j'ajoute plusieurs références (avec des tests ou non) et que j'actualise, ça me prend bien les nouvelles références (avec tout les tests) mais pour la dernière ça me prend comme précédemment que la première ligne.
Sinon je sais pas si c'est possible ou pas mais je pense que ça serait le top si la listbox s'actualise lorsque l'on clique sur le bouton "actualiser les données". Car actuellement, quand j'actualise les données, je dois aller dans la feuille "données graph" puis retourner dans la feuille "synthèse résultat" pour que la lisbox1 affiche les nouvelles références.
En tout cas c'est vraiment super bien déjà. J'aurais jamais réussi tout seul ou alors ça m'aurait pris 1 an ou 2!! Faut que je songe à acheter un bouquin sur les macro, si ça existe, car je rame sévère.
Merci!
Bonjour
Pour que j'y comprenne quelque chose
Il faudrait que tu me fasses un topo sur la marche à suivre pour constater le défaut, parce que
lolo34140 a écrit :Lorsque je rajoute une référence avec des tests dans la feuille "analyse des essais" et que j'actualise les données, le tableau actualisé dans la feuille "donnée graph" n'ajoute que la première ligne de la nouvelle référence ajouté (et donc que je premier test A).
C'est un peu de l'Hébreu pour moi
Détailles bien les opérations à faire
lolo34140 a écrit :Sinon je sais pas si c'est possible ou pas mais je pense que ça serait le top si la listbox s'actualise lorsque l'on clique sur le bouton "actualiser les données". Car actuellement, quand j'actualise les données, je dois aller dans la feuille "données graph" puis retourner dans la feuille "synthèse résultat" pour que la lisbox1 affiche les nouvelles références.
Pour ça il faut juste rajouter l'appel à la macro InitCombobox à la fin de la macro CommandButton1_Click (celle qui est appelée par le bouton Actualiser les données)
Mais je n'ai pas tester
Ok.
Pour l'appel à la macro InitCombobox (dans la macro CommandButton1_Click) ça marche comme je veux avec.. Pour ça c'est parfait maintenant. (je n'avais pas vu qu'il y avait quelque chose dans le module1)
Pour l'autre problème: Il y a un problème lorsque j'ajoute des données dans la feuille "Analyse des essais".
Par exemple, je rajoute une référence M137 (colonne "C") avec deux lignes, test A et test B dans la feuille "analyse des essais". Ensuite dans la feuille "synthèse des résultats" je clique sur "actualiser les données". Dans ce cas, Le graphique n'affiche que la première ligne de cette référence (soit la ligne correspondant au test A). De même lorsque que j'utilise la listbox et le bouton ok pour n'afficher que cette nouvelle référence M137.
Il faudrait en fait que ça prenne toutes les nouvelles lignes ajoutées (plus précisément les lignes non vides ajoutées de la colonne "T").
Je sais pas si j'ai était très clair mais je joints un fichier du cas dont je viens de parler. (il y a une référence M137 en plus avec 2 tests (A et B), le graphique n'affiche que le premier test A)
Bonjour
A voir
Modification de la ligne
Private Sub CommandButton1_Click()
Dim J As Long
Dim Colonne As Integer
Dim DerLig As Long
Dim WsSource As Worksheet
Dim WsDestin As Worksheet
Dim OldCel As Range
Me.ListBox2.Clear
Application.ScreenUpdating = False
Set WsSource = Sheets("Analyse des essais")
Set WsDestin = Sheets("données graph")
'[barrer]DerLig = WsSource.Range("C" & Rows.Count).End(xlUp).Row[/barrer]
DerLig = WsSource.Range("T" & Rows.Count).End(xlUp).Row
With WsDestinFichier corrigé
C'est parfait maintenant!
Par contre je viens de remarquer un autre petit "soucis" qui vient de l'actualisation de la plage des données du graphique.
Les étiquettes du graphique sont actualisées qu'en fonction de la colonne "C" de la feuille "donnée graph". En fait, il faudrait que les étiquettes correspondent à la plage "C:K". En abscisse chaque étiquette des colonnes C à K doit apparaître en fait.
Je ne sais pas comment modifier ton code pour y parvenir
With ActiveSheet.ChartObjects("Graphique 3").Chart
.SeriesCollection(1).XValues = "='données graph'!R5C3:R" & DerLig & "C3"
.SeriesCollection(1).Values = "='données graph'!R5C12:R" & DerLig & "C12"
.SeriesCollection(2).XValues = "='données graph'!R5C3:R" & DerLig & "C3"
.SeriesCollection(2).Values = "='données graph'!R5C13:R" & DerLig & "C13"
.SeriesCollection(3).XValues = "='données graph'!R5C3:R" & DerLig & "C3"
.SeriesCollection(3).Values = "='données graph'!R5C14:R" & DerLig & "C14"
End With
Bonjour
lolo34140 a écrit :En fait, il faudrait que les étiquettes correspondent à la plage "C:K". En abscisse chaque étiquette des colonnes C à K doit apparaître en fait.
Je ne suis pas, mais pas du tout, à l'aise avec les graphiques
Je ne comprends pas ce que tu veux dire
Prépares un ou des exemples, peut-être que je comprendrais
Si quelqu'un comprend et qu'il puisse t'aider, je regarderai la solution, car en ce moment je n'ai pas le début du commencement d'une idée
ok.
Alors en fait, il faut que la plage de données du graphique corresponde finalement à toutes les colonnes du tableau de la feuille "données graph".
Je joint un exemple ou il y a un second graphique avec les bonnes abscisses du bar chart (toutes les étiquettes des colonnes "C" à "K")
J'ai aussi une autre petite question concernant un bouton bascule que j'ai sur la feuille "synthèse résultats" :
Private Sub ToggleButton1_Click()
Dim J As Long
With Sheets("données graph")
If ToggleButton1.Value Then
' Masquage des colonnes.
ToggleButton1.BackColor = RGB(0, 255, 0)
ToggleButton1.Caption = "Afficher DT"
For J = 5 To .Range("L" & Rows.Count).End(xlUp).Row
If Trim(.Range("L" & J)) <> "" Then
.Rows(J).Hidden = True
End If
Next J
.Columns("L").Hidden = True
Else
' Affichage des colonnes.
ToggleButton1.BackColor = RGB(79, 129, 189)
ToggleButton1.Caption = "Masquer DT"
.Rows.Hidden = False
.Columns("L").Hidden = False
Me.ListBox2.Clear
End If
End With
End Sub
il permet de masquer des colonnes de la feuille "données graph". Il marche mais pas tout à fait bien.
Si j'ai par exemple affiché via la listbox2 deux-trois références et que je j'affiche des colonnes via ce bouton bascule alors la plage des données du graph et entièrement sélectionnée. En fait le fait d'afficher les colonnes masquées (par exemple "L" et "O") fait aussi afficher toutes les autres colonnes masquer non souhaitées.
Je pense que ça vient du fait que je masque et affiche avec un mauvais code les colonnes de la feuille "donnée graph". Car je vois que la façon dont tu masques les lignes dans ta macro et différente (du moins visuellement quand on va sur la feuill" données graph").
Pour voir ce probleme on peut faire la manip suivante.
1. cliquer sur actualiser les données
2. sélectionner la ref M131 de la listbox1
3. cliquer sur ajouter
4. cliquer sur Ok
5. Cliquer sur le bouton bascule "masquer DT" (la ça marche bien)
6. Puis recliquer sur ce même bouton bascule (toutes les lignes de la feuille "donnée graph" réapparaissent. Il faudrait juste que la colonne réapparaisse).
en tout cas merci beaucoup pour ton aide.
Je suis presque au bout de toutes ces macro. Il reste juste ces 2 problèmes.
Merci beaucoup!!
Maintenant c'est parfait!!! Tout marche comme il faut!
Un grand merci!
Je viens juste de remarquer quelque chose qui ne va tout à fait pour ce que je veux.
En fait lorsque j'utilise le bouton bascule pour masquer des colonnes, ça me masque dans certains cas la réf sur le graphique.
Par exemple, je sélectionne M131, M132 et M133 via les listbox et le bouton ok. Ensuite je masque la série DT (via le ToggleButton1_Click() ).
Dans ce cas je ne vois apparaître sur mon graph que les noms de la réf M131 et M132. Car la réf M133 à comme premier test A, un test de type DT. Donc la ligne ou apparait la réf M133 disparait dans le tableau et le graph.
Tout cela est normal par rapport à ce que fait la macro.
Cependant j'ai besoin de voir le numéro des références.
Est-ce possible de toujours voir sur le graphique le nom des références (sans doublons) même si on masque la ligne ou il y a la réf. Ou fait il répéter le nom de la réf pour chaque ligne de tests du tableau (et du coup avoir des doublons dans le graph).
Dans mon cas le mieux serait que dans le tableau la référence n'apparaisse qu'une seule fois pour qu'elle ne soit affichée qu'une seule fois sur le graphique.
Je sais pas si je suis clair, mais en gros il faut que les réf de la colonnes "C" feuille "données graph" apparaissent toujours dans le graph (si elles sont sélectionné par les listbox bien sur). Le mieux sera qu'elles apparaissent dans le graph sans doublons.
Bonsoir
Ah c'est incroyable j'ai compris ce que tu voulais
A voir si j'ai bien compris
C'est exactement ça merci!!
Je viens d'ajouter de nouveaux boutons bascule reprenant le même principe que le premier mais pour les autres colonnes des séries du graph.
Cependant maintenant ça cause quelques problèmes au niveau de l'affichage des références dans le graphique.
Quand on clique sur le bouton bascule1 puis sur un autre, qu'on reclique.... Cela ajoute les noms des réfs en double, triple.. dans le graph.
Je pense qu'il faudrait dans le code du bouton bascule, enlever le nom de la réf que l'on ajoute lorsque l'on masque la colonne et les lignes de façon à ne pas avoir de doublon qu'en on ré-affiche les colonnes.
Bien sur je ne sais pas encore faire!
ci joint le fichier avec les nouveau boutons que j'ai ajouté.