VBA Excel03 - Création/Extraction classeur

Résolu/Fermé
Palteza Messages postés 79 Date d'inscription mercredi 2 décembre 2009 Statut Membre Dernière intervention 6 septembre 2014 - Modifié par Palteza le 20/04/2010 à 15:21
Palteza Messages postés 79 Date d'inscription mercredi 2 décembre 2009 Statut Membre Dernière intervention 6 septembre 2014 - 20 avril 2010 à 14:35
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


A voir également:

11 réponses

Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
13 avril 2010 à 17:08
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
Palteza Messages postés 79 Date d'inscription mercredi 2 décembre 2009 Statut Membre Dernière intervention 6 septembre 2014 3
Modifié par Palteza le 14/04/2010 à 10:41
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
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
14 avril 2010 à 12:33
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
Palteza Messages postés 79 Date d'inscription mercredi 2 décembre 2009 Statut Membre Dernière intervention 6 septembre 2014 3
Modifié par Palteza le 14/04/2010 à 16:38
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
Modifié par Polux31 le 15/04/2010 à 11:11
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
Palteza Messages postés 79 Date d'inscription mercredi 2 décembre 2009 Statut Membre Dernière intervention 6 septembre 2014 3
Modifié par Palteza le 15/04/2010 à 13:58
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
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
15 avril 2010 à 15:39
j'espère que ce n'est pas urgent ... je vais avoir besoin d'un peu de temps

;o)
0
Palteza Messages postés 79 Date d'inscription mercredi 2 décembre 2009 Statut Membre Dernière intervention 6 septembre 2014 3
15 avril 2010 à 15:48
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
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
15 avril 2010 à 15:55
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
Palteza Messages postés 79 Date d'inscription mercredi 2 décembre 2009 Statut Membre Dernière intervention 6 septembre 2014 3
15 avril 2010 à 16:22
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
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
15 avril 2010 à 16:36
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
Palteza Messages postés 79 Date d'inscription mercredi 2 décembre 2009 Statut Membre Dernière intervention 6 septembre 2014 3
16 avril 2010 à 10:04
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
Palteza Messages postés 79 Date d'inscription mercredi 2 décembre 2009 Statut Membre Dernière intervention 6 septembre 2014 3
Modifié par Palteza le 16/04/2010 à 10:23
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
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
16 avril 2010 à 11:15
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
Palteza Messages postés 79 Date d'inscription mercredi 2 décembre 2009 Statut Membre Dernière intervention 6 septembre 2014 3
Modifié par Palteza le 20/04/2010 à 16:36
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