VBA Excel03 - Création/Extraction classeur

Résolu
Bonjour,

J'utilise du code qui crée un nouveau classeur et me l'enregistre à un endroit spécifié. Cependant, dès que je veux insérer ce code dans ma macro principale, pour importer des données sur ce nouveau classeur, il me débogue la dernière ligne que je vous affiche, il ne trouve pas la feuille (Population) à activer.
En effet, quand je ferme tout et que je réouvre Données_Gironde, les feuilles n'ont pas été renommés. Pourtant, lors du déroulement de la macro, je vois qu'il effectue correctement tous les traitements. C'est quand je réouvre que je m'apperçois qu'il n'a effectivement pas nommé les 5 feuilles.

Quand je veux faire marcher la macro de création à part (c'est à dire tout le code sans les 3 dernières lignes), tout fonctionne bien ... c'est quand je rattache au reste que ça passe pas.

    'On créer l'objet Excel  
    Set xlApp = CreateObject("Excel.Application")  
    'On défini le nombre d'onglets (ici 5)  
    xlApp.SheetsInNewWorkbook = 5  
    'On ajoute un classeur  
    Set xlBook = xlApp.Workbooks.Add  
    'On donne un nom au classeur  
    xlBook.SaveAs ("M:\Léo\Données_Gironde.xls")  
    'On rend le classeur visible  
    xlApp.Visible = True  
    'On créer l'objet onglet dans le nouveau classeur créé  
    Set xlSheet = xlBook.Worksheets(1)  
    'On affecte un nom aux l'onglets  
    xlSheet.Name = "Population"  
    'on libère l'objet onglet pour pouvoir en créer un nouveau ... etc  
    Set xlSheet = Nothing  
    '  
    '  
    Set xlSheet = xlBook.Worksheets(2)  
    xlSheet.Name = "Activité"  
    '  
    '  
    Set xlSheet = xlBook.Worksheets(3)  
    xlSheet.Name = "Famille"  
    '  
    '  
    Set xlSheet = xlBook.Worksheets(4)  
    xlSheet.Name = "Formation"  
    '  
    '  
    Set xlSheet = xlBook.Worksheets(5)  
    xlSheet.Name = "Logement"  
    '  
    '  
    'On remet la propriété de l'application à 3 (par défaut)  
    xlApp.SheetsInNewWorkbook = 3  
    'On ferme l'application  
    'xlApp.Quit  


  Workbooks.Open Filename:="M:\Léo\Données_Gironde.xls"  
  Workbooks.Open Filename:="M:\Léo\Données_Population\BTX_IC_POP_2006.xls"  

  Workbooks("Données_Gironde.xls").Sheets("Population").Activate


Merci d'avance

11 réponses

  • Votes
  • Date
  • Date décroissante
  1. Bonjour,

    Le classeur n'est jamais sauvegardé !!!

    Tu créés un classeur et tu lui donnes un nom. Jusque là, c'est Ok. Si tu fais une modification, il faut sauvegarder les modifs pour qu'elles soient effectives.

    De plus, tu essaies d'ouvrir un classeur déjà ouvert : Workbooks.Open Filename:="M:\Léo\Données_Gironde.xls" !!!

    ;o)
    1. Bonjour Polux,

      Je pensais qu'une fois le fichier créé en dur, toutes les modifs étaient prises en compte ... mais pas quand on crée d'autres objets donc!

      Suite à ta remarque, j'ai essayé d'insérer la sauvegarde en fin de module de création, mais (de la façon dont je le fais ...), il veut rien savoir :

      'On créer l'objet Excel
      Set xlApp = CreateObject("Excel.Application")
      'On défini le nombre d'onglets (ici 5)
      xlApp.SheetsInNewWorkbook = 5
      'On ajoute un classeur
      Set xlBook = xlApp.Workbooks.Add
      'On donne un nom au classeur
      xlBook.SaveAs ("M:\Léo\Données_Gironde.xls")
      'On rend le classeur visible
      xlApp.Visible = True
      'On créer l'objet onglet dans le nouveau classeur créé
      Set xlSheet = xlBook.Worksheets(1)
      'On affecte un nom aux l'onglets
      xlSheet.Name = "Population"
      'on libère l'objet onglet pour pouvoir en créer un nouveau ... etc
      Set xlSheet = Nothing
      '
      '
      Set xlSheet = xlBook.Worksheets(2)
      xlSheet.Name = "Activité"
      '
      '
      Set xlSheet = xlBook.Worksheets(3)
      xlSheet.Name = "Famille"
      '
      '
      Set xlSheet = xlBook.Worksheets(4)
      xlSheet.Name = "Formation"
      '
      '
      Set xlSheet = xlBook.Worksheets(5)
      xlSheet.Name = "Logement"
      '
      '
      'On remet la propriété de l'application à 3 (par défaut)
      xlApp.SheetsInNewWorkbook = 3
      'sauvegarde fichier
      Workbooks(Données_Gironde).Save

      Workbooks.Open Filename:="M:\Léo\Données_Population\BTX_IC_POP_2006.xls"

      Workbooks("Données_Gironde.xls").WorkSheet("Population").Activate

      Si je passe par cette sauvegarde, il me débug la ligne de sauvegarde (indice n'appartient pas à la sélection).
      Quand je tente avec ActiveWorkbook.Save, il me débug la dernière ligne du code plus haut (indice n'appartient pas à la sélection) ... ça voudrait dire que j'agis pas sur Données_Gironde quand je crée mes 5 feuilles!? (pourtant quand je le fais à part, je vois bien les feuilles se créer sur le bon fichier).

      Ca serait pas la méthode de renommage du fichier ( xlBook.SaveAs ("M:\Léo\Données_Gironde.xls") ) qui serait pas top?
      1. Bonjour,

        J'ai testé avec ça et ça fonctionne:

        '......
        'On remet la propriété de l'application à 3 (par défaut)
        xlApp.SheetsInNewWorkbook = 3
        'sauvegarde fichier
        xlBook.Close SaveChanges:=True
        
        Set xlBook = Nothing
        
        Set xlBook = Workbooks.Open("M:\Léo\Données_Gironde.xls")
        Set xlSheet = xlBook.Worksheets("Population")
        
        xlSheet.Activate
        
        Workbooks.Open Filename:="M:\Léo\Données_Population\BTX_IC_POP_2006.xls"


        ;o)
        1. Merci bien Polux encore une fois.

          J'ai du inverser les 2 dernières lignes pour que la suite fonctionne.

          Workbooks.Open Filename:="M:\Léo\Données_Population\BTX_IC_POP_2006.xls"      
          xlSheet.Activate 


          Sinon, en ouvrant l'autre classeur après, il ne considère plus
          xlSheet
          comme actif par la suite, mais une feuille du classeur
          BTX_IC ...


          1) Quelle réflexion t'as mené à faire ces changements?

          2) J'me permets de coller un post que j'avais mis dans le forum Bureautique resté sans réponse. C'est pour avoir un conseil. Si ça à rien à faire ici ou que tu trouves que je profite trop de ta précieuse aide, tu m'dis hein, je reposterai un nouveau sujet ^^'

          .
          .
          .

          J'ai pour l'instant un fichier brut avec en lignes (env. 900) des communes et en colonnes (une 100aine) des variables, ceci sur 5 feuilles. En voici une vue grossière (désolé pour la présentation, il ne garde pas mes espaces) . Pour chaque ville, il peut y avoir plusieurs lignes (correspondant à des quartiers) :

          Villes Var.1 Var.2 Var.3

          Bordeaux 12 13 12
          Bordeaux 9 12 23
          Bordeaux 10 8 9
          Talence 9 2 3
          Talence 10 10 9
          Villenave 8 9 7

          Je dois tout automatiser, donc passer par du codage en VB.

          Mon tableau final devra être l'inverse de mon brut : avoir les communes en colonnes (et arriver à une seule colonne par ville) et les variables en lignes.

          J'ai d'abord essayé d'utiliser simplement la transposition mais Excel ne gère pas autant de données en transposé.

          J'ai pensé à utiliser un tableau croisé dynamique (capable de faire mes 2 souhaits le bougre : transposer et somme par ville!) ... mais le problème est que quand je veux placer les villes en colonnes, le TCD, même s'il supprime les doublons, ne gère pas l'intégralité des villes en colonnes (capacité insuffisante)

          Voila je me demande comment par quelle méthode contourner ces problèmes. Passer par plusieurs TCD à la suite? Uniquement du codage "simple" et conditionnel avec des boucles pour sommer les valeurs par variable de mes villes identiques (ça me fait un peu peur sous VB ...)? Une autre voie (collection?) ... J'suis dans le flou! Quelle est la voie la moins périlleuse?

          Merci d'avance.
          1. Bonjour,

            Content que ça fonctionne.

            1) J'ai simplement ajouter la sauvegarde en utilisant l'objet xlBook déjà créé.
            Quand je manipule plusieurs classeurs, je préfère créer des objets pour les manipuler. En fait j'aurai du te proposer ceci:

            '...... 
            'On remet la propriété de l'application à 3 (par défaut) 
            xlApp.SheetsInNewWorkbook = 3 
            'sauvegarde fichier 
            xlBook.Close SaveChanges:=True 
            
            Set xlBook = Nothing 
            
            Set xlBook = Workbooks.Open("M:\Léo\Données_Gironde.xls") 
            Set xlSheet = xlBook.Worksheets("Population") 
            
            Dim xlBook2 As Workbook 
            Dim xlSheet2 As Worksheet  
            
            Set xlBook2 = Workbooks.open("M:\Léo\Données_Population\BTX_IC_POP_2006.xls") 
            
            Set xlSheet2 = xlBook2.Worksheets("Feuil2") 
            
            


            En faisant comme ça, il n'y a pas besoin de faire xlSheet.Activate. Cette commande ne sert qu'à indiquer sur quelle feuille Excel doit agir.

            2) Je ne comprends bien ce que tu cherches à faire. Peux tu faire passer ton fichier via https://www.cjoint.com/ en indiquant le résultat que tu veux obtenir ?

            ;o)
            «Ce que l'on conçoit bien s'énonce clairement, Et les mots pour le dire arrivent aisément.»
            Nicolas Boileau
            1. T'as 2 feuilles, tableau initial, et début du tableau final que j'veux (sachant qu'en fait ya 5 feuilles, toutes comme la 1ère mais avec des variables différentes, mais sinon memes dispositions) :

              http://www.cijoint.fr/cjlink.php?file=cj201004/cijGJd32Jd.xls
              1. j'espère que ce n'est pas urgent ... je vais avoir besoin d'un peu de temps

                ;o)
            2. Même si j'attends plus ou moins ça pour avancer, ya rien de très urgent.

              Si tu dis ça, ça veut dire que c'est plutôt lourd comme code? Parce qu'à la base je te demande juste de me mettre sur la piste, pas forcément que tu me pondes le code ... mais si c'est assez costaud, j'ai pas les compétences pour le réaliser ...
              1. Oui c'est assez lourd ... ça ne se fait pas avec une simple macro.

                Si j'ai bien interprété, il faut cumuler les données pour chaque ville et pour chaque colonne (critères) pour ensuite les afficher ... plus la mise en forme ...
            3. Oui voila, pour Ambarès :

              12 706(2ème feuille) = 3 875 + 2 827 + 2 696 + 3 308 (1ère feuille)
              435 = 155 + 75 + 89 + 116
              etc...

              Pour chaque ville.

              Tu vas passer par quoi? Une collection?
              1. un tableau ou une collection, je ne sais pas encore. A priori la collection n'est pas utile.

                Mais un problème se présente ... il y a 542 communes et seulement 256 colonnes !!!
            4. Ouais en fait ce problème m'a amené à réfléchir et du coup : changement de programme.

              J'vais bien remettre à plat mon problème, entreprends rien pour l'instant Polux.

              J'te tiens au courant si j'ai besoin de qqchose que j'sais pas faire.

              Merci beaucoup en tout cas.
              1. Ben voila, j'ai déjà de nouveau un "problème".

                Je veux extraire d'un tableau (comme celui que tu as vu sur le fichier joint), des communes spéciales. Sauf que des tableaux bruts il y en a 5, sur 5 feuilles différentes (donc 5 extractions différentes)

                Alors au lieu de faire 5 pavés, pour chaque feuille, j'ai essayé de faire une boucle qui va bien. Sauf que là, l'extraction se fait toujours de la même feuille. Je comprends bien que c'est mon With qui provoque ça, mais il en veut absolument un avec cette structure.

                Voici le fichier (c'est encore le mieux) : http://www.cijoint.fr/cjlink.php?file=cj201004/cijkmnBWeS.xls

                Sub CreationDonneesCUB() 
                
                Dim NbrLig, lig, NumLig As Long 
                NbrLig = 65536 
                Dim feuille As Worksheet 
                Dim i As Integer 
                i = 1 
                
                Workbooks.Open Filename:="M:\Léo\Données_Gironde.xls" 
                
                Workbooks("Données_Gironde.xls").Sheets(i).Activate 
                
                NumLig = 2 
                
                With Workbooks("Données_Gironde.xls").Sheets(i) 
                
                For Each feuille In Worksheets 
                Workbooks("Données_Gironde.xls").Sheets(i).Select 
                Set feuille = Sheets.Add(After:=Sheets(Sheets.Count)) 
                    For lig = 3 To NbrLig 
                    com = .Cells(lig, 2).Value 
                        Select Case com 
                            Case "Ambarès-et-Lagrave", "Ambès", "Artigues-près-Bordeaux", "Bassens", "Bègles", "Blanquefort", "Bordeaux", "Bouliac", "Bruges", "Carbon-Blanc", "Cenon", "Eysines", "Floirac", "Gradignan", "Le Bouscat", "Le Haillan", "Le Taillan-Médoc", "Lormont", "Mérignac", "Parempuyre", "Pessac", "Saint-Aubin-de-Médoc", "Saint-Louis-de-Montferrand", "Saint-Médard-en-Jalles", "Saint-Vincent-de-Paul", "Talence", "Villenave-d'Ornon" 
                                .Cells(lig, 1).EntireRow.Copy 
                                NumLig = NumLig + 1 
                                Cells(NumLig, 1).Select 
                                ActiveSheet.Paste 
                        End Select 
                    Next 
                NumLig = 2 
                i = i + 1 
                Next 
                End With 
                
                
                End Sub
                1. Bonjour,

                  Dans quel fichier se trouve ce code ?

                  Tu devrais créer des objets, ça serait plus clair ...

                  Si j'ai bien compris, tu parcours toutes les feuilles du classeur Données_Gironde.xls

                  Essaie comme ça: /!\ Je n'ai pas testé !!!

                  Sub CreationDonneesCUB() 
                  
                  Dim NbrLig, lig, NumLig As Long 
                  NbrLig = 65536 
                  Dim xlBook As Workbook
                  Dim feuille As Worksheet 
                  Dim ws As Worksheet
                  Dim i As Integer 
                  i = 3
                  
                  Set xlBook = Workbooks.Open Filename:="M:\Léo\Données_Gironde.xls" 
                  
                  NumLig = 2 
                  
                  For Each feuille In xlBook.Worksheets 
                  Set ws = xlBook.Sheets.Add(After:=Sheets(Sheets.Count)) 
                      While feuille.Cells(i, 2).Value <> "" 
                      com = feuille.Cells(i, 2).Value 
                          Select Case com 
                              Case "Ambarès-et-Lagrave", "Ambès", "Artigues-près-Bordeaux", "Bassens", "Bègles", "Blanquefort", "Bordeaux", "Bouliac", "Bruges", "Carbon-Blanc", "Cenon", "Eysines", "Floirac", "Gradignan", "Le Bouscat", "Le Haillan", "Le Taillan-Médoc", "Lormont", "Mérignac", "Parempuyre", "Pessac", "Saint-Aubin-de-Médoc", "Saint-Louis-de-Montferrand", "Saint-Médard-en-Jalles", "Saint-Vincent-de-Paul", "Talence", "Villenave-d'Ornon" 
                                  NumLig = NumLig + 1
                                  feuille.Cells(lig, 1).EntireRow.Copy ws.Cells(NumLig, 1)
                          End Select 
                      Set ws = Nothing
                      Next 
                  NumLig = 2 
                  i = i + 1 
                  Wend
                  
                  End Sub


                  ;o)
              2. Pour ceux qui ont suivi le post où qui rechercheront, je poste la solution à :

                Depuis un fichier étranger1, la création d'un nouveau classeur (et feuilles liées) qui va recevoir des données spécifiques (suivant un critère choisi : ici une liste de villes) provenant d'un fichier étranger2 :

                Option Explicit  
                
                Sub ExtractionDonneesCUB2()  
                
                Dim com As String  
                Dim NbrLig, lig, NumLig As Long  
                Dim feuille As Worksheet  
                Dim I As Integer  
                Dim xlApp As Excel.Application  
                Dim xlBook As Excel.Workbook  
                Dim xlSheet As Excel.Worksheet  
                
                
                    'On crée l'objet Excel  
                    Set xlApp = CreateObject("Excel.Application")  
                    'On défini le nombre d'onglets (ici 5)  
                    xlApp.SheetsInNewWorkbook = 5  
                    'On ajoute un classeur  
                    Set xlBook = xlApp.Workbooks.Add  
                    'On donne un nom au classeur  
                    xlBook.SaveAs ("M:\Léo\Données_CUB2.xls")  
                    'On rend le classeur visible  
                    xlApp.Visible = True  
                    'On créer l'objet onglet dans le nouveau classeur créé  
                    Set xlSheet = xlBook.Worksheets(1)  
                    'On affecte un nom aux l'onglets  
                    xlSheet.Name = "Population"  
                    'on libère l'objet onglet pour pouvoir en créer un nouveau ... etc  
                    Set xlSheet = Nothing  
                    '  
                    '  
                    Set xlSheet = xlBook.Worksheets(2)  
                    xlSheet.Name = "Activité"  
                    Set xlSheet = Nothing  
                    '  
                    '  
                    Set xlSheet = xlBook.Worksheets(3)  
                    xlSheet.Name = "Famille"  
                    Set xlSheet = Nothing  
                    '  
                    '  
                    Set xlSheet = xlBook.Worksheets(4)  
                    xlSheet.Name = "Formation"  
                    Set xlSheet = Nothing  
                    '  
                    '  
                    Set xlSheet = xlBook.Worksheets(5)  
                    xlSheet.Name = "Logement"  
                    Set xlSheet = Nothing  
                    '  
                    '  
                    'On remet la propriété de l'application à 3 (par défaut)  
                    xlApp.SheetsInNewWorkbook = 3  
                    'On sauvegarde le fichier  
                    xlBook.Close SaveChanges:=True  
                    'On libère l'objet classeur  
                    Set xlBook = Nothing  
                
                'on ouvre, dans l'ordre, fichier source, fichier recevant l'extraction  
                Workbooks.Open Filename:="M:\Léo\Données_Gironde.xls"  
                Workbooks.Open Filename:="M:\Léo\Données_CUB2.xls"  
                
                
                Set xlBook = Workbooks("Données_Gironde")  
                
                NumLig = 1  
                
                For I = 1 To 5  'boucle pour opérer sur chaque feuille  
                
                    With xlBook.Sheets(I)   'classeur et feuille source  
                    NbrLig = .Cells(65536, 1).End(xlUp).Row  
                      
                    Workbooks("Données_Gironde.xls").Sheets(I).Range("A1:DZ1").Copy _  
                    Destination:=Workbooks("Données_Gironde.xls").Sheets(I).Range("A1")  
                
                    Workbooks("Données_CUB2.xls").Sheets(I).Select  'feuille recevant les données  
                        For lig = 2 To NbrLig  
                        com = .Cells(lig, 2).Value  
                        Select Case com     'sélection des données à extraire présentes dans la variable com  
                            Case "Ambarès-et-Lagrave", "Ambès", "Artigues-près-Bordeaux", "Bassens", "Bègles", "Blanquefort", "Bordeaux", "Bouliac", "Bruges", "Carbon-Blanc", "Cenon", "Eysines", "Floirac", "Gradignan", "Le Bouscat", "Le Haillan", "Le Taillan-Médoc", "Lormont", "Mérignac", "Parempuyre", "Pessac", "Saint-Aubin-de-Médoc", "Saint-Louis-de-Montferrand", "Saint-Médard-en-Jalles", "Saint-Vincent-de-Paul", "Talence", "Villenave-d'Ornon"  
                                .Cells(lig, 1).EntireRow.Copy  
                                NumLig = NumLig + 1  
                                Cells(NumLig, 1).Select  
                                ActiveSheet.Paste  
                        End Select  
                          
                        Next  
                      
                    NumLig = 1  
                      
                    'on redimensionne les colonnes  
                    Columns("A:DN").EntireColumn.AutoFit  
                    'on se repositionne sur A1  
                    Range("A1").Select  
                      
                    End With  
                      
                Next  
                
                
                Application.CutCopyMode = False  
                Workbooks("Données_Gironde.xls").Close  
                Workbooks("Données_CUB2.xls").Close SaveChanges:=True  
                Application.CutCopyMode = True  
                
                
                End Sub

                Discussions similaires

                etiquette pour dos classeur

                2 réponses