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 :

copier coller dans classeurs fermés


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 855
    Par défaut copier coller dans classeurs fermés
    Bonjour,

    Voilà, j'ai 3 classeurs (C1.xls avec 2 feuilles (MAJ, Données) et C2.xls avec plusieurs feuilles (Données, Tri,...), C3 qui contient des codes utilisant les données de C2)

    Le classeur C2 contient plusieurs formules assez "complexes" du style RechercheV, analyse de listes déroulantes, etc....donc à chaque ouverture j'ai "mon petit sablier" qui prend un peu de temps....

    Je dois copier la feuille "Données" du C1 dans la feuille "Données" du C2 et mettre à jour le classeur C2.

    Jusqu'à présent, j'utilise un classeur nommé "Miseajour.xls" dans lequel je mets le code
    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
    Sub RequeteClasseurFerme()
        Dim Cn As ADODB.Connection
        Dim Fichier As String
        Dim NomFeuille As String, texte_SQL As String
        Dim Rst As ADODB.Recordset
     
        'Définit le classeur fermé servant de base de données
        Fichier = "C:\C1.xls"
        'Nom de la feuille dans le classeur fermé
        NomFeuille = "Données"
     
        Set Cn = New ADODB.Connection
     
        '--- Connection ---
        With Cn
            .Provider = "Microsoft.Jet.OLEDB.4.0"
            .ConnectionString = "Data Source=" & Fichier & _
                ";Extended Properties=Excel 8.0;"
            .Open
        End With
        '-----------------
     
        'Définit la requête.
        '/!\ Attention à ne pas oublier le symbole $ après le nom de la feuille.
        texte_SQL = "SELECT * FROM [" & NomFeuille & "$]"
     
        Set Rst = New ADODB.Recordset
        Set Rst = Cn.Execute(texte_SQL)
     
        'Ecrit le résultat de la requête dans la cellule A2
        Range("A2").CopyFromRecordset Rst
     
        '--- Fermeture connexion ---
        Cn.Close
        Set Cn = Nothing
     
    End Sub
    Merci SilkyRoad

    Donc dans la feuille active de "Miseajour", j'ai copié les cellules de "Données" de C1.xls.

    Je souhaite maintenant les coller, et/ou les "envoyer" dans le C2, feuille "Données" et mettre à jour C2....

    J'ai essayé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A2").PasteFromRecordset Rst
    , mais ça ne fonctionne pas...

    Pour la mise à jour, j'utilise
    La mise à jour fonctionne (actuellement, mon code ouvre C2, ("petit sablier", je copie les cellules importées de C1, qui sont dans la Feuil1 de "Miseajour", je colle dans C2 ("petit sablier"), je ferme C2 ("petit sablier"), ensuite je reprend le code de SilkyRoad en changeant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Fichier = "C:\C1.xls"
        'Nom de la feuille dans le classeur fermé
        NomFeuille = "Données"
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Fichier = "C:\C2.xls"
        'Nom de la feuille dans le classeur fermé
        NomFeuille = "Tri"
    (en fait cette manip me permet "d'enlever" les formules (un peu comme un "x.DIF" (très utile plus tard dans mon classeur C3 qui contient lui aussi des listes déroulantes et formules....), je copie les cellules de "Feuil2" de "Miseajour" et colle dans C3.

    Voilà pour ma manip actuelle...que je trouve "lourde" et surtout longue (beaucoup de "petits sabliers"....).

    Je pense que la méthode de connexion sur des classeurs fermés pourrait permettre de gagner du temps, mais je n'arrive pas à trouver le code....

    En fait, il me manque le code du "coller" les "Données" de C1 vers C2, et la mise à jour de C2...(c'est-à-dire sans être obligé de l'ouvrir....)


    Des idées ???

    Merci,
    A+

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 150
    Par défaut
    Citation Envoyé par ericdev67 Voir le message
    Bonjour,
    Jusqu'à présent, j'utilise un classeur nommé "Miseajour.xls" dans lequel je mets le code
    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
    Sub RequeteClasseurFerme()
        Dim Cn As ADODB.Connection
        Dim Fichier As String
        Dim NomFeuille As String, texte_SQL As String
        Dim Rst As ADODB.Recordset
     
        'Définit le classeur fermé servant de base de données
        Fichier = "C:\C1.xls"
        'Nom de la feuille dans le classeur fermé
        NomFeuille = "Données"
     
        Set Cn = New ADODB.Connection
     
        '--- Connection ---
        With Cn
            .Provider = "Microsoft.Jet.OLEDB.4.0"
            .ConnectionString = "Data Source=" & Fichier & _
                ";Extended Properties=Excel 8.0;"
            .Open
        End With
        '-----------------
     
        'Définit la requête.
        '/!\ Attention à ne pas oublier le symbole $ après le nom de la feuille.
        texte_SQL = "SELECT * FROM [" & NomFeuille & "$]"
     
        Set Rst = New ADODB.Recordset
        Set Rst = Cn.Execute(texte_SQL)
     
        'Ecrit le résultat de la requête dans la cellule A2
        Range("A2").CopyFromRecordset Rst
     
        '--- Fermeture connexion ---
        Cn.Close
        Set Cn = Nothing
     
    End Sub
    Pourquoi tu mets pas ce code dans ton classeur C2?
    en changeant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A2").CopyFromRecordset Rst
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Thisworkbook.Sheets("Donnees").Range("A2").CopyFromRecordset Rst
    et puis pour que ca calcule pas en masse
    met
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Calculation = xlCalculationManual
    en début de code
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Calculation = xlCalculationAutomatic
    à la fin

    tu devrais déjà avoir moins de sabliers...

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 855
    Par défaut
    Merci -={-_-}=-,

    Effectivement, en allant directement mettre le code dans le fichier "source", ça m'évite de le copier/coller....Il fallait y penser....bien vu....merci pour l'idée.
    Pour les "sabliers", effectivement, je "gagne" du temps grâce à ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Application.Calculation = xlCalculationManual
    Application.Calculation = xlCalculationAutomatic
    ,
    Je l'ai mis à l'ouverture de la connexion et à la fin, et effectivement, ça prends moins de temps....

    Merci

    Par contre, dernière question : comme je mets ton code dans le C2, je suis obligé d'ouvrir C2 et le "petit sablier" apparait....ensuite j'exécute le code de SilkyRoad. N'y a-t-il pas un moyen de mettre à jour les données de C2, par macro, sans devoir "ouvrir" C2 et donc "éviter ce fameux "petit sablier".....


    Merci,
    A+

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

Discussions similaires

  1. [XL-2007] Copier cellules depuis classeur fermé dans classeur ouvert hébergés dans lib sharepoint
    Par mattlovelara dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 27/03/2014, 16h49
  2. [XL-2007] Copier cellules depuis classeur fermé dans classeur ouvert
    Par mattlovelara dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 27/03/2014, 09h49
  3. [XL-2007] Copier/coller dans nouveau classeur la ou les feuille(s) sélectionnée avec checkbox
    Par apache84 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 01/02/2014, 17h19
  4. VBS EXCEL: Copier/Coller dans 2 classeurs differents
    Par bourbe dans le forum VBScript
    Réponses: 0
    Dernier message: 20/09/2013, 20h51
  5. [XL-2003] Copier Coller dans un autre classeur
    Par Lucho84 dans le forum Excel
    Réponses: 2
    Dernier message: 12/11/2011, 17h42

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