Problème sélection cellule VBA

cs_audrey_a Messages postés 2 Date d'inscription mercredi 6 juin 2007 Statut Membre Dernière intervention 5 juin 2008 - 5 juin 2008 à 11:15
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 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
   
   
    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(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
               
                         
                 Sheets("MARGE").Select
                 ActiveCell.Offset(1, -8).Select
                 Application.EnableEvents = False
                 Stop
                 Sheets("PLANNING2").Select
                 Range("A2").Select
                 e = ActiveCell.Address
                 MsgBox ("e:" + e)
                 MsgBox ("Fin de traitement ")
                 MsgBox ("e:" + e)
                 MsgBox ("A1:" + ActiveCell.Value)
                
                 NB_PALETTE = 0
                 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
    Sheets("MARGE").Select
    Range("A1").Select
                                    
   


End Sub

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)

Help !!!!!!!! Je vais péter un cable!!!

Merci par avance!!!!

3 réponses

JM247L Messages postés 443 Date d'inscription mardi 27 mars 2007 Statut Membre Dernière intervention 1 mars 2011 2
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" /??>

Partageons Notre Savoir & Nos Acquis - JML

0
cs_audrey_a Messages postés 2 Date d'inscription mercredi 6 juin 2007 Statut Membre Derniè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
.....
0
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
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.

A+
0
Rejoignez-nous