VBA Excel03 - Création/Extraction classeur
Résolu
Palteza
Messages postés
79
Date d'inscription
Statut
Membre
Dernière intervention
-
Palteza Messages postés 79 Date d'inscription Statut Membre Dernière intervention -
Palteza Messages postés 79 Date d'inscription Statut Membre Dernière intervention -
A voir également:
- VBA Excel03 - Création/Extraction classeur
- Creation compte gmail - Guide
- Création site web - Guide
- Media creation tool - Télécharger - Systèmes d'exploitation
- Création compte google - Guide
- Creation compte vinted - Guide
11 réponses
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)
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)
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?
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?
Bonjour,
J'ai testé avec ça et ça fonctionne:
;o)
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)
Merci bien Polux encore une fois.
J'ai du inverser les 2 dernières lignes pour que la suite fonctionne.
Sinon, en ouvrant l'autre classeur après, il ne considère plus
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.
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
xlSheetcomme 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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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:
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
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
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
http://www.cijoint.fr/cjlink.php?file=cj201004/cijGJd32Jd.xls
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 ...
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 ...
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?
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?
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.
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.
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
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
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é !!!
;o)
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)
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 :
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