Précédent   Forum du club des développeurs et IT Pro > Autres langages > Général Visual Basic 6 et VBScript > VB 6 et antérieur
VB 6 et antérieur Visual basic 6 et versions antérieures. Avant de poster -> La FAQ VB6, Les tutoriels VB
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 04/12/2012, 17h57   #1
leriderfoudu77
Invité de passage
 
Inscription : 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.
leriderfoudu77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2012, 09h31   #2
DarkVader
Rédacteur
 
Avatar de DarkVader
 
Homme
Développeur informatique
Inscription : mai 2002
Messages : 1 945
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 945
Points : 2 731
Points : 2 731
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 »
DarkVader est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2012, 11h45   #3
leriderfoudu77
Invité de passage
 
Inscription : septembre 2009
Messages : 12
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 12
Points : 2
Points : 2
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.
Citation:
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 ^^
leriderfoudu77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2012, 13h50   #4
leriderfoudu77
Invité de passage
 
Inscription : septembre 2009
Messages : 12
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 12
Points : 2
Points : 2
Je joints mes fichiers au passage, ça pourrait être plus clair
Fichiers attachés
Type de fichier : xls Destination.xls (202,0 Ko, 1 affichages)
Type de fichier : xls source.xls (105,0 Ko, 1 affichages)
Type de fichier : zip Copie Excel.zip (2,8 Ko, 3 affichages)
leriderfoudu77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2012, 14h22   #5
DarkVader
Rédacteur
 
Avatar de DarkVader
 
Homme
Développeur informatique
Inscription : mai 2002
Messages : 1 945
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 945
Points : 2 731
Points : 2 731
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 ?

Citation:
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 »
DarkVader est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2012, 16h23   #6
leriderfoudu77
Invité de passage
 
Inscription : septembre 2009
Messages : 12
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 12
Points : 2
Points : 2
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
leriderfoudu77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2012, 17h07   #7
DarkVader
Rédacteur
 
Avatar de DarkVader
 
Homme
Développeur informatique
Inscription : mai 2002
Messages : 1 945
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 945
Points : 2 731
Points : 2 731
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 »
DarkVader est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2012, 21h55   #8
leriderfoudu77
Invité de passage
 
Inscription : septembre 2009
Messages : 12
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 12
Points : 2
Points : 2
Bonsoir, je n ai pas pu regarder depuis hier, je regarde ça en début de semaine

Encore merci et bon Week End !
leriderfoudu77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 16h01   #9
leriderfoudu77
Invité de passage
 
Inscription : septembre 2009
Messages : 12
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 12
Points : 2
Points : 2
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 ^^
leriderfoudu77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 16h21   #10
leriderfoudu77
Invité de passage
 
Inscription : septembre 2009
Messages : 12
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 12
Points : 2
Points : 2
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.
leriderfoudu77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2012, 17h13   #11
leriderfoudu77
Invité de passage
 
Inscription : septembre 2009
Messages : 12
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 12
Points : 2
Points : 2
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
leriderfoudu77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 15h44   #12
leriderfoudu77
Invité de passage
 
Inscription : septembre 2009
Messages : 12
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 12
Points : 2
Points : 2
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 :

Citation:
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.
leriderfoudu77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 16h40   #13
DarkVader
Rédacteur
 
Avatar de DarkVader
 
Homme
Développeur informatique
Inscription : mai 2002
Messages : 1 945
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 945
Points : 2 731
Points : 2 731

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 »
DarkVader est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2012, 09h52   #14
leriderfoudu77
Invité de passage
 
Inscription : septembre 2009
Messages : 12
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 12
Points : 2
Points : 2
Salut,
ben mon pb avait l'air d'être simplement de la syntaxe. Apparement après le .copy la destination doit etre definie
Citation:
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.
leriderfoudu77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 16h12.


 
 
 
 
Partenaires

Hébergement Web