VBA Excel03 - Création/Extraction classeur

Résolu
Palteza Messages postés 82 Statut Membre -  
Palteza Messages postés 82 Statut Membre -
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

  1. Polux31 Messages postés 7219 Statut Membre 1 204
     
    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)
    0
  2. Palteza Messages postés 82 Statut Membre 3
     
    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?
    0
  3. Polux31 Messages postés 7219 Statut Membre 1 204
     
    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)
    0
  4. Palteza Messages postés 82 Statut Membre 3
     
    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.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Polux31 Messages postés 7219 Statut Membre 1 204
     
    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
    0
  7. Palteza Messages postés 82 Statut Membre 3
     
    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
    0
    1. Polux31 Messages postés 7219 Statut Membre 1 204
       
      j'espère que ce n'est pas urgent ... je vais avoir besoin d'un peu de temps

      ;o)
      0
  8. Palteza Messages postés 82 Statut Membre 3
     
    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 ...
    0
    1. Polux31 Messages postés 7219 Statut Membre 1 204
       
      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 ...
      0
  9. Palteza Messages postés 82 Statut Membre 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?
    0
    1. Polux31 Messages postés 7219 Statut Membre 1 204
       
      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 !!!
      0
  10. Palteza Messages postés 82 Statut Membre 3
     
    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.
    0
  11. Palteza Messages postés 82 Statut Membre 3
     
    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
    0
    1. Polux31 Messages postés 7219 Statut Membre 1 204
       
      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)
      0
  12. Palteza Messages postés 82 Statut Membre 3
     
    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
    0