VB6 et Excel

AlexDam Messages postés 31 Date d'inscription mercredi 6 septembre 2006 Statut Membre Dernière intervention 10 octobre 2006 - 6 sept. 2006 à 22:41
AlexDam Messages postés 31 Date d'inscription mercredi 6 septembre 2006 Statut Membre Dernière intervention 10 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:


Sub checkReceipts()

Range("I2").Select

ActiveCell.FormulaR1C1 = _

"=VLOOKUP(RC[-4],'[myreceipts.xls]Receipts'!C1:C2,1,FALSE)"

Range("I2:I65500").Select

Range("I65500").Activate

Selection.FillDown

Columns("I:I").Select

Selection.Copy

Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _

False, Transpose:=False

Range("A1").Select

Application.CutCopyMode = False

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

34 réponses

mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
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"
<!--
0
gnieark Messages postés 53 Date d'inscription jeudi 17 août 2006 Statut Membre Dernière intervention 22 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.

va voir là http://www.vbfrance.com/codes/IMPORTATION-FICHIER-TXT-SERVANT-MINI-BASE-DONNEES-SEPARATEURS_39150.aspx et prend pas mon code mais celui de Jean -Marc si tu choisis de suivre mon conseil
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
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

Elle fait (macro enregistrée probablement...)

'inscrire une formule dans une cellule

ActiveCell.FormulaR1C1 = _

"=VLOOKUP(RC[-4],'[myreceipts.xls]Receipts'!C1:C2,1,FALSE)"

'sélectionner le Range (colonne au complet)

Range("I2:I65500").Select

'???

Range("I65500").Activate

'copie des formules jusqu'en bas

Selection.FillDown


Je ferais:

nbLignes = objXlSheet.Cells.Find("*", objXlSheet.Range("A1"),,,xlByRows,xlPrevious).row

objXlSheet.Range("I2:I" & nbLignes).FormulaR1C1 = _


"=VLOOKUP(RC[-4],'[myreceipts.xls]Receipts'!C1:C2,1,FALSE)"


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.

MPi
0
AlexDam Messages postés 31 Date d'inscription mercredi 6 septembre 2006 Statut Membre Dernière intervention 10 octobre 2006
7 sept. 2006 à 09:37
    Ok, je vais tester avec find en premier et je vous tiens au courant.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
AlexDam Messages postés 31 Date d'inscription mercredi 6 septembre 2006 Statut Membre Dernière intervention 10 octobre 2006
7 sept. 2006 à 10:01
    I tried something like this :

    i = 2
    While eWorkSheet.Cells(i, 2) <> ""
    Call eWorkSheet1.Find(eWorkSheet.Cells(i, 2))
    i = i + 1
    Wend

    et en fait ça marchait pas >.<, donc j'ai un peu regarder sur le net et j'ai trouver en vba :

Set rCell = Cells.Find(What:=CDate(strdate), After:=Range("A1"), LookIn:=xlFormulas _
, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)

mais je sais pas comment integrer ça en vb6 maintenant :c
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
7 sept. 2006 à 10:05
Quelque chose comme ça peut-être ?
 
Set rCell =

eWorkSheet1.

Cells.Find(What: =CDate(strdate), After:=

eWorkSheet1.

Range("A1"), LookIn: =xlFormulas _
, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)







MPi
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
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")

Set rCell = xlSheets.Cells.Find(What:=CDate(strdate), After:=Range("A1"), LookIn:=xlFormulas _ , LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)

++
0
AlexDam Messages postés 31 Date d'inscription mercredi 6 septembre 2006 Statut Membre Dernière intervention 10 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

P.S. Il n'y a pas de bouton edit sur ce forum?
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
7 sept. 2006 à 10:54
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

MPi
0
AlexDam Messages postés 31 Date d'inscription mercredi 6 septembre 2006 Statut Membre Dernière intervention 10 octobre 2006
7 sept. 2006 à 11:08
    Ah oui merci ^^; mais en fait, meme comme ça, je ocntinue d'avoir une erreur : type mismatch.
0
AlexDam Messages postés 31 Date d'inscription mercredi 6 septembre 2006 Statut Membre Dernière intervention 10 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...
0
AlexDam Messages postés 31 Date d'inscription mercredi 6 septembre 2006 Statut Membre Dernière intervention 10 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 ; ;).
0
AlexDam Messages postés 31 Date d'inscription mercredi 6 septembre 2006 Statut Membre Dernière intervention 10 octobre 2006
7 sept. 2006 à 16:04
    Ok, jai trouver ça sinon :
Syntax

object.Find(target, startline, startcol, endline, endcol [, wholeword][, matchcase][, patternsearch]) As Boolean

Et, j'ai essayer d'en faire ça: mais toujours type mismatch
    Dim rrr As Boolean
  
      i = 2
    While eWorkSheet.Cells(i, 2) <> ""
    rrr = eWorkSheet1.Cells.Find(What:=eWorkSheet.Cells(i, 2), After:=eWorkSheet1.Range("A1"), LookIn:=xlValues, LookAt:= _
        xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
        , SearchFormat:=False)
       
        If rrr = False Then
        Print "il faut ajouter celle de la ligne" & i
        End If
        i = i + 1
       
     Wend

Je dois vraiment etre une nouille... (oui c'est la phase ou on en a marre de raler apres le pc et ou on cherche d'autre fautifs).
0
AlexDam Messages postés 31 Date d'inscription mercredi 6 septembre 2006 Statut Membre Dernière intervention 10 octobre 2006
7 sept. 2006 à 16:23
    SI vous pouviez aussi just eme dire la difference lorsque l'on fait un Call d'une fonction :
exemple:

 While eWorkSheet.Cells(i, 2) <> ""
    Call eWorkSheet1.Cells.Find(What:=eWorkSheet.Cells(i, 2), After:=eWorkSheet1.Range("A1:A70"), LookIn:=xlValues, LookAt:= _
        xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
        , SearchFormat:=False)

La je n'ai pas d'erreur mismatch, mais je ne vois pas commetn retrouver le resultat de mon find...
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
7 sept. 2006 à 16:31
re,

Call sert à appeler une procédure, fonction, ou fonction VB.
Occultable, mais c'est plus lisible.

While eWorkSheet.Cells(i, 2) <> ""
    Call eWorkSheet1.Cells.Find(What:= eWorkSheet.Cells(i, 2), _
        After:=eWorkSheet1.Range("A1:A70"), LookIn:=xlValues, LookAt:= _
        xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
        , SearchFormat:=False)

MsgBox eWorkSheet1.Selection.Value
<hr size="2" width="100%" />
Ps : pourquoi
While eWorkSheet.    et plus loin
Call    eWorkSheet 1 .

@++

<hr size ="2" width="100%" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
<!--
0
AlexDam Messages postés 31 Date d'inscription mercredi 6 septembre 2006 Statut Membre Dernière intervention 10 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.
0
AlexDam Messages postés 31 Date d'inscription mercredi 6 septembre 2006 Statut Membre Dernière intervention 10 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).

Merci encore, a tout bientot
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
8 sept. 2006 à 10:23
essaie comme ceci :

remplace :
Call eWorkSheet1.Cells.Find(What:=eWorkSheet.Cells(i, 2), _
After:=eWorkSheet1.Range("A1:A70"), LookIn:=xlValues, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False)

par :
Call eWorkSheet1.Range("A1:A70").Find(eWorkSheet.Cells(i, 2), , , , xlByRows, xlNext)
0
AlexDam Messages postés 31 Date d'inscription mercredi 6 septembre 2006 Statut Membre Dernière intervention 10 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.
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
8 sept. 2006 à 10:58
pour le booléen, ça dépend, qu'est ce tu veux faire exactement !
0
Rejoignez-nous