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

VB 6 et antérieur Discussion :

[ VB6 ]Copie de donnée entre deux classeurs Excel


Sujet :

VB 6 et antérieur

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12
    Points : 5
    Points
    5
    Par défaut [ VB6 ]Copie de donnée entre deux classeurs Excel
    Bonjour à tous,

    je me résous à créer mon propre poste après avoir écumer les forums et les aides.

    J'ai en fait deux tableaux Excel. ( Enfin un csv et un excel mais le temps de tester je le laisse en xls et regarderait après comment le convertir ). Le premier tableau est une extraction de données réalisée toute les semaines. Dans ce tableau un certain nombre de données sont stockée, en gros de A1 à I600 sur une seule feuille.
    Il faut ensuite copier ces données dans la première feuille du second classeur qui les traite ensuite dans les feuilles suivantes.
    Mon Pb vient de la copie entre les classeurs.

    J'ouvre les deux classeurs via des boutons dont le code suis :

    pour le fichier de destination
    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
     
    Private Sub previous_btn_Click()
     
    cheminpr = ""
    'utilisation comondialog afin d'ouvrir le fichier
    CommonDialog1.ShowOpen
    cheminpr = CommonDialog1.FileName
    nompr = CommonDialog1.FileTitle
     
    If cheminpr = "" Then MsgBox "vous n'avez rien sélectionné": Exit Sub
     
    Set appExcel = CreateObject("Excel.Application")
    Set wbprevious = appExcel.Workbooks.Open(cheminpr)
    source_btn.Visible = True
     
    End Sub
    pour le fichier source

    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
     
    Private Sub source_btn_Click()
     
    cheminsr = ""
    CommonDialog1.ShowOpen
    cheminsr = CommonDialog1.FileName
    nomsr = CommonDialog1.FileTitle
     
    If cheminsr = "" Then MsgBox "vous n'avez rien sélectionné": Exit Sub
     
    'Ouverture de l'application
    Set appExcel = CreateObject("Excel.Application")
    'Ouverture d'un fichier Excel
    Set wbsource = appExcel.Workbooks.Open(cheminsr)
     
     
     
    Ope.Visible = True
    End Sub
    Enfin voila mon code censé faire la copie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Workbooks("wbprevious").Worksheets(1).Range("A1:i600").Copy _
          Destination:=Workbooks("wbsource").Worksheets(1).Range("A1:i600")
    ce code donne une erreur9 "indice en dehors de la plage"

    J'avais aussi testé cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Workbooks("wbprevious").Worksheets(1).Range("A1:i600").Value = Workbooks("wbsource").Worksheets(1).Range("A1:i600").Value
    ce code ne fait juste rien :/

    j'ai aussi testé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    wbsource.Sheets(1).Range("I1:I35").Copy
        wbprevious.Sheets("Top Manager CAP").Range("J1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Application.CutCopyMode = False
    mais la j'ai une erreur 1004 la méthode pastespecial de la classe Range a échouée.

    Je suis donc bloqué à cet endroit.
    Si quelqu'un avait la gentillesse de jeter un oeil pour me filer un coup de main ce serait super chouette.

    D'avance merci à tous et bonne continuation.

  2. #2
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Bonjour,
    Citation Envoyé par leriderfoudu77 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    wbsource.Sheets(1).Range("I1:I35").Copy
        wbprevious.Sheets("Top Manager CAP").Range("J1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Application.CutCopyMode = False
    mais la j'ai une erreur 1004 la méthode pastespecial de la classe Range a échouée.
    La bonne syntaxe est celle ci-dessus toutefois elle suppose que
    1/ la portée des variables wbsource/wbprevious soit compatible avec le code.
    2/ de vérifier la validité de l'objet après son affectation surtout quand la choix est laissé à l'utilisateur
    3/ Attention à l'utilisation de Sheets utilisé avec le numero de feuille :
    Sheets est la collection de TOUTES les feuilles (graphes etc) qui ne supporte pas la méthode demandée
    lui préférer la collection Worksheets qui ne concerne que les feuille de calcul

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if typename(wbsource)<>"Nothing" then
    etc.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.CutCopyMode = False
    doit être supprimé (code résiduel de l'enregistreur de macro)


    A


  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    merci infiniment pour ta réponse !

    Bon j'ai pas tout compris à tes remarques alors je me suis renseigné un peu.

    Pour la portée des variables, en cherchant un peu j'ai vu que je n'avais pas mentionné dans mon post la façon dont j'avais déclaré mes classeurs. J'avais utilisé Dim en début de feuille. Apparemment il vaut mieux utiliser private ou public. J'ai testé avec les deux mais j'ai eu le même résultat.
    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
     
    'Déclaration des variables
    Public appExcel As Excel.Application 'Application Excel
     
    Public wbsource As Excel.Workbook 'Classeur Excel
    'Dim wssource As Excel.Worksheet 'Feuille Excel
     
    Public wbprevious As Excel.Workbook
    'Dim wsprevious As Excel.Worksheet
     
    Public cheminpr As String
    Public nompr As String
    Public cheminsr As String
    Public nomfeuil As String
    Public nomsr As String
    Pour l'utilisation du numéro de feuille pour la sheets j'avais un pb car le nom de la feuille changeait à chaque fois mais j'ai trouvé une ruse pour l'extraire et l'ai mis dans une variable. De plus comme tu l'as dit j'ai changé les sheets en worksheets.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    wbsource.Worksheets(nomfeuil).Range("A1:I600").Copy
        wbprevious.Worksheets("Top Manager CAP").Range("A1:i600").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
    Enfin, concernant ta seconde remarque.
    2/ de vérifier la validité de l'objet après son affectation surtout quand la choix est laissé à l'utilisateur
    Je ne comprends pas vraiment ce que je dois vérifier car j'ai toujours la même erreur. Comme je n'ai pas pu utiliser ta seconde remarque j'imagine que le pb doit venir de la

    Encore merci pour ton aide et si tu pouvais me prêter encore un peu tes outils que je continue a verser mon huile de coude, ce serait vraiment cool de ta part ^^

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Je joints mes fichiers au passage, ça pourrait être plus clair
    Fichiers attachés Fichiers attachés

  5. #5
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Citation Envoyé par leriderfoudu77 Voir le message
    Bonjour,

    merci infiniment pour ta réponse !

    Bon j'ai pas tout compris à tes remarques alors je me suis renseigné un peu.

    Pour la portée des variables, en cherchant un peu j'ai vu que je n'avais pas mentionné dans mon post la façon dont j'avais déclaré mes classeurs. J'avais utilisé Dim en début de feuille. Apparemment il vaut mieux utiliser private ou public. J'ai testé avec les deux mais j'ai eu le même résultat.
    [code]
    'Déclaration des variables
    Public appExcel As Excel.Application 'Application Excel

    Public wbsource As Excel.Workbook 'Classeur Excel
    'Dim wssource As Excel.Worksheet 'Feuille Excel

    Public wbprevious As Excel.Workbook
    'Dim wsprevious As Excel.Worksheet
    La déclaration Public est bien ... dans un module standart ?

    Enfin, concernant ta seconde remarque.

    Je ne comprends pas vraiment ce que je dois vérifier car j'ai toujours la même erreur. Comme je n'ai pas pu utiliser ta seconde remarque j'imagine que le pb doit venir de la

    Encore merci pour ton aide et si tu pouvais me prêter encore un peu tes outils que je continue a verser mon huile de coude, ce serait vraiment cool de ta part ^^
    Avec le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set wbprevious = appExcel.Workbooks.Open(cheminpr)
    debug.assert typename(wbprevious)<>"Nothing"
    si wbprevious n'a pas été instancié alors le code s'arrêtera sur la ligne debug.assert (=False)

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Merci de ton implication ! )

    Je dois vraiment être à un niveau proche de zéro car je ne comprends toujours pas ce que tu veux dire :/

    Mes déclaration publiques sont en haut de la feuille s'appelant form1.frm et je n'ai aucun code parlant de debug.assert. Je ne sais pas si je devrais...

    En tout cas j'ai refais des tests sur ma formule de copie, en remplaçant de, façon à faire la copie dans le même classeur. De wbsource vers wbsource ça fonctionne, de wbprevious vers wbprevious ça fonctionne aussi, même en changeant de feuille. Il n'y a que lorsque je fait la copie d'un classeur à l'autre que j'ai mon erreur. Lors de mon test je ne changeais que les noms de classeur, rien d'autre dans la formule. J'ai toujours l'erreur 1004 la méthode pastespecial de la classe Range a échouée. avec la ligne suivante surlignée Jaune:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        wbprevious.Worksheets("bal_a_enjeux").Range("L1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False

  7. #7
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Tu crées dans ton code 2 instances distinctes d'Excel en utilisant le même object Application.
    Il ne faut pas être ensuite étonné qu'il y perde son latin.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Public appXL as Excel.Application
     
    if typename(appXL)="Nothing" then
        set appXL=CreateObject("Excel.application")
       'if typename(appXL)="Nothing" then 'alert
    endif
    .../...

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Bonsoir, je n ai pas pu regarder depuis hier, je regarde ça en début de semaine

    Encore merci et bon Week End !

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    je suis en train de me replongé dans ce casse tête, avec tes dernières pistes je suis tombé sur deux fils de forum qui me semble correspondre a mon souci.

    J'essaie de comprendre la gestion de plusieurs instances d'excel. Mais dans mon cas, je dois ouvrir mes deux classeurs ds la même instance ou utiliser deux instances comme je semble le faire ? ( mais j'ai pas fait exprés m'sieur)

    Bon week end si personne ne regarde d'ici la semaine prochaine ^^

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    petite nouveauté, en utilisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set appExcel = CreateObject("Excel.Application")
    une seule fois dans le code, je n'ai qu'une seule instance d'excel a killer quand mon programme a planter.

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Bonjour, je reviens vers vous car je suis toujours bloqué, je ne comprends pas ce que je dois faire avec ces fichues instances. Je vois plein de sujets sur differents forums qui traite de choses plus ou moins similaire mais je n'arrive jamais à adapter le cas au mien. Je suis toujours bloqué sur le même message d'erreur 1004 qui refuse de copier les données dans le second classeur :/

    Un petit coup de pouce supplémentaire serait tres bien venu )

    D'avance merci pour votre aide

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    je reviens sur le sujet car j'ai réussi à m'en sortir finalement !! Enfin !

    Voila le code qu'il afut mettre pour une copie :

    wbsource.Worksheets(nomfeuil).Range("A1:I600").Copy Destination:=wbprevious.Worksheets("bal_a_enjeux").Range("A1")
    Cela pourra certainement servir a des futurs personne en galère.

  13. #13
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut

    La solution était déjà dans le contenu de cette file.

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Salut,
    ben mon pb avait l'air d'être simplement de la syntaxe. Apparement après le .copy la destination doit etre definie
    Destination:=
    Mais effectivement tout ce qui a été dit ds ce fil est vrai

    Encore merci à ton aide, passe de bonne fêtes de fin d'année et longue vie au forum.

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

Discussions similaires

  1. Copie de données entre deux tables distinctes
    Par newty dans le forum Requêtes
    Réponses: 7
    Dernier message: 30/07/2010, 17h25
  2. Copie de données entre deux tables
    Par Guite dans le forum VBA Access
    Réponses: 1
    Dernier message: 30/06/2008, 12h08
  3. Copie de données entre deux fichiers Excel
    Par qltmi dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 30/03/2008, 20h20
  4. Copie de données entre deux serveurs mysql
    Par hugue1 dans le forum Requêtes
    Réponses: 1
    Dernier message: 20/10/2007, 20h59
  5. copie de données entre 2 fichiers excel
    Par kalu dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 31/10/2006, 18h31

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