IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Excel Discussion :

Copie d'une feuille dans un nouveau classeur [XL-2003]


Sujet :

Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 67
    Points : 50
    Points
    50
    Par défaut Copie d'une feuille dans un nouveau classeur
    Bonjour,

    J'expose mon projet avant d'exposer le soucis. Je cherche à alimenter une base de donnée mysql à partir d'un fichier excel (on appellera ce fichier le fichier A). Pour cela j'ai choisi d'utiliser un fichier excel intermédiaire (on appellera ce fichier B). Donc dans un premier temps je voudrais faire une copie de A dans B. Une fois copié je voudrais supprimer certaines colonnes qui ne m'interessent pas dans B.Ensuite le fichier B sera enregistré au format CSV pour finalement être importé dans ma BDD mysql.
    1ère question : Est-ce que tout ça vous semble réalisable par macro excel ?

    Voila les quelques lignes de code que j'ai pour le moment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    Private Sub CommandButton1_Click()
    Dim xlApp As Excel.Application
    Dim xlBook As Excel.Workbook
    Dim xlSheet As Excel.Worksheet
    Dim classeur As Workbook
     
        'On créer l'objet Excel
        Set xlApp = CreateObject("Excel.Application")
        'On défini le nombre d'onglets
        xlApp.SheetsInNewWorkbook = 1
        'On ajoute un classeur
        Set xlBook = xlApp.Workbooks.Add
        '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 = "test"
        'on libère l'objet onglet pour pouvoir en créer un nouveau ... etc
        Set xlSheet = Nothing
        'On remet la propriété de l'application à 3 (par défaut)
        xlApp.SheetsInNewWorkbook = 3
        'Sauvegarde au format csv
        xlBook.SaveAs ("L:/Mon Classeur.csv")
        'On ferme l'application
        xlApp.Quit
        'On re-ouvre le nouveau classeur
        Set classeur = Workbooks.Open("L:\Mon Classeur.csv")
        'On copie dans le nouveau classeur
        ThisWorkbook.Sheets(1).Copy After:=classeur.Sheets(classeur.Sheets.Count)
        'Sauvegarde
        xlBook.save
        'xlBook.SaveAs ("L:/Mon Classeur.csv")
        'On ferme l'application
        xlApp.Quit
     
    End Sub
    Le soucis c'est que lorsque j'arrive à la ligne xlBook.save le message d'erreur suivant apparait "Erreur d’exécution '-2147417848(80010108)': Erreur Automation. L'objet invoqué s'est déconnecté de ses clients." Puis quelques secondes plus tard une fenêtre d'avertissement apparait sur le fichier B avec le message : "Mon Classeur.csv est à présent disponible pour modification. Ouvrez le fichier en lecture-écriture pour le modifier" et deux options me sont proposées: Lecture-écriture ou Annuler.

    Je ne vois pas bien tout ce que cela peut vouloir dire...

    Merci d'avance pour votre aide éventuelle.

  2. #2
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Je n'ai pas encore lu tout ton code mais une première remarque me vient en lisant le début.
    S'il s'agit d'une macro VBA sous Excel, le CreateObject("Excel.Application") n'est d'aucune utilité.

    Par exemple, tu peux créer un nouveau classeur avec un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set xlBook = Workbooks.Add
    Il y a peu de chances que ça résolve ton problème mais ça le rendra plus simple et lisible.

    'On remet la propriété de l'application à 3 (par défaut)
    xlApp.SheetsInNewWorkbook = 3
    Perso, je n'en vois pas l'intérêt. Question de goût mais pour moi, un seul onglet pour un nouveau classeur c'est largement suffisant quand la création d'un nouvel onglet ne demande qu'un seul clic (mais que la suppression des deux onglets surnuméraires demandent au moins 5 clics).

    A mon avis, le problème est ta façon de supprimer l'onglet vide de départ et en plus d'essayer d'enregistrer derrière.
    Excel n'apprécie pas trop les classeurs vides.
    Un conseil : l'onglet 1, tu le laisses en place tant que tu n'as ajouté l'onglet avec tes données. Tu auras tout le temps de le supprimer ensuite avec un simple Worksheets(1).Delete .

    Autre détail : ce n'est pas parce que tu mets ".CSV" à la fin du nom de fichier qu'il va s'enregistrer sous ce format.
    Pour ça, il faut faire un SaveAs avec comme paramètre FileFormat:=xlCSV

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 67
    Points : 50
    Points
    50
    Par défaut
    Merci encore pour ton aide Menhir,

    J'ai pas mal simplifié le code et voila ce a quoi j'ai abouti :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Private Sub CommandButton1_Click()
    Dim xlBook As Excel.Workbook
    Dim classeur As Workbook
     
     
        'On ajoute un classeur
        Set xlBook = Workbooks.Add
     
        'Sauvegarde au format csv
        xlBook.SaveAs ("L:/Mon Classeur.csv")
     
        'On ferme l'application
        xlBook.Close
     
        'On re-ouvre le nouveau classeur
        Set classeur = Workbooks.Open("L:\Mon Classeur.csv")
     
        'On copie dans le nouveau classeur
        ThisWorkbook.Sheets(1).Copy classeur.Sheets("feuil1")
     
        'Sauvegarde
        xlBook.save
        'xlBook.SaveAs ("L:/Mon Classeur.csv")
     
        'On ferme l'application
        xlApp.Quit
     
    End Sub
    La ligne ThisWorkbook.Sheets(1).Copy classeur.Sheets("feuil1") créee un nouvel onglet avant la feuille 1 pour faire la copie alors que je souhaiterais que cette copie soit faite dans la feuille1. Mais ce n'est pas un problème majeur, au pire je supprimerai tous les onglets qui ne me servent à rien à la fin.
    Cependant l'erreur expliquée dans mon message précédent persiste. J'ai remarqué que le 's' de save ne se met pas automatiquement en majuscule alors que VBA le fait habituellement avec les fonctions qu'il reconnait. Pourtant il me semble que la fonction save s'applique bien aux objets de type 'workbook'... Je sèche.

    Merci pour votre aide

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 940
    Points : 28 938
    Points
    28 938
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Plutôt que de créer un nouveau classeur et ensuite copier la feuille d'un classeur sur ce nouveau classeur et supprimer les feuilles inutiles, cette ligne suffit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThisWorkbook.Sheets(1).Copy
    Si la feuille à copier n'est pas sur le classeur où se trouve le code VBA et que le classeur se nomme "Toto.Xls"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Workbooks("Toto.xls").Sheets(1).Copy

  5. #5
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par magikmed Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Set xlBook = Workbooks.Add
        'Sauvegarde au format csv
        xlBook.SaveAs ("L:/Mon Classeur.csv")
    Comme expliqué dans mon précédent message, ceci ne marche pas : ce n'est pas l'extension (".csv") qui fixe le format d'un fichier. L'extension n'est qu'un indicateur de ce format.
    Pour que ça enregistre vraiment en CSV, il faut indiquer le format dans ta méthode SaveAs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xlBook.SaveAs Filename:="L:/Mon Classeur.csv",  FileFormat:=xlCSV
    Autre conseil : évite de créer des variables dont le nom commence par "xl" car beaucoup de variables system commencent comme ça. Il peut donc y avoir incompatibilité.

    La ligne ThisWorkbook.Sheets(1).Copy classeur.Sheets("feuil1") créee un nouvel onglet avant la feuille 1 pour faire la copie alors que je souhaiterais que cette copie soit faite dans la feuille1.
    Ce que tu décris est possible mais je ne suis pas sûr que ce soit une bonne option.
    Il est bien plus simple de copier un onglet complet puis de supprimer l'autre onglet vide plutôt que de copier le contenu avec les problème de recherche de limites que cela comporte.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        'On ferme l'application
        xlBook.Close
     
        'On re-ouvre le nouveau classeur
        Set classeur = Workbooks.Open("L:\Mon Classeur.csv")
    Je ne comprends pas pourquoi tu fermes ton classeur pour l'ouvrir immédiatement après....


    J'ai compris d'où viens ton problème.
    Tu fermes le classeur sur lequel pointe la variable xlBook avec un close. Donc, ton xlBook ne pointe plus sur rien.
    Quand tu l'ouvre, juste après, tu utilises une autre variable (classeur) pour le pointer.
    Ensuite, tu fais la sauvegarde en utilisant ta première variable qui ne pointe plus sur rien.
    Remplace xlBook par classeur (de préférence sur l'ensemble de ton code) et ça marchera (en tenant compte des mofifs que je t'ai conseillé avant).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub CommandButton1_Click()
    Dim classeur As Workbook
     
        Set classzeur = Workbooks.Add
        classeur.Worksheets(1).Name = "XXX"
        ThisWorkbook.Sheets(1).Copy classeur.Sheets("feuil1")
        classeur.Worksheets("XXX").Delete
        xlBook.SaveAs Filename:="L:/Mon Classeur.csv",  FileFormat:=xlCSV
     
    End Sub
    Evite aussi les Quit dans le code.
    Imagine que la personne qui l'utilise ait un autre fichier d'ouvert non sauvegardé, tu peux lui faire perdre des heures de travail.

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 67
    Points : 50
    Points
    50
    Par défaut
    Merci beaucoup pour tous ces conseils, j'en ai encore appris beaucoup aujourd'hui...

    Je fais toutes ces modifs et poursuis mon projet. Vous entendrez peut être parler de moi de nouveau pour l'export des données dans ma BDD. Pour ce qui est de la copie et du tri des infos je devrais pouvoir me débrouiller avec vos conseils.

    Au top !

    Merci encore, je met le sujet en résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VBA][Excel]Copier une feuille dans un nouveau classeur
    Par illight dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 02/10/2020, 12h51
  2. [XL-2010] Copier une feuille dans un nouveau classeur
    Par Rob's dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 18/12/2013, 16h16
  3. [XL-2007] Insérer une feuille dans un nouveau classeur
    Par MANOU06 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 13/02/2011, 20h32
  4. Réponses: 2
    Dernier message: 15/02/2008, 09h24
  5. [VBA-E] Copie par valeur d'une feuille dans un nouveau classeur
    Par MatMeuh dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 17/05/2006, 22h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo