AlexDam
Messages postés31Date d'inscriptionmercredi 6 septembre 2006StatutMembreDernière intervention10 octobre 2006
-
6 sept. 2006 à 22:41
AlexDam
Messages postés31Date d'inscriptionmercredi 6 septembre 2006StatutMembreDernière intervention10 octobre 2006
-
11 sept. 2006 à 16:27
Hey there, bon ben deja obnjour a tous (c'est mon premier post :)), et déja ça commence bien je suis pas sur d'avoir posté dans la bonne section lol.
Enfin bon, voila je debute en vba mais j'ai quelques connaissances en VB. En fait pour mon stage, je dois faire un appli (vb6) pour ma boss à partir de vb6 et qui utilise des fichiers excel et .csv.
L'un des premiers truc que j'ai à faire c'est cheker une liste dans un fichier .csv (donc tout les champ une colonne quoi) avec un autre liste dans un autre fichier. En gros, disons que dans un fichier excel j'ai une liste de nouvel recette(une recette par champ) et que je veux cheker si elles sont déja présente dans le livre de recette (toujours un recette par champ).
Donc tout happy, je fais ma connection aux deux fichiers, je fais une double boucle tout ce qu'il y a de plus normal, et la c'est le drame... ça prend un temps terrible... Bon il faut imaginer que la liste des nouvelles recette a 1000 entree et que le livre de recette en a 10000, la d'accord on peut comprendre que ça prenne longtemps. Moi aussi je suis d'accord.
Mon code:
'Check receipts
Set eWorkSheet1 = exl.Worksheets(2)
If Form2.Check1 = "1" Then
'Sales
i = 2
a = a + 5
While eWorkSheet.Cells(i, 5) <> "" 'les cellules de mes recettes a cheker
u = False
b = 2
While eWorkSheet1.Cells(b, 1) <> "" And u = False ' tant que je trouve pas la recette dans le book (si je la trouve ça break)
If eWorkSheet.Cells(i, 5) = eWorkSheet1.Cells(b, 1) Then '
u = True
End If
b = b + 1
Wend
If u = False Then 'je ne fais pas dajout direct mais je sort dans un autre fichier les recettes a rajouter
eWorkSheet2.Cells(a, 1) = "The receipt" & eWorkSheet.Cells(i, 5) & " has to be added to the receipt book."
a = a + 1
End If
End If
i = i + 1
Wend
End If
Print "Brands checked"
Maintenant, on en arrive à la partie que je compre po :
Jusqu'a présent ma boss utilisait cette macro excel pour faire le truc:
Et en fait en utilisant ça, ça va genre facilement 20 fois plus vite...
Donc ma premiere question c'est : Est-ce que ça va plus vite du fait que tout le boulot est fait sous excel et que du fait que je developpe mon projet sous vb6 la connection avec les deux fichier ralenti le traitement (fasse à la fonction VLOOKUP donc notamment); ou est-ce que je m'y suis simplement pris comme un manche?(si oui, i beg your pardon, excel et vb ensemble, j'etais vierge il y a deux jours xD).
Ensuite j'aimerais savoir sil es tpossible d'utiliser des fonction comme vlookup directement depuis vb6 par example dans l'optique de faire aller mon traitement à la meme vitesse que feu la macro de ma boss?
En vous remerciant d'avance, pour toute aide, réponse, etc...
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 6 sept. 2006 à 23:04
Salut,
"j'aimerais savoir sil es tpossible d'utiliser des fonction comme
vlookup directement depuis vb6 par example dans l'optique de faire
aller mon traitement à la meme vitesse que feu la macro de ma boss"
>> je sais pas si ce sera aussi rapide (toi t'es obligé de charger tes fichiers excels, que ta supérieure hierarchique les a déjà ouverts, puisqu'elle est en vba)
mais oui, tu peux utiliser la fonction VLOOKUP, dans le sens où vb6 ne la connait pas, mais excel oui.
Il te suffit de placer
"=VLOOKUP(RC[-4],'[myreceipts.xls]Receipts'!C1:C2,1,FALSE)"
dans tes cellules concernées, et Excel les traduira.
@++
<hr size="2" width="100%" />
--Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
<!--
gnieark
Messages postés53Date d'inscriptionjeudi 17 août 2006StatutMembreDernière intervention22 octobre 2010 6 sept. 2006 à 23:30
Réponse partielle à Alexdam>>> oui le pilotage de Excel (ou de word) est très long. je te conseille de "transvaser ton fichier excel dans un fichier texte. et à l'ouverture de ton programme de l'ouvrir pour le charger dans un tableau de variables.
L'inconvéniant c'est que les formules toutes faites d'excell (du syle moyenne, écart type...) faudra que tu les refasse en VB. mais ce sera beaucoup plus efficace.
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 7 sept. 2006 à 02:58
D'une part, dans ton cas, je n'utiliserais pas 2 boucles mais une seule
qui boucle une colonne d'un fichier et à chaque valeur, tu utilises
Find pour trouver dans l'autre fichier. C'est beaucoup plus rapide que
2 boucles.
Pour ce qui est de sa méthode, elle est exploitable sous VB, en utilisant les références et les objets qu'il faut.
.
Personnellement, j'utilise le Range au complet plutôt que de copier dans une cellule et de transposer cette formule aux autres
Mais je n'utilise jamais le format R1C1. J'y vais plutôt avec Formula
ou FormulaLocal qui se rapprochent plus des formules comme je les
écris... question de choix...
Donc ma formule pourrait ressembler à:
Range("I2:I" & nbLignes).Formula = _
"=VLOOKUP(A2,'[myreceipts.xls]Receipts'!C:C,1,FALSE)" 'portable en configuration anglaise ou autre
ou
Range("I2:I" & nbLignes).FormulaLocal = _
"=RechercheV(A2;'[myreceipts.xls]Receipts'!C:C;1;FAUX)" 'utilisable en configuration française uniquement
Question rapidité, il y a beaucoup de tests possibles à faire... mais
je pense qu'avec VB tu peux arriver à faire aussi vite en utilisant les
propriétés et fonctions d'Excel.
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 7 sept. 2006 à 10:12
Salut,
devant le Cells.Find(...)
mettre l'objet feuille
Dim xlApp As Excel.Applicaton
Dim xlBook As Excel.WorkBook
Dim xlSheets As Excel.WorkSheet
Set xlApp = CreateObject("Excel.Application")
Set xlBook = xlApp.WorkBooks.Open ("C:\chemin\nom fichier.xls")
Set xlSheets = xlBook.Sheets("nom de ta feuille")
AlexDam
Messages postés31Date d'inscriptionmercredi 6 septembre 2006StatutMembreDernière intervention10 octobre 2006 7 sept. 2006 à 10:35
Ok, j'en suis arriver a la, je sens que je suis pas trop loin, si t'avais encore un petit indice pour me mettre sur la voie:
i = 2
While eWorkSheet.Cells(i, 2) <> ""
If eWorkSheet1.Range("A1", "A70").Find(What:=eWorkSheet.Cells(i, 2), After:=ActiveCell, LookIn:=xlValues, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False) Then
Else
Print "il faut ajouter celle de la ligne" & i
i = i + 1
End If
Wend
AlexDam
Messages postés31Date d'inscriptionmercredi 6 septembre 2006StatutMembreDernière intervention10 octobre 2006 7 sept. 2006 à 12:49
Ah oui, au cas ou il y a eu ambiguite, j'essai toujours de faire marcher mon truc sous vb6.0 et non en tant que macro. C'est au cas ou je m'etais mal exprimer a un moment ou a un autre...
AlexDam
Messages postés31Date d'inscriptionmercredi 6 septembre 2006StatutMembreDernière intervention10 octobre 2006 7 sept. 2006 à 13:26
Sinon, autre question (en plus de mon mismatch). Puis-je simplement importer ses macros dans un module VB et les utiliser sur le fichier? SI oui... eee... comment? (quoi ? qui a dit je saoul ; ;).
AlexDam
Messages postés31Date d'inscriptionmercredi 6 septembre 2006StatutMembreDernière intervention10 octobre 2006 8 sept. 2006 à 09:36
En fait j'ai une worksheet ou j'ai ma liste de toutes mes recettes a cheker dirons nous(le tout dans un colonne); et une seconde worksheet qui comporte toutes les recettes existantes.
AlexDam
Messages postés31Date d'inscriptionmercredi 6 septembre 2006StatutMembreDernière intervention10 octobre 2006 8 sept. 2006 à 10:03
Re, (et merci de me repondre a chque fois lol),
Ce coup ci j'ai droit a un beau method or data member not foun -_-+ (je commence a me rappeller pourquoi j'ai voulu me mettre au commerce ; ;).
Et si je mais en comment la ligne avec le MsgBox, il me reste quand meme cette erreur runtime 13, type mismatch.
Sinon, oui je voudrais cheker dans la second feuille (premiere colonne), si les infos de ma premiere feuille sont presentes. Si elles ne le sont pas, je mets just un message "oui sil vous plait regardez, la recette de la ligne x n'est pas dans le livre des recettes" (c'est pour ça que je voulais savoir comment recuperer les "oui j'ai fin dun truc" ou l'inverse).
AlexDam
Messages postés31Date d'inscriptionmercredi 6 septembre 2006StatutMembreDernière intervention10 octobre 2006 8 sept. 2006 à 10:41
Ok, ça m'a l'air niquel. J'ai tester avec un fichier comportant 65 000 "recettes" a cheker et il fait le traitement sans planter en 3-4 secondes (j'en conclu qu'il effectue bien le find ^^). J'aimerais juste savoir s'il est possible de recuperer le resultat de la recherche sous forme de booleen ou autre.
Mais c'est cool, je te remercie.