Problème sous totaux VBA
Obi35
Messages postés
11
Date d'inscription
Statut
Membre
Dernière intervention
-
Obi35 -
Obi35 -
Bonjour,
J'ai un problème qui est sûrement très simple à résoudre, mais je comprends pas pourquoi la macro réagit comme ça!!!
Je suis en train de rédiger une macro qui copie une feuille (feuille marge), effectue un trie puis reporte les données répondant à la sélection sur une autre feuille(feuille ramasse). Après Sur la feuille "planning", je fais des sous totaux et après je voudrais reporter les sous totaux sur la feuille "ramasse" avec une sorte de recherche V qui retrouverait le bon code voyage auquel le sous total doit être reporté....le p^roblème, c'est que ma macro me fait bien les sous totaux sur le feuille "planning", mais impossible de SELCTIONNER par exemple la cellule A1 à la fin du traitement qui me permettrai ensuite de continuer mon code pour faire la recherche V ensuite(parce qu'il faut bien que je remonte en haut de la feuille "planning"... Donc j'ai mis un msgbox "fin de traitement" pour voir si la lecture de la macro allait bien jusqu'au bout...et il affiche bin le message "fin de traitement" MAIS NE ME SELECTIONNE PAS LA CELLULE A1 juste avant...
:( C'est peut être une erreur toute bête...mais je ne trouve pas et ça me bloque!!!
Je vous met le code... en espérant que qq'1 vienne à mon aide!!!
Merci beaucoup par avance!!
Sub ANALYSE_RAMASSE()
' Annulation du filtrage éventuel sur la feuille RAMASSE
Sheets("MARGE").Select ' Sélection feuille MARGE
On Error Resume Next ' Pour éviter une erreur sur la ligne suivante (erreur si données non filtrées)
ActiveSheet.ShowAllData ' Annulation du filtrage
' Suppression du contenu éventuel de la feuille RAMASSE
Sheets("RAMASSE").Select ' Sélection feuille RAMASSE
Cells.Select ' Sélection de la feuille entière
Selection.Delete ' Suppression de la feuille entière
Range("A1").Select ' Sélection cellule A1
ActiveCell.Value = "Date" ' Stockage libellé Date en cellule active
Range("B1").Select ' Sélection cellule B1
ActiveCell.Value = "Code voyage" ' Stockage libellé Code voyage en cellule active
Range("C1").Select ' Sélection cellule C1
ActiveCell.Value = "Libellé voyage" ' Stockage libellé Libellé voyage en cellule active
Range("D1").Select ' Sélection cellule D1
ActiveCell.Value = "Cout ramasse" ' Stockage libellé Cout ramasse en cellule active
Range("E1").Select ' Sélection cellule E1
ActiveCell.Value = "Nb palette" ' Stockage libellé Nb palette en cellule active
Range("F1").Select ' Sélection cellule F1
ActiveCell.Value = "Coût / palette" ' Stockage libellé Nb palette en cellule active
Range("A1:F1").Select
Selection.Interior.ColorIndex = 37
Selection.Font.ColorIndex = 11
Selection.Font.Size = 12
Selection.Font.Bold = True
Selection.HorizontalAlignment = xlCenter
'Mise en forme de la ligne de titre
With Selection.Borders(xlInside)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeLeft, xlEdgeTop, xlEdgeBottom, xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
Columns("A:A").ColumnWidth = 12
Columns("B:B").ColumnWidth = 15
Columns("C:C").ColumnWidth = 33
Columns("D:D").ColumnWidth = 16
Columns("E:E").ColumnWidth = 12
Columns("F:F").ColumnWidth = 15
Range("A2").Select ' Sélection cellule A2
Sheets("PLANNING").Select ' Sélection feuille RAMASSE
Selection.RemoveSubtotal
'Recherche de la première ligne vide
Range("A1").Select
Do While ActiveCell.Value <> ""
ActiveCell.Offset(1, 0).Select
Loop
'Définition de la zone à trier
Set ZONE = Range(Cells(1, 1), ActiveCell.Offset(-1, 18))
ZONE.Select
'Tri sur la date puis sur le code voyage
Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Key2:=Range _
("I2"), Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase _
:=False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, _
DataOption2:=xlSortNormal
'Mise en place de la totalisation par code voyage (Données/Sous totaux)
Selection.Subtotal GroupBy:=9, Function:=xlSum, TotalList:=Array(17), _
Replace:=True, PageBreaks:=False, SummaryBelowData:=True
Range("A1").Select
' Parcours séquentiel de la feuille MARGE et report sur la feuille RAMASSE
Sheets("MARGE").Select ' Sélection feuille MARGE
Range("A2").Select ' Sélection cellule A2
Do While ActiveCell.Value <> ""
' Récupération des informations concernant le MARGE
DATE_VOYAGE = Left(ActiveCell.Value, 10) ' Date voyage
ActiveCell.NumberFormat = "dd/mm/yyyy" ' Format date
ActiveCell.Offset(0, 1).Select ' Passage à la colonne suivante
CODE_VOYAGE = ActiveCell.Value ' Code voyage
ActiveCell.Offset(0, 1).Select ' Passage à la colonne suivante
LIBELLE_VOYAGE = ActiveCell.Value ' Libellé voyage
ActiveCell.Offset(0, 2).Select ' Passage à la colonne suivante
TYPE_VOYAGE = ActiveCell.Value ' Type voyage
ActiveCell.Offset(0, 4).Select ' Passage à la colonne suivante
COUT_RAMASSE = Right(ActiveCell.Value, 5) ' Cout ramasse
ActiveCell.NumberFormat = "00,00" ' Format du coût
'MsgBox ("2 gauche code voyage : " + Left(CODE_VOYAGE, 2))
'MsgBox ("2 droite code voyage : " + Right(CODE_VOYAGE, 2))
If Left(CODE_VOYAGE, 2) >= 0 And Left(CODE_VOYAGE, 2) <= 99 And Right(CODE_VOYAGE, 2) <> "RA" Then
' Passage à la feuille RAMASSE et report
Sheets("RAMASSE").Select ' Sélection feuille RAMASSE
ActiveCell.Value = DATE_VOYAGE
ActiveCell.Offset(0, 1).Select ' Décalage d'une cellule vers la droite
ActiveCell.Value = CODE_VOYAGE
ActiveCell.Offset(0, 1).Select ' Décalage d'une cellule vers la droite
ActiveCell.Value = LIBELLE_VOYAGE
ActiveCell.Offset(0, 1).Select ' Décalage d'une cellule vers la droite
ActiveCell.Value = COUT_RAMASSE
ActiveCell.Offset(0, 1).Select ' Décalage d'une cellule vers la droite
ActiveCell.Offset(1, -4).Select ' Passage à la ligne suivante (colonne A)
Sheets("MARGE").Select
ActiveCell.Offset(1, -8).Select
Else
ActiveCell.Offset(1, -8).Select
End If
ActiveCell.Offset(1, -8).Select
Sheets("MARGE").Select
Range("A1").Select
Loop
Sheets("PLANNING").Select
Range("A1").Select
MsgBox ("Fin de traitement ") 'Ce message s'affiche bien
End Sub
J'ai un problème qui est sûrement très simple à résoudre, mais je comprends pas pourquoi la macro réagit comme ça!!!
Je suis en train de rédiger une macro qui copie une feuille (feuille marge), effectue un trie puis reporte les données répondant à la sélection sur une autre feuille(feuille ramasse). Après Sur la feuille "planning", je fais des sous totaux et après je voudrais reporter les sous totaux sur la feuille "ramasse" avec une sorte de recherche V qui retrouverait le bon code voyage auquel le sous total doit être reporté....le p^roblème, c'est que ma macro me fait bien les sous totaux sur le feuille "planning", mais impossible de SELCTIONNER par exemple la cellule A1 à la fin du traitement qui me permettrai ensuite de continuer mon code pour faire la recherche V ensuite(parce qu'il faut bien que je remonte en haut de la feuille "planning"... Donc j'ai mis un msgbox "fin de traitement" pour voir si la lecture de la macro allait bien jusqu'au bout...et il affiche bin le message "fin de traitement" MAIS NE ME SELECTIONNE PAS LA CELLULE A1 juste avant...
:( C'est peut être une erreur toute bête...mais je ne trouve pas et ça me bloque!!!
Je vous met le code... en espérant que qq'1 vienne à mon aide!!!
Merci beaucoup par avance!!
Sub ANALYSE_RAMASSE()
' Annulation du filtrage éventuel sur la feuille RAMASSE
Sheets("MARGE").Select ' Sélection feuille MARGE
On Error Resume Next ' Pour éviter une erreur sur la ligne suivante (erreur si données non filtrées)
ActiveSheet.ShowAllData ' Annulation du filtrage
' Suppression du contenu éventuel de la feuille RAMASSE
Sheets("RAMASSE").Select ' Sélection feuille RAMASSE
Cells.Select ' Sélection de la feuille entière
Selection.Delete ' Suppression de la feuille entière
Range("A1").Select ' Sélection cellule A1
ActiveCell.Value = "Date" ' Stockage libellé Date en cellule active
Range("B1").Select ' Sélection cellule B1
ActiveCell.Value = "Code voyage" ' Stockage libellé Code voyage en cellule active
Range("C1").Select ' Sélection cellule C1
ActiveCell.Value = "Libellé voyage" ' Stockage libellé Libellé voyage en cellule active
Range("D1").Select ' Sélection cellule D1
ActiveCell.Value = "Cout ramasse" ' Stockage libellé Cout ramasse en cellule active
Range("E1").Select ' Sélection cellule E1
ActiveCell.Value = "Nb palette" ' Stockage libellé Nb palette en cellule active
Range("F1").Select ' Sélection cellule F1
ActiveCell.Value = "Coût / palette" ' Stockage libellé Nb palette en cellule active
Range("A1:F1").Select
Selection.Interior.ColorIndex = 37
Selection.Font.ColorIndex = 11
Selection.Font.Size = 12
Selection.Font.Bold = True
Selection.HorizontalAlignment = xlCenter
'Mise en forme de la ligne de titre
With Selection.Borders(xlInside)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeLeft, xlEdgeTop, xlEdgeBottom, xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
Columns("A:A").ColumnWidth = 12
Columns("B:B").ColumnWidth = 15
Columns("C:C").ColumnWidth = 33
Columns("D:D").ColumnWidth = 16
Columns("E:E").ColumnWidth = 12
Columns("F:F").ColumnWidth = 15
Range("A2").Select ' Sélection cellule A2
Sheets("PLANNING").Select ' Sélection feuille RAMASSE
Selection.RemoveSubtotal
'Recherche de la première ligne vide
Range("A1").Select
Do While ActiveCell.Value <> ""
ActiveCell.Offset(1, 0).Select
Loop
'Définition de la zone à trier
Set ZONE = Range(Cells(1, 1), ActiveCell.Offset(-1, 18))
ZONE.Select
'Tri sur la date puis sur le code voyage
Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Key2:=Range _
("I2"), Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase _
:=False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, _
DataOption2:=xlSortNormal
'Mise en place de la totalisation par code voyage (Données/Sous totaux)
Selection.Subtotal GroupBy:=9, Function:=xlSum, TotalList:=Array(17), _
Replace:=True, PageBreaks:=False, SummaryBelowData:=True
Range("A1").Select
' Parcours séquentiel de la feuille MARGE et report sur la feuille RAMASSE
Sheets("MARGE").Select ' Sélection feuille MARGE
Range("A2").Select ' Sélection cellule A2
Do While ActiveCell.Value <> ""
' Récupération des informations concernant le MARGE
DATE_VOYAGE = Left(ActiveCell.Value, 10) ' Date voyage
ActiveCell.NumberFormat = "dd/mm/yyyy" ' Format date
ActiveCell.Offset(0, 1).Select ' Passage à la colonne suivante
CODE_VOYAGE = ActiveCell.Value ' Code voyage
ActiveCell.Offset(0, 1).Select ' Passage à la colonne suivante
LIBELLE_VOYAGE = ActiveCell.Value ' Libellé voyage
ActiveCell.Offset(0, 2).Select ' Passage à la colonne suivante
TYPE_VOYAGE = ActiveCell.Value ' Type voyage
ActiveCell.Offset(0, 4).Select ' Passage à la colonne suivante
COUT_RAMASSE = Right(ActiveCell.Value, 5) ' Cout ramasse
ActiveCell.NumberFormat = "00,00" ' Format du coût
'MsgBox ("2 gauche code voyage : " + Left(CODE_VOYAGE, 2))
'MsgBox ("2 droite code voyage : " + Right(CODE_VOYAGE, 2))
If Left(CODE_VOYAGE, 2) >= 0 And Left(CODE_VOYAGE, 2) <= 99 And Right(CODE_VOYAGE, 2) <> "RA" Then
' Passage à la feuille RAMASSE et report
Sheets("RAMASSE").Select ' Sélection feuille RAMASSE
ActiveCell.Value = DATE_VOYAGE
ActiveCell.Offset(0, 1).Select ' Décalage d'une cellule vers la droite
ActiveCell.Value = CODE_VOYAGE
ActiveCell.Offset(0, 1).Select ' Décalage d'une cellule vers la droite
ActiveCell.Value = LIBELLE_VOYAGE
ActiveCell.Offset(0, 1).Select ' Décalage d'une cellule vers la droite
ActiveCell.Value = COUT_RAMASSE
ActiveCell.Offset(0, 1).Select ' Décalage d'une cellule vers la droite
ActiveCell.Offset(1, -4).Select ' Passage à la ligne suivante (colonne A)
Sheets("MARGE").Select
ActiveCell.Offset(1, -8).Select
Else
ActiveCell.Offset(1, -8).Select
End If
ActiveCell.Offset(1, -8).Select
Sheets("MARGE").Select
Range("A1").Select
Loop
Sheets("PLANNING").Select
Range("A1").Select
MsgBox ("Fin de traitement ") 'Ce message s'affiche bien
End Sub
A voir également:
- Problème sous totaux VBA
- Excel compter cellule couleur sans vba - Guide
- Incompatibilité de type vba ✓ - Forum VB / VBA
- Erreur 13 incompatibilité de type VBA excel ✓ - Forum Excel
- Mkdir vba ✓ - Forum VB / VBA
- Dépassement de capacité vba ✓ - Forum Excel
12 réponses
Bonjour,
zut.. du fait que tu a poster plusieur fois je doit recommencer la réponse, pas grave :D
Comme tu met un MsgBox tu quite la feuille mais je pense que c'est pas pour cela que la cellule A1 ne serait pas active.
Tu met après le MsgBox
e = ActiveCell.address
et un point d'arrèt sur le MSGBOX (F9) au cas ou..
Un point d'arrète sur le end Sub
Quand arrèter sur msgbox regarde si la cellule A1 est active.
Ensuite F8, le MsgBox va venir.
clic OK
à l'arrèt sur End sub controle ce qu'il y a dans E, il devrait y avoir "&A&1"
Tu dit..
A+
zut.. du fait que tu a poster plusieur fois je doit recommencer la réponse, pas grave :D
Comme tu met un MsgBox tu quite la feuille mais je pense que c'est pas pour cela que la cellule A1 ne serait pas active.
Tu met après le MsgBox
e = ActiveCell.address
et un point d'arrèt sur le MSGBOX (F9) au cas ou..
Un point d'arrète sur le end Sub
Quand arrèter sur msgbox regarde si la cellule A1 est active.
Ensuite F8, le MsgBox va venir.
clic OK
à l'arrèt sur End sub controle ce qu'il y a dans E, il devrait y avoir "&A&1"
Tu dit..
A+
Bon..
1°) point d'arrèt.. Tu met le curseur sur la ligne où tu veux que ca stope et tu tape F9, la ligne va paser au brun.
Et quand tu tape F5 la ligne va être jaune. pour avancer d'une instruction tu tape F8 et pour aller au point d'arrèt suivant tu tape F5.
2°) Bizzzzard...
Tu a pas des macro automatique dans les module de feuille ?
tu met avant Sheets.. select
Application.EnableEvents = False
et recommence
1°) point d'arrèt.. Tu met le curseur sur la ligne où tu veux que ca stope et tu tape F9, la ligne va paser au brun.
Et quand tu tape F5 la ligne va être jaune. pour avancer d'une instruction tu tape F8 et pour aller au point d'arrèt suivant tu tape F5.
2°) Bizzzzard...
Tu a pas des macro automatique dans les module de feuille ?
tu met avant Sheets.. select
Application.EnableEvents = False
et recommence
Ca marche toujours pas !!, mais tu dit pas comment ce sont passer les tests que je t'ai proposés ?
Salut!!
Bha j'ai mis le "application event false" (avec la bonne syntaxe que tu m'avais dit!!
Et là j'ai fais avec d'autres données!!
Et ça se bloque à la cellule 534: il ne veut pas sélectionner la cellule A2!! Il ne veut pas remonter en haut des sous totaux!!!
Comme si la fonction sous totaux l'empêchait de remonter!!
Je comprends pas!!
Bha j'ai mis le "application event false" (avec la bonne syntaxe que tu m'avais dit!!
Et là j'ai fais avec d'autres données!!
Et ça se bloque à la cellule 534: il ne veut pas sélectionner la cellule A2!! Il ne veut pas remonter en haut des sous totaux!!!
Comme si la fonction sous totaux l'empêchait de remonter!!
Je comprends pas!!
bon, puisque tu sait pas mettre un point d'arrèt ont va faire autrement...
audessus de ces ligne tu met Stop, comme le modèle..
La macro va s'arrèter sur ce stop, ensuite tu tape F8 pour le pas à pas, la ligne jaune va probablement changer de secteur ou de ligne, tu verras ainsi ce qui se passe quand tu active ta feuille..
Tu dit..
audessus de ces ligne tu met Stop, comme le modèle..
Stop Sheets("PLANNING").Select Range("A1").Select e = ActiveCell.Address MsgBox ("e:" + e) MsgBox ("Fin de traitement ") MsgBox ("e:" + e)
La macro va s'arrèter sur ce stop, ensuite tu tape F8 pour le pas à pas, la ligne jaune va probablement changer de secteur ou de ligne, tu verras ainsi ce qui se passe quand tu active ta feuille..
Tu dit..
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Et bha non, le "jaune" fait bien le chemin qu'il devrait faire, mais quand il lit Range "A1", il fait son ignorant si bien que la boucle fait bien son boulot au premier tour mais après le curseur reste en bas............
Y aurait-il moyen que je t'envoi ce fichier...
Y aurait-il moyen que je t'envoi ce fichier...
Y aurait-il un rapport avec les propriétés de la feuille??
Dans l'onglet "EnableSelection=>j'ai mis norestriction...mais c'était déjà comme avant!!
Dans l'onglet "EnableSelection=>j'ai mis norestriction...mais c'était déjà comme avant!!
Merci énormément...tu me sauves!!
Je t'envoie ça en fin d'après midi car où je suis je ne peux pas télécharger de logiciels...
Je t'envoie ça en fin d'après midi car où je suis je ne peux pas télécharger de logiciels...
Bon alors je crois que je t'ai transféré ce P..... de fichier... sais pas si faut être connecté pour que ça passe!! tiens moi au courant si tu ne l'as pas...et encore merci...
Salut je vois que mon dernier message n'a pas passé... je ne te vois jamais connecté sur TRANSFERT!
Ce soir? 19h? Sinon, tant que t'es pas connecté...je ne peux pas tefiler le fichier... et comme la journée je ne peux pas aller dessus...
Merci
Ce soir? 19h? Sinon, tant que t'es pas connecté...je ne peux pas tefiler le fichier... et comme la journée je ne peux pas aller dessus...
Merci
Désoler, c'est la 1ère fois que j'essaye le transfert mais gros inconvéniant ont doit êtres connécté tous les deux.
Met le plustôt sur https://www.cjoint.com/
et met le lien dans poste suivant.
Met le plustôt sur https://www.cjoint.com/
et met le lien dans poste suivant.
Voili voilouuuuu !!!
https://www.cjoint.com/?gjtiuq2vcT
J'espère que c'est bien ça...
Merci encore!!
Tiens moi au courant
https://www.cjoint.com/?gjtiuq2vcT
J'espère que c'est bien ça...
Merci encore!!
Tiens moi au courant
Bouuuuuuuuuhh, tu m'a fait souffrir :-DD
Quand j'ai ouvert l'IDE ta macro était ouverte et J'ai bien passer une heure avant que je me rende compte que tu l'avais mise dans un module de feuille,
J'ai laissé toute tes lignes erronées en commentaire pour que tu puisse voir où elles se situaient et les modifs que j'ai fait.
1°) Ont ne met JAMAIS une macro qui fait des appels à diverses feuilles dans un module de feuille, Faut les mettre dans un Module standard.
2°) Ont ne met JAMAIS de On Error Goto quand ont fait un debuguage, sauf si vraiment nécessaire, tu verras j'en ai laissé un mais je l'ai directement annulé après la commande qui peut ne pas fonctionné suivant les circonstances. une macro bien faite doit tourné sans On Error Goto
3°) Tu peu maintenant supprimé le feuille PLANNING2, elle sert plus et évidement toute la partie de la macro qui s'y rapporte.
En principe tout fonctionne.
Tu peu trouver le fichier...
https://www.cjoint.com/?gkciKvUqWA
Bonsoir
Quand j'ai ouvert l'IDE ta macro était ouverte et J'ai bien passer une heure avant que je me rende compte que tu l'avais mise dans un module de feuille,
J'ai laissé toute tes lignes erronées en commentaire pour que tu puisse voir où elles se situaient et les modifs que j'ai fait.
1°) Ont ne met JAMAIS une macro qui fait des appels à diverses feuilles dans un module de feuille, Faut les mettre dans un Module standard.
2°) Ont ne met JAMAIS de On Error Goto quand ont fait un debuguage, sauf si vraiment nécessaire, tu verras j'en ai laissé un mais je l'ai directement annulé après la commande qui peut ne pas fonctionné suivant les circonstances. une macro bien faite doit tourné sans On Error Goto
3°) Tu peu maintenant supprimé le feuille PLANNING2, elle sert plus et évidement toute la partie de la macro qui s'y rapporte.
En principe tout fonctionne.
Tu peu trouver le fichier...
https://www.cjoint.com/?gkciKvUqWA
Bonsoir
Bon alors "point d'arrêt" jsuis pas sûre de savoir ce que c'est,
du coup j'ai mis ça à la fin du code
Sheets("PLANNING").Select
Range("A1").Select
e = ActiveCell.Address
MsgBox ("e:" + e)
MsgBox ("Fin de traitement ")
MsgBox ("e:" + e)
Et dans les deux msgbox j'ai $A$302=> et c'est bien sur cette cellule que je retrouve mon curseur sur la feuille "planning"....
Voili voilouuuu