cs_audrey_a
Messages postés2Date d'inscriptionmercredi 6 juin 2007StatutMembreDernière intervention 5 juin 2008
-
5 juin 2008 à 11:15
bigfish_le vrai
Messages postés1835Date d'inscriptionvendredi 13 mai 2005StatutMembreDernière intervention20 novembre 2013
-
5 juin 2008 à 18:26
Bonjour,
Voilà, j'ai un problème que j'ai posé sur un autre forum il y a une semaine...et personne n'arrive à m'aider....
Alors je tente celui-ci ...mon dernier espoir!!
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!!
Option Explicit ' Déclaration obligatoire des variables
'
' Déclaration des variables communes à toutes les procédures
'
Dim DATE_VOYAGE As Date ' Déclaration date voyage
Dim CODE_VOYAGE As String ' Déclaration code voyage
Dim DATE_VOYAGE2 As Date ' Déclaration date voyage
Dim CODE_VOYAGE2 As String ' Déclaration code voyage
Dim LIBELLE_VOYAGE As String ' Déclaration libelle voyage
Dim COUT_RAMASSE As Double ' Déclaration cout ramasse
Dim NB_PALETTE As Integer ' Déclaration Nb palettes
Dim TYPE_VOYAGE As String ' Déclaration type voyage
Dim ZONE ' Déclaration de la zone à trier
Dim e ' Déclaration de la zone à trier
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
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(1, 17), _
Replace:=True, PageBreaks:=False, SummaryBelowData:=False
ActiveSheet.Outline.ShowLevels RowLevels:=2
Selection.SpecialCells(xlCellTypeVisible).Select
Selection.Copy
Sheets("PLANNING").Select
'Duplication de la feuille avec lque les cellules apparentes
'Pour éviter de parcourir une feuille avec des sous totaux
Sheets.Add.Name = "PLANNING2"
ActiveSheet.Paste
Sheets("PLANNING2").Select
Selection.RemoveSubtotal
Range("A2").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
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.Value = NB_PALETTE
ActiveCell.Offset(0, 1).Select ' Décalage d'une cellule vers la droite
ActiveCell.Value = COUT_RAMASSE / NB_PALETTE
ActiveCell.Offset(1, -5).Select ' Passage à la ligne suivante (colonne A)
En fait j'ai créé la feuille planning2 pour faire la sélection sans sous totaux au cas où c'était ça le problème....mais rien à faire....
A la première boucle il est en A1 (alors que je demande A2 et puis après le curseur reste en bas de la feuille planning
(Mais la feuille Ramasse est bien renseignée par la feuille marge)
JM247L
Messages postés443Date d'inscriptionmardi 27 mars 2007StatutMembreDernière intervention 1 mars 20112 5 juin 2008 à 16:25
Houla la la la!
Salut
Bon G pas tout lu (non Freud non plus) mais ta feuille ne serait elle pas en donnée filtré ? Parce que si c'est le cas, la sélection de la ligne de titre ne peut se faire
Cliquer "Réponse Acceptée"<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
cs_audrey_a
Messages postés2Date d'inscriptionmercredi 6 juin 2007StatutMembreDernière intervention 5 juin 2008 5 juin 2008 à 16:48
Non justement...après avoir tout essayé, je me suis dit que c'était mon classeur qui avait un problème, mais j'ai bien regardé dans les propriétés de chaque feuille et c'est paramétré ainsi: EnableSelection XlNoRestriction
.....
bigfish_le vrai
Messages postés1835Date d'inscriptionvendredi 13 mai 2005StatutMembreDernière intervention20 novembre 201314 5 juin 2008 à 18:26
Salut,
si on reprend le bout de code incriminé :
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) <-------- ici on est en A2
ActiveCell.NumberFormat = "dd/mm/yyyy"
ActiveCell.Offset(0, 1).Select <-------- ici on est en B2
CODE_VOYAGE = ActiveCell.Value
ActiveCell.Offset(0, 1).Select <-------- ici on est en C2
LIBELLE_VOYAGE = ActiveCell.Value
ActiveCell.Offset(0, 2).Select <-------- ici on est en E2
TYPE_VOYAGE = ActiveCell.Value
ActiveCell.Offset(0, 4).Select <-------- ici on est en I2 et cette cellule est la derniere cellule active avant la suite
COUT_RAMASSE = Right(ActiveCell.Value, 5)
ActiveCell.NumberFormat = "00,00"
Sheets("MARGE").Select
ActiveCell.Offset(1, -8).Select <-------- ici tu reviens en A2 on ne sait pas pourquoi d'ailleur ???
Application.EnableEvents = False 'pourquoi cette ligne ??? elle ne sert a rien dans ce code !
Stop
Sheets("PLANNING2").Select
Range("A2").Select <---------ici tu selectione A2 et c'est la derniere cellule active avant la suite
d'ailleur cette selection ne sert a rien ! voit la ligne suivante e = ActiveCell.Address remplace cette ligne et la ligne precedente par : e= "A2" ou e= range("A2").Address
MsgBox ("e:" + e) remplace ce signe + par & qui est le signe de concatenation
MsgBox ("Fin de traitement ")
MsgBox ("e:" + e)
MsgBox ("A1:" + ActiveCell.Value) donc ici comment veux-tu recuperer la valeur en A1 alors que la cellule active est A2 ???
donc arrete d'utilisé la fonction offset a tout vas et evite de faire des selctions qui ne serve a rien. Apprend a programer sans le select cela accelera le code et t'evitera de devenir epileptique. J'ai commencer a simplifier ton code. regarde surtout la premiere partie qui fonctionne sans aucune selection
Je te conseil aussi avant d'utiliser le code que j'ai corriger de faire une copie de ton fichier car je ne me suis pas amusé a reconstituer ton fichier pour tester donc je ne suis pas certain que tout fonctionne correctement
Dim DATE_VOYAGE As Date ' Déclaration date voyage
Dim CODE_VOYAGE As String ' Déclaration code voyage
Dim DATE_VOYAGE2 As Date ' Déclaration date voyage
Dim CODE_VOYAGE2 As String ' Déclaration code voyage
Dim LIBELLE_VOYAGE As String ' Déclaration libelle voyage
Dim COUT_RAMASSE As Double ' Déclaration cout ramasse
Dim NB_PALETTE As Integer ' Déclaration Nb palettes
Dim TYPE_VOYAGE As String ' Déclaration type voyage
Dim ZONE As Range ' Déclaration de la zone à trier
Dim e As String ' Déclaration de la zone à trier
Sub ANALYSE_RAMASSE()
' Annulation du filtrage éventuel sur la feuille RAMASSE
On Error Resume Next ' Pour éviter une erreur sur la ligne suivante (erreur si données non filtrées)
Sheets("MARGE").ShowAllData ' Annulation du filtrage
' Suppression du contenu éventuel de la feuille RAMASSE
With Sheets("RAMASSE")
.Cells.Delete ' Suppression de la feuille entière
Range("A1").Value = "Date" ' Stockage libellé Date en cellule active
Range("B1").Value = "Code voyage" ' Stockage libellé Code voyage en cellule active
Range("C1").Value = "Libellé voyage" ' Stockage libellé Libellé voyage en cellule active
Range("D1").Value = "Cout ramasse" ' Stockage libellé Cout ramasse en cellule active
Range("E1").Value = "Nb palette" ' Stockage libellé Nb palette en cellule active
Range("F1").Value = "Coût / palette" ' Stockage libellé Nb palette en cellule active
With Range("A1:F1")
.Interior.ColorIndex = 37
.Font.ColorIndex = 11
.Font.Size = 12
.Font.Bold = True
.HorizontalAlignment = xlCenter
With .Borders 'specifi le format de toute les lignes
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
With .Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
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
End With
'tout fonctione jusqu'ici pour la suite il te faut verifier
Sheets("PLANNING").Select ' Sélection feuille RAMASSE
On Error Resume Next
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
ZONE.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)
ZONE.Subtotal GroupBy:=9, Function:=xlSum, TotalList:=Array(1, 17), _
Replace:=True, PageBreaks:=False, SummaryBelowData:=False
ActiveSheet.Outline.ShowLevels RowLevels:=2
Selection.SpecialCells(xlCellTypeVisible).Select
Selection.Copy
Sheets("PLANNING").Select
'Duplication de la feuille avec lque les cellules apparentes
'Pour éviter de parcourir une feuille avec des sous totaux
Sheets.Add.Name = "PLANNING2"
ActiveSheet.Paste
'Sheets("PLANNING2").Select
On Error Resume Next
Selection.RemoveSubtotal
Range("A2").Select
' Parcours séquentiel de la feuille MARGE et report sur la feuille RAMASSE
Sheets("MARGE").Select ' Sélection feuille MARGE
Do While Range("A2").Value <> ""
With Range("A2")
' Récupération des informations concernant le MARGE
DATE_VOYAGE = Left(.Value, 10) ' Date voyage
.NumberFormat = "dd/mm/yyyy" ' Format date
End With
CODE_VOYAGE = Range("B2").Value ' Code voyage
LIBELLE_VOYAGE = Range("C2").Value ' Libellé voyage
TYPE_VOYAGE = Range("E2").Value
With Range("I2")
COUT_RAMASSE = Right(.Value, 5) ' Cout ramasse
.NumberFormat = "00,00" ' Format du coût
End With
If Left(CODE_VOYAGE, 2) >= 0 And Left(CODE_VOYAGE, 2) <= 99 And Right(CODE_VOYAGE, 2) <> "RA" Then
'ActiveCell.Offset(1, -8).Select
Application.EnableEvents = False
'Stop
Sheets("PLANNING2").Select
e = Range("A2").Address
MsgBox "e:" & e
MsgBox "Fin de traitement "
MsgBox "e:" & e
MsgBox "A1:" & Range("A2").Value
NB_PALETTE = 0
Range("A2").Select 'j'ai rajouté cette ligne pour que la suite fonctione car je n'est le plus le courage de continuer
Do While ActiveCell.Value <> "" If Left(ActiveCell.Value, 10) DATE_VOYAGE And Right(ActiveCell.Offset(0, 8), 6) CODE_VOYAGE Then
' Récupération des informations concernant le MARGE
DATE_VOYAGE2 = Left(ActiveCell.Value, 10) ' Date voyage
ActiveCell.NumberFormat = "dd/mm/yyyy" ' Format date
MsgBox ("Date voyage : " + Str(DATE_VOYAGE2))
CODE_VOYAGE2 = Right(ActiveCell.Offset(0, 8), 6) ' Code voyage
MsgBox ("Code voyage 2 : " + CODE_VOYAGE2)
NB_PALETTE = NB_PALETTE + ActiveCell.Offset(0, 16).Value ' Libellé voyage
MsgBox ("NB PALETTE : " + Str(NB_PALETTE))
ActiveCell.Offset(1, 0).Select
Else
ActiveCell.Offset(1, 0).Select
End If
Loop
' 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.Value = NB_PALETTE
ActiveCell.Offset(0, 1).Select ' Décalage d'une cellule vers la droite
ActiveCell.Value = COUT_RAMASSE / NB_PALETTE
ActiveCell.Offset(1, -5).Select ' Passage à la ligne suivante (colonne A)
Else
ActiveCell.Offset(1, -8).Select
End If
ActiveCell.Offset(1, -8).Select
Sheets("MARGE").Select
Range("A1").Select
Loop
End Sub
Voila si tu me trouves un peut dure dans le text c'est volontaire mais je ne suis pas faché. J'ai quand meme pas mal passé de temps a dechifré ton code et crois moi ça na pas ete une partie de plaisir.