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

Macros et VBA Excel Discussion :

Problème d'importation de fichier Excel par macro


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Par défaut Problème d'importation de fichier Excel par macro
    Bonjour,

    j'ai fait une macro qui me permettrait de copier un fichier sélectionné sur le disque directement à une feuille de calcul en l'appliquant à un bouton de commande, je rencontre trois difficultés :

    1 - une boîte de dialogue apparaît pour demander à l'utilisateur de sélectionner le fichier, je ne sais pas comment utiliser le fichier directement sans passer par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Dialogs(xlDialogOpen).Show(Chemin & "Export tempo\réseau en cours.xl*")
    J'aimerais que les données soient importées directement sans demander d'ouvrir le fichier. Est ce que c'est possible ?

    2-Après avoir sélectionné le fichier, une boîte de dialogue apparaît pour gérer l'import (choisir le format, le séparateur des colonnes), j'aimerais éviter cela.

    3-La macro n'importe pas correctement le format de date, les dates ne sont plus toutes regroupées par année, du coup cela me fausse le filtre sur la date, c'est le plus embêtant !

    Pourriez vous m'aider svp ?

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    'DestBook = classeur de dstination et SourceBook=classeur source
     
    Dim DestBook As Workbook, SourceBook As Workbook
    Dim DestCell As Range
    Dim RetVal As Boolean
    Dim Chemin As String
     
    ' désactiver le rafraichissement de l'écran avant la macro
    Application.ScreenUpdating = False
     
    'chemin en relatif du dossier ou se trouve tes données
    Chemin = "C:\"
     
    ' Set object variables for the active book and active cell.
    Set DestBook = ActiveWorkbook
    Range(Range("A1"), Range("A1").SpecialCells(xlLastCell)).ClearContents
    Range(Range("A1"), Range("A1").SpecialCells(xlLastCell)).ClearFormats
    Set DestCell = Range("A1") 'active la cellule où j'aimerais copier les données
     
    'Ouvre la boîte de dialogue
    RetVal = Application.Dialogs(xlDialogOpen).Show(Chemin & "Export tempo\réseau en cours.xl*")
     
     
    ' If Retval is false (Open dialog canceled), exit the procedure.
    If RetVal = False Then Exit Sub
     
    ' active le classeur à partir duquel copier les données
    Set SourceBook = ActiveWorkbook
     
    ' copie entièrement la feuille de calcul
    Range(Range("A1"), Range("A1").SpecialCells(xlLastCell)).Copy
     
    ' Active la feuille de destination et une cellule de cette feuille
    DestBook.Activate
    DestCell.Activate
    ActiveSheet.Paste
    'colle les formats et les valeurs des cellules
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:= _
          xlNone, SkipBlanks:=False, Transpose:=False
    Selection.PasteSpecial Paste:=xlPasteFormats, Operation:= _
          xlNone, SkipBlanks:=False, Transpose:=False
          Application.CutCopyMode = False
    SourceBook.Close False
     
    Application.ScreenUpdating = True
    Application.DisplayAlerts = False
    ActiveSheet.Name = "en cours liste complète réseau"
    ' Ferme le classeur contenant les données à copiée
    Merci d'avance pour votre aide

  2. #2
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 871
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    a ta question 1
    si tu veux recuperer les données sans ouvrir va voir
    http://silkyroad.developpez.com/VBA/ClasseursFermes/


    Question 2
    Tes fichiers sont de quels type ?

    Question 3
    Pour bien comprendre comment on gère des dates

    http://didier-gonard.developpez.com/...-excel-et-vba/

    je pense que cela va t'aider

    A+

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Par défaut
    Merci pour ta réponse, ce n'est pas une question de gestion de dates là, j'ai bien lu ce tutoriel pour mes filtres sur les dates. Lorsque j'importe le fichier tout simplement, il ne me copie pas les dates correctement, je pense plus que c'est un problème de collage de format ou un truc du genre.

    Cordialement

  4. #4
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 871
    Billets dans le blog
    1
    Par défaut
    Question 2
    Tes fichiers sont de quels type ?
    quand tu dis : " il ne me copie pas les dates correctement" peux dire ce qu'il te ramènes ?

    donne un exemple au besoin

    A+

  5. #5
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    il y a une raison t'ayant amené à faire un Collage Spécial plutôt qu'une copie simple ?

  6. #6
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Par défaut
    Citation Envoyé par Igloobel Voir le message
    quand tu dis : " il ne me copie pas les dates correctement" peux dire ce qu'il te ramène ?

    donne un exemple au besoin

    A+
    Bonjour,

    Il me copie certaines dates avec le bon "format" et certaines avec le format texte, j'ai un peu triché en faisant cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    'copie les valeurs et les formats des cellules
    Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
        xlNone, SkipBlanks:=False, Transpose:=False
     
    'copie le format de la feuille
    Selection.PasteSpecial Paste:=xlPasteFormats, Operation:= _
          xlNone, SkipBlanks:=False, Transpose:=False
          Application.CutCopyMode = False
    SourceBook.Close False
    Je me disais qu'il y avait un moyen d'avoir les deux sans séparer ! Quelqu'un en serait plus sur le 1 ? J'aimerais éviter de passer par les bases de données !

    Merci d'avance

    Citation Envoyé par joe.levrai Voir le message
    Bonjour,

    il y a une raison t'ayant amené à faire un Collage Spécial plutôt qu'une copie simple ?
    OUI ! Au départ, j'avais fait avec l'enregistreur de macros une copie d'une feuille que j'ouvrais et dont je collais les données dans ma feuille active, et j'ai juste adapté le code après mais je me suis rendu compte que tout n'était pas vraiment fait comme je voulais, il y avait le problème du format de la feuille et du format de certaines dates qui devenaient des textes !

  7. #7
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    J'ai pris un fichier vierge

    j'ai écrit "01/01/2015" dans une cellule

    j'ai passé ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub ioi()
    ActiveCell.Copy ActiveCell.Offset(0, 1)
    End Sub
    j'ai bien ma date conservée en format date dans la cellule qui reçoit la copie


    Si le problème est que ta date passe en format texte, tu peux tout simplement, après copie, formater ta cellule, au moyen de la propriété NumberFormat



    Pour ta question 1, c'est quoi le problème exact ? Tu veux que l'utilisateur n'ai pas à sélectionner le fichier et que tout se fasse seul ?
    Si tu connais le nom du fichier, ce n'est pas un problème, utilise la méthode Workbooks.Open pour faire l'ouverture
    Tu peux même rendre ceci transparent en désactivant le rafraichissement de l'écran, Propriété ScreenUpdating

    si c'est pas ça le problème, et que tu souhaites que le fichier ne soit tout simplement pas ouvert, Igloobel t'a donné le tutoriel adéquat pour lire un fichier fermé.

  8. #8
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Par défaut
    Merci pour votre réponse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub ioi()
    ActiveCell.Copy ActiveCell.Offset(0, 1)
    End Sub
    A quoi sert le offset ? Quel est son rôle ? J'aurais tout de même besoin de faire un collage spécial après pour récupérer les formats de la feuille, je veux dire le remplissage des cellules et tout !

    Et lorsque j'utilise workbooks.open, je copie les données et je souhaiterais refermer le classeur après avoir copier les données dans le fichiers de destinations. Mais ça bug !

    si c'est pas ça le problème, et que tu souhaites que le fichier ne soit tout simplement pas ouvert, Igloobel t'a donné le tutoriel adéquat pour lire un fichier fermé.
    Je rencontre un problème lorsque j'utilise le tutoriel que m'a présenté Igloobel :

    Message d'erreur « Type Défini par l'utilisateur non défini » à l'aide de DAO
    J'ai faire des recherches sur Internet

    https://support.microsoft.com/fr-fr/kb/145759

    mais les différents solutions proposées ne fonctionnent pas, je n'arrive pas à faire ce qui a été dit ! Aussi, j'ai laissé tomber l'idée !

    Cordialement

    Pour ta question 1, c'est quoi le problème exact ? Tu veux que l'utilisateur n'ai pas à sélectionner le fichier et que tout se fasse seul ?
    Si tu connais le nom du fichier, ce n'est pas un problème, utilise la méthode Workbooks.Open pour faire l'ouverture
    Lorsque j'ouvre le classeur pour copier les données, j'aimerais bien qu'il se referme après que les données aient été copiées, j'ai modifié mon code comme suit mais cela ne fonctionne pas :

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    Sub Import_ContratsResponsablesTempo()
     
    'DestBook = classeur de dstination et SourceBook=classeur source
     
    Dim DestBook As Workbook, SourceBook As Workbook
    Dim DestCell As Range
    'Dim RetVal As Boolean
     
    ' désactiver le rafraichissement de l'écran avant la macro
    Application.ScreenUpdating = False
     
    'chemin en relatif du dossier ou se trouve tes données
     
    ' Set object variables for the active book and active cell.
    Set DestBook = ActiveWorkbook
    Range(Range("A1"), Range("A1").SpecialCells(xlLastCell)).ClearContents
    Range(Range("A1"), Range("A1").SpecialCells(xlLastCell)).ClearFormats
    Set DestCell = Range("A1") 'active la cellule où j'aimerais copier les données
     
    'Ouvre la boîte de dialogue
    'RetVal = Application.Dialogs(xlDialogOpen).Show("C:\Export Données\réseau sans suite.xl*")
    'Ouvre le fichier
    Workbooks.Open("C:\Export Données\réseau sans suite.xls")
     
     
    ' If Retval is false (Open dialog canceled), exit the procedure.
    'If RetVal = False Then Exit Sub
     
    ' active le classeur à partir duquel copier les données
    Set SourceBook = ActiveWorkbook
     
    ' copie entièrement la feuille de calcul
    Range(Range("A1"), Range("A1").SpecialCells(xlLastCell)).Copy
     
     
    ' Active la feuille de destination et une cellule de cette feuille
    DestBook.Activate
    DestCell.Activate
     
    'colle les formats et les valeurs des cellules
    Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
        xlNone, SkipBlanks:=False, Transpose:=False
    Selection.PasteSpecial Paste:=xlPasteFormats, Operation:= _
          xlNone, SkipBlanks:=False, Transpose:=False
          Application.CutCopyMode = False
     
    'SourceBook.Close False
    Workbooks("C:\Export Données\réseau sans suite.xls").Close
     
    Application.ScreenUpdating = True
    Application.DisplayAlerts = False
    ActiveSheet.Name = "contrats resp. tarifé tempo"
    ' Close the book containing the text file.
     
    End Sub

  9. #9
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 871
    Billets dans le blog
    1
    Par défaut
    tu répond enfin a ma question2 que je t'ai posé dès mon premier post a savoir : c'est quoi le type de fichier
    et au vu du code fourni dans ton dernier post j'en déduit que c'est un classeur Excel et pas comme je le croyais au début un fichier texte.

    donc il n'y a pas de raison que la date ne t'arrive pas au format date

    peux-tu me donner un exemple concret de ce qui se passe en m'expliquant "pas à pas" ta demarche comme si j'avais 2 ans car j'ai vraiment du mal à visualiser ton problème de date.

    A+

  10. #10
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Et essaye de mettre un peu de rigueur dans ton code, quand on manipule des Range ou des Cells, on spécifie la feuille dans laquelle ils se situent

  11. #11
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut


    Bonjour, bonjour !

    Si la feuille source a été bien conçue, c'est à dire les dates au format Date (voire même Standard), aucun souci …

    Par contre si les dates n'en sont pas, les cellules au format texte, il est vital alors de penser à formater
    aussi en texte les cellules de destination avant toute opération de recopie …

    Autre astuce : utiliser sur la source la fonction Convertir du menu données, avec son assistant, à la portée d'un débutant !

    _____________________________________________________________________________________________________
    Je suis Charlie, Bardo, Sousse

  12. #12
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Par défaut
    Citation Envoyé par joe.levrai Voir le message
    Et essaye de mettre un peu de rigueur dans ton code, quand on manipule des Range ou des Cells, on spécifie la feuille dans laquelle ils se situent
    Je les spécifie en utilisant DestBook qui est le classeur de réception des données et en utilisant SourceBook qui est le classeur qui contient les données ! J'active SourceBook lorsque je copie les données et active le DestBook lorsque je veux effacer la feuille et coller les données !

    Par ailleurs, peut-on ouvrir les classeurs, copier les données et le refermer ? J'ai essayé dans mon code de jouer avec Workbooks.open() et Workbooks.close(), j'ai aussi consulté l'aide en ligne de vba, je parviens à un résultat mais pas vraiment ce que je veux, la macro ouvre le classeur copier les données et "ERREUR".

    Je veux procéder ainsi parce que s'il faut à chaque fois que l'utilisateur aille cherche le fichier, le travail reste un peu manuel en core !

    Je n'arrive pas à passer par les connexions, je n'arrive pas à activer la bibliothèque ADO, est ce parce que je ne suis pas administrateur ou autre ?

    Merci !

    Citation Envoyé par Igloobel Voir le message
    tu répond enfin a ma question2 que je t'ai posé dès mon premier post a savoir : c'est quoi le type de fichier
    et au vu du code fourni dans ton dernier post j'en déduit que c'est un classeur Excel et pas comme je le croyais au début un fichier texte.

    donc il n'y a pas de raison que la date ne t'arrive pas au format date

    peux-tu me donner un exemple concret de ce qui se passe en m'expliquant "pas à pas" ta demarche comme si j'avais 2 ans car j'ai vraiment du mal à visualiser ton problème de date.

    A+
    Bonjour,

    Je ne sais vraiment pas quoi dire parce que la copie se fait correctement maintenant juste avec ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:= _
        xlNone, SkipBlanks:=False, Transpose:=False
    alors qu'avant-hier, il m'a fallu ajouter ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:= _
        xlNone, SkipBlanks:=False, Transpose:=False
    Selection.PasteSpecial Paste:=xlPasteFormats, Operation:= _
          xlNone, SkipBlanks:=False, Transpose:=False
          Application.CutCopyMode = False

  13. #13
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par aziz1015 Voir le message
    Je les spécifie en utilisant DestBook qui est le classeur de réception des données et en utilisant SourceBook qui est le classeur qui contient les données ! J'active SourceBook lorsque je copie les données et active le DestBook lorsque je veux effacer la feuille et coller les données !

    Tu n'as pas compris ma remarque.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Workbooks.Open("C:\Export Données\réseau sans suite.xls")
     
     
    ' If Retval is false (Open dialog canceled), exit the procedure.
    'If RetVal = False Then Exit Sub
     
    ' active le classeur à partir duquel copier les données
    Set SourceBook = ActiveWorkbook
     
    ' copie entièrement la feuille de calcul
    Range(Range("A1"), Range("A1").SpecialCells(xlLastCell)).Copy
    tu ouvres un classeur
    tu met un pointeur sur le classeur : SourceBook
    ensuite, tu copie une plage située dans la feuille active car tu ne spécifie pas à quelle feuille se rapporte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range(Range("A1"), Range("A1").SpecialCells(xlLastCell)).Copy
    Il est fort probable que pour le moment ça ne t'a pas posé de problème.

    Mais si un jour, tu change de feuille avant de fermer et enregistrer ce classeur ... cette ligne de code n'ira plus copier les données de la bonne feuille


    tu comprends mieux ?

    il faut toujours expliciter à VBA la parenté complète, et ne pas hésiter à user (et abuser) des blocs With/End With pour faciliter la lecture et optimiser les ressources VBA

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim MonClasseur As Workbook
    Set MonClasseur = ThisWorkbook
    MonClasseur.Worksheets("Toto").Range("A1").Copy
    Là, je suis certain que VBA ne va jamais se mélanger le pinceaux et devoir deviner ce que je veux
    Et on peut également utiliser des variable WorkSheet et Range pour manipuler la Feuille et la Plage

    Quand VBA doit deviner : il utilisera toujours l'objet Actif

  14. #14
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim MonClasseur As Workbook
    Set MonClasseur = ThisWorkbook
    MonClasseur.Worksheets("Toto").Range("A1").Copy


    Quand VBA doit deviner : il utilisera toujours l'objet Actif
    Lorsque je fais ça :

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    Dim DestBook As Workbook, SourceBook As Workbook
    Dim DestCell As Range
    Dim RetVal As Boolean
    Dim Chemin As String
     
    ' désactiver le rafraichissement de l'écran avant la macro
    Application.ScreenUpdating = False
     
    'chemin en relatif du dossier ou se trouve tes données
     
    Set DestBook = ThisWorkbook
    Set DestCell = DestBook.Worksheets("en cours liste complète réseau").Range("A1")
    With DestBook.Worksheets("en cours liste complète réseau")
     
    .Range(Range("A1"), Range("A1").SpecialCells(xlLastCell)).ClearContents
    .Range(Range("A1"), Range("A1").SpecialCells(xlLastCell)).ClearFormats
    'active la cellule où j'aimerais copier les données
     
    End With
    'Ouvre la boîte de dialogue
    'RetVal = Application.Dialogs(xlDialogOpen).Show("C:\Export Données\réseau en cours.xl*")
    Application.Workbooks.Open ("C:\Export Données\réseau en cours.xls")
     
    ' If Retval is false (Open dialog canceled), exit the procedure.
    'If RetVal = False Then Exit Sub
     
    ' active le classeur à partir duquel copier les données
    Set SourceBook = ThisWorkbook
     
    ' copie entièrement la feuille de calcul
    SourceBook.Range(Range("A1"), Range("A1").SpecialCells(xlLastCell)).Copy
     
     
    ' Active la feuille de destination et une cellule de cette feuille
    DestBook = ThisWorkbook
     
    DestCell.Activate
     
    'colle les formats et les valeurs des cellules
    Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
        xlNone, SkipBlanks:=False, Transpose:=False
    Selection.PasteSpecial Paste:=xlPasteFormats, Operation:= _
          xlNone, SkipBlanks:=False, Transpose:=False
          Application.CutCopyMode = False
    SourceBook.Close False
     
    Application.ScreenUpdating = True
    Application.DisplayAlerts = False
    J'ai une erreur dès le début (l'indice n'appartient pas à la sélection" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Set DestBook = ThisWorkbook
    Set DestCell = DestBook.Worksheets("en cours liste complète réseau").Range("A1")
    With DestBook.Worksheets("en cours liste complète réseau")
     
    .Range(Range("A1"), Range("A1").SpecialCells(xlLastCell)).ClearContents
    .Range(Range("A1"), Range("A1").SpecialCells(xlLastCell)).ClearFormats
    'active la cellule où j'aimerais copier les données
     
    End With
    J'essaye de suivre vos conseils pour vraiment optimiser mon code parce que j'ai déjà trop de modules remplis là !

    Merci

    Aussi, est il possible d'ouvrir le fichier copier les données et le fermer dans la macro ? Parce que avec Workbooks.close() ça ne fonctionne pas quand je le fais.

  15. #15
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Thisworkbook = le classeur qui contient la macro

    Je présume que ta feuille Worksheets("en cours liste complète réseau") est plutôt dans le fichier que tu as ouvert ?
    Ce qui expliquerait ton message d'erreur .. cette feuille n'existant pas dans le classeur qui contient la macro


    voici un nouvel exemple pour comprendre :

    - on ouvre un classeur
    - on copie l'ensemble de la plage utilisée dans une feuille et on la colle dans le classeur qui contient la macro, à partir de la cellule A1
    - on le ferme sans l'enregistrer

    tu verras que le With/End With n'est pas nécessaire ... on ne répète pas les variables
    t'as un petit bonus à la fin au sujet de tes nettoyages de cellules

    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
    Sub toto()
    Dim WbDonnees As Workbook
    Dim WbSource As Workbook
    Dim ShDonnes As Worksheet
    Dim ShSource As Worksheet
    Dim Chemin As String
     
    ' classeur qui contient les macros
    ' c'est là où on ira copier les données
    Set WbSource = ThisWorkbook
    Set ShSource = WbSource.Worksheets("Feuil1")
     
    ' le fichier à ouvrir
    ' c'est lui qui contient les données qu'on veut copier
    Chemin = "Chemin complet de ton fichier" ' y compris son nom et son extension
     
    ' ouverture et affectation immédiate du classeur à une variable
    Set WbDonnees = Workbooks.Open(Chemin)
    ' la feuille qui nous intéresse
    Set ShDonnees = WbDonnees.Worksheets("en cours liste complète réseau")
     
    ' on prend la plage utilisée dans ShDest et on la copie dans notre classeur
    ShDonnees.UsedRange.Copy ShSource.Range("A1")
     
    ' on ferme le classeur sans l'enregistrer
    WbDonnees.Close False
     
    ' bonus
    ' quand tu veux effacer Format + valeur ==> utilises l'instruction Clear
    ' plutôt que de coupler ClearContents et ClearFormats
     
    End Sub
    Les variables Feuilles et Classeur n'ont aucune utilité dans ce code, dans la mesure où ils ne sont utilisés qu'une seule fois
    Mais c'est juste pour l'exemple

    En version simplifiée, ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub toto()
        Dim WbDonnees As Workbook
        Set WbDonnees = Workbooks.Open("Chemin complet de ton fichier")
        With WbDonnees
            .Worksheets("en cours liste complète réseau").UsedRange.Copy ThisWorkbook.Worksheets("Feuil1").Range("A1")
            .Close False
        End With
    End Sub

  16. #16
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Par défaut
    Avant tout, merci pour votre aide

    j'ai créé une fonction de type public qui copie et colle les données dans le classeur actif, je l'appelle comme ça dans une procédure du même module :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Creerfeuille_reseauencourstarife2015()
     
    Set sqsq = Import_fichiers("C:\Export Données\réseau en cours.xls", "en cours liste complète réseau", "Feuil1")
     
    End Sub
    Lorsque je l'appelle dans un autre module

    NOM AMBIGU DETECTE : Imports_fichiers

    Je l'appelle comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Creerfeuille_reseau_sssuite()
     
    Set gddgg = Import_fichiers("C:\Export Données\réseau sans suite.xls", "réseau sans suite", "Feuil1")
     
    End Sub
    Vu qu'une fonction déclarée Public peut être appelée dans tous les modules !

    Le problème ne peut pas venir du fait que j'appelle la fonction deux fois je suppose ?

  17. #17
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    tu peux l'utiliser autant de fois que tu veux

    mais visiblement, tu l'as déclaré deux fois dans l'ensemble de ton projet


    fait une recherche globale dans tout ton projet pour les retrouver

  18. #18
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Par défaut
    Bonjour,

    je reviens encore à la charge :

    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
     Dim WsSOurce As Worksheet, filtre As Workbook, WsCible As Worksheet
        Dim Dab As String, Fin As String
        Application.ScreenUpdating = False
        Set WsSOurce = ThisWorkbook.Sheets("en cours liste complète réseau")
        On Error Resume Next: WsSOurce.ShowAllData: On Error GoTo 0
     
            'Application.DisplayAlerts = False
        If FeuilleExiste("réseau en cours tarifé" & Year(Date)) = True Then
          '  Sheets("réseau en cours tarifé" & Year(Date)).Delete
          MsgBox ("L'onglet Réseau en cours tarifé " & Year(Date) & " exsite déjà ! Veuillez d'abord la supprimer")
            'Application.DisplayAlerts = True
        Else
            Set WsCible = ThisWorkbook.Sheets.Add(After:=WsSOurce)
            WsCible.Name = "réseau en cours tarifé " & Year(Date)
            deb = ">" & Year(Date) - 1 & "/12/31"
            Fin = "<" & Format(Date, "yyyy/mm/01")
            Set filtre = Workbooks.Add
            filtre.Sheets(1).Range("A1") = "Code_Delegation"
            filtre.Sheets(1).Range("B1") = "Date_1ereTarification"
            filtre.Sheets(1).Range("C1") = "Date_1ereTarification"
            filtre.Sheets(1).Range("D1") = "Statut_Etude"
            filtre.Sheets(1).Range("E1") = "Statut_Etude"
     
            filtre.Sheets(1).Range("A2") = "<>DGEN*"
            filtre.Sheets(1).Range("B2") = deb
            filtre.Sheets(1).Range("C2") = Fin
            filtre.Sheets(1).Range("D2") = ">2"
            filtre.Sheets(1).Range("E2") = "<7"
            FiltreActif WsSOurce.UsedRange, filtre.Sheets(1).UsedRange, WsCible.Range("A1")
            filtre.Close False
            Set filtre = Nothing
        End If
            Application.ScreenUpdating = True



    Impossible de renommer une feuille comme une autre feuille, une bibliothèque d'objets référencée ou un classeur ...

    Je crois que cela vient du fait que la feuille existe déjà, j'aimerais pourtant qu'il m'écrive le message de la boîte à chaque fois que je clique sur le bouton ! Mais même en supprimant le reste de l'exécution, je remarque qu'il ignore juste cette ligne ! Pourquoi et comment corriger cela ?

    Ici ma fonction qui vérifie si la feuille existe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Public Function FeuilleExiste(Nom As String) As Boolean
        Dim sh As Object
     
        For Each sh In Sheets
            If UCase(sh.Name) = UCase(Nom) Then
                FeuilleExiste = True
                Exit For
            End If
        Next
    End Function
    Merci pour votre aide

  19. #19
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut


    Pour vérifier l'existence d'une feuille, voir la fonction ExistSheet dans cette discussion

    ou encore les fonctions ExistWorkSheet et ExistWorkbookSheet dans celle-ci

    _____________________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …

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

Discussions similaires

  1. Problème d'importation de fichier excel
    Par couanp dans le forum MATLAB
    Réponses: 7
    Dernier message: 30/04/2007, 11h49
  2. [Importation]Importer un fichier Excel par code
    Par Bes74 dans le forum Access
    Réponses: 1
    Dernier message: 03/04/2007, 12h46
  3. ouverture auto d'un fichier excel par macro access
    Par pascal913 dans le forum Access
    Réponses: 5
    Dernier message: 26/07/2006, 16h50
  4. ouverture auto d'un fichier excel par macro
    Par pascal913 dans le forum Access
    Réponses: 2
    Dernier message: 26/07/2006, 12h45
  5. transfert contenu fichier excel par macro
    Par pascal913 dans le forum Access
    Réponses: 7
    Dernier message: 12/07/2006, 11h01

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