Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 14 sur 14
  1. #1
    Invité de passage
    Inscrit en
    septembre 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : septembre 2009
    Messages : 12
    Points : 2
    Points
    2

    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 :
    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 :
    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 :
    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 :
     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 :
    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
    1 995
    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 : 1 995
    Points : 2 802
    Points
    2 802

    Par défaut

    Bonjour,
    Citation Envoyé par leriderfoudu77 Voir le message
    Code :
    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 :
    1
    2
    if typename(wbsource)<>"Nothing" then
    etc.
    Code :
    Application.CutCopyMode = False
    doit être supprimé (code résiduel de l'enregistreur de macro)


    A


    Je fournis pelles et pioches mais jamais l'huile de coude.
    ________________________________________________

    « Heureux soient les fêlés, car ils laisseront passer la lumière. »

    Pensez aux liens
    Rechercher - Google - Google Labs - AllApi
    et avant de poster : « A lire » , « Tutoriel sur le déboguage »

  3. #3
    Invité de passage
    Inscrit en
    septembre 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : septembre 2009
    Messages : 12
    Points : 2
    Points
    2

    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 :
    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 :
    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
    Invité de passage
    Inscrit en
    septembre 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : septembre 2009
    Messages : 12
    Points : 2
    Points
    2

    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
    1 995
    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 : 1 995
    Points : 2 802
    Points
    2 802

    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 :
    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)

    Je fournis pelles et pioches mais jamais l'huile de coude.
    ________________________________________________

    « Heureux soient les fêlés, car ils laisseront passer la lumière. »

    Pensez aux liens
    Rechercher - Google - Google Labs - AllApi
    et avant de poster : « A lire » , « Tutoriel sur le déboguage »

  6. #6
    Invité de passage
    Inscrit en
    septembre 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : septembre 2009
    Messages : 12
    Points : 2
    Points
    2

    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 :
    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
    1 995
    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 : 1 995
    Points : 2 802
    Points
    2 802

    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 :
    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
    .../...

    Je fournis pelles et pioches mais jamais l'huile de coude.
    ________________________________________________

    « Heureux soient les fêlés, car ils laisseront passer la lumière. »

    Pensez aux liens
    Rechercher - Google - Google Labs - AllApi
    et avant de poster : « A lire » , « Tutoriel sur le déboguage »

  8. #8
    Invité de passage
    Inscrit en
    septembre 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : septembre 2009
    Messages : 12
    Points : 2
    Points
    2

    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
    Invité de passage
    Inscrit en
    septembre 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : septembre 2009
    Messages : 12
    Points : 2
    Points
    2

    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
    Invité de passage
    Inscrit en
    septembre 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : septembre 2009
    Messages : 12
    Points : 2
    Points
    2

    Par défaut

    petite nouveauté, en utilisant :

    Code :
    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
    Invité de passage
    Inscrit en
    septembre 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : septembre 2009
    Messages : 12
    Points : 2
    Points
    2

    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
    Invité de passage
    Inscrit en
    septembre 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : septembre 2009
    Messages : 12
    Points : 2
    Points
    2

    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
    1 995
    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 : 1 995
    Points : 2 802
    Points
    2 802

    Par défaut


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

    Je fournis pelles et pioches mais jamais l'huile de coude.
    ________________________________________________

    « Heureux soient les fêlés, car ils laisseront passer la lumière. »

    Pensez aux liens
    Rechercher - Google - Google Labs - AllApi
    et avant de poster : « A lire » , « Tutoriel sur le déboguage »

  14. #14
    Invité de passage
    Inscrit en
    septembre 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : septembre 2009
    Messages : 12
    Points : 2
    Points
    2

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •