VBA Excel : Boucle qui oublie des données ?

Résolu/Fermé
Phoenellion Messages postés 116 Date d'inscription dimanche 14 septembre 2008 Statut Membre Dernière intervention 30 août 2012 - Modifié par Phoenellion le 17/02/2012 à 00:07
Amricain59 Messages postés 1 Date d'inscription dimanche 31 juillet 2022 Statut Membre Dernière intervention 31 juillet 2022 - 31 juil. 2022 à 14:34
Bonjour à tous,

je bataille depuis des jours pour faire l'équivalent d'un RecherchV entre deux tables de données en VBA. Car faire un simple RecherchV dans excel fait planter Excel...
Je pars d'une table détail qui contient un numéro de facture et un numéro d'article, et d'une table facture qui contient un numéro de facture et une date de facturation. Et le but est d'attribuer à chaque ligne de détail, une date de facturation.
J'ai fini par aboutir à cette boucle qui fait comme un RechercheV, mais en passant par des variable tableaux et qui ne plante pas Excel.

ReDim TabDetFact(LigDet, ColDet + 2) As Variant    
    x = 0    
    x2 = 1    
    For x1 = 1 To LigDet 'nombre de lignes dans Détail    
        z = 0    
        For x2 = x2 To LigFact 'nombre de lignes dans Facture    
            If TabFacture(x2, 1) = TabDetail(x1, 1) Then    
                z = 1    
                Exit For    
            End If    
        Next x2    
        If z = 0 Then    
            TabDetFact(x, 0) = TabDetail(x1, 1)    
            TabDetFact(x, 1) = TabDetail(x1, 2)    
            TabDetFact(x, 2) = TabDetail(x1, 3)    
            TabDetFact(x, 3) = "NoMatch"    
            TabDetFact(x, 4) = 0    
            x2 = 1    
        Else:    
             TabDetFact(x, 0) = TabDetail(x1, 1)    
             TabDetFact(x, 1) = TabDetail(x1, 2)    
             TabDetFact(x, 2) = TabDetail(x1, 3)    
             TabDetFact(x, 3) = TabFacture(x2, 2)    
             TabDetFact(x, 4) = TabFacture(x2, 3)    
        End If    
        x = x + 1    
    Next x1    


Comme les numéros de facture se suivent plus ou moins dans les deux tables, la première boucle ne recommence pas à la première ligne de la table facture, j'y gagne beaucoup de temps mais il peut y avoir quelques oublis, donc uniquement pour ces résultats, je reprends la recherche à zéro systématiquement.

' Récupération des NoMatch    
    For x = 0 To UBound(TabDetFact)    
        If TabDetFact(x, 3) = "NoMatch" Then    
            z = 0    
            For x2 = 1 To LigFact    
                If TabFacture(x2, 1) = TabDetFact(x, 0) Then    
                    z = 1    
                    Exit For    
                End If    
            Next x2    
            If z = 1 Then    
                 TabDetFact(x, 3) = TabFacture(x2, 2)    
                 TabDetFact(x, 4) = TabFacture(x2, 3)    
            End If    
        End If    
    Next x


J'ai fait des tests sur de petites tables (détail = 300 000 lignes, facture = 30 000 lignes), ça fonctionne à merveille.
Le problème, c'est que sur des tables plus grosses, ça ne fonctionne pas. (détail = 1 000 000 lignes, facture = 300 000 lignes).

La boucle attribue des valeurs fausses, presque du début à la fin.

J'ai exactement le même problème en passant par des requêtes dans Access. La requête fonctionne sur les petites tables et fait exactement la même erreur sur les grandes tables.

Obtenir la même erreur avec deux procédés complètements différents... C'est fort, et j'ai beau me dire que c'est moi qui déraille, je n'arrive pas à trouver mon erreur.

A l'aide !!
A voir également:

2 réponses

Géca Messages postés 799 Date d'inscription samedi 29 novembre 2003 Statut Contributeur Dernière intervention 29 juin 2015 106
17 févr. 2012 à 00:05
Bonsoir,

Utilisez les points d'arrêt et espionnez les valeurs des variables afin de debugguer ce qui ne va pas.
--
0
Phoenellion Messages postés 116 Date d'inscription dimanche 14 septembre 2008 Statut Membre Dernière intervention 30 août 2012 32
17 févr. 2012 à 00:14
Bonsoir,

je vais essayer ça, j'espère avoir la patience, vu le nombre de lignes :)

Je reviens quand j'ai du nouveau.

Merci
0
Phoenellion Messages postés 116 Date d'inscription dimanche 14 septembre 2008 Statut Membre Dernière intervention 30 août 2012 32
17 févr. 2012 à 00:56
Bon, voilà ce que j'ai fait :
j'ai changé z par une variable boolean puis espion si arrêt si vrai
j'espionne les variables numéro de facture dans les deux tableaux ainsi que la variable date.
j'ai lancé la procédure, mais comme il s'arrête à chaque z = vrai, ça reviens à faire du pas à pas.
en tenance F5 appuyé ça fait planter access (oO)

Si je lance la procédure juste en espionnant les variables des numéro de facture et de la date trouvée, Access "ne répond pas" dans qu'il n'a pas fini la boucle... Donc les valeurs espionnées ne sont pas affichées.
0
Phoenellion Messages postés 116 Date d'inscription dimanche 14 septembre 2008 Statut Membre Dernière intervention 30 août 2012 32
17 févr. 2012 à 01:29
Me revoici.

Eh bien moral de l'histoire, je ne suis pas fou... il manque tout simplement une grande partie du fichier détail...

Le problème vient peut être du fait que j'importe une fichier DBF dans Excel avant de faire les traitements.
Là où je suis rassuré, c'est que je ne suis pas fou !
0
Géca Messages postés 799 Date d'inscription samedi 29 novembre 2003 Statut Contributeur Dernière intervention 29 juin 2015 106
17 févr. 2012 à 01:32
Tant mieux.
0
Géca Messages postés 799 Date d'inscription samedi 29 novembre 2003 Statut Contributeur Dernière intervention 29 juin 2015 106
17 févr. 2012 à 01:09
Plus je regarde votre code et plus je me dis que ça doit se faire en langage SQL.

Ça donnait quoi la requête en SQL ?

Conseil personnel : vous devriez migrer vos données vers un véritable serveur de bases de données.
--
0
Phoenellion Messages postés 116 Date d'inscription dimanche 14 septembre 2008 Statut Membre Dernière intervention 30 août 2012 32
Modifié par Phoenellion le 17/02/2012 à 04:12
En SQL, la requête donne :
SELECT detail.NART, detail.QTE, Prépa_Facture.TYPFACT, Prépa_Facture.TIERS, Prépa_Facture.DATFACT INTO Prépa_DetFact    
FROM detail INNER JOIN Prépa_Facture ON detail.NUMFACT = Prépa_Facture.NUMFACT    
ORDER BY detail.NART, Prépa_Facture.DATFACT DESC;

Elle fonctionne pour peu que tout le fichier détail soit importé.

Et c'est toute la base du problème en fait. Initialement, ces données sont des sauvegarde d'un logiciel d'exploitation sotckées dans des BDD de type dBase (.dbf) mais je ne parviens pas à les importer dans Access car j'ai le message :
"Le type de base de donnée dBaseIII n'est pas installé ou ne gère pas l'opération sélectionnée"
ma commande est :

DoCmd.TransferDatabase acImport, "dBaseIII", Chemin_DBF, acTable, "detail.dbf", "Détail"

Du coup je fais une pirouette en l'important dans excel (2010) puis en important le classeur excel dans Access. mais Excel ne semble pas digérer la base de donnée et s'arrête à 1048572 lignes. (étrange vu que Microsoft assure qu'Excel 2010 n'est limité que par la mémoire vive, et de ce côté là, j'ai de quoi faire)

Il faut donc que je résolve mon problème d'importation directe du fichier dbf dans access.
Je pourrais pré enregistrer les importation et les exécuter avec :

DoCmd.RunSavedImportExport "Importation enregistrée"

Mais Outre le fait que cela m'oblige à préenregistrer une 50aine d'importations, je voudrais y parvenir en pur VBA car quand ce programme sera fonctionnel je compte le traduire en VB.
0
Géca Messages postés 799 Date d'inscription samedi 29 novembre 2003 Statut Contributeur Dernière intervention 29 juin 2015 106
17 févr. 2012 à 10:13
Bonjour,

Vous devriez posez cette question d'importation de données d'une base dBase (.dbf) vers Access sur le forum base de données.

Votre script n'est pas faux, ce sont les données sur lesquels vous travaillez qui sont corrompues.

Pour finir, juste à titre de conseil sans être un expert base de données, au vu de la taille de vos tables vous devriez migrer vers une solution SQL Server ou MySQL ou PostgreSQL ou Oracle.
0
Phoenellion Messages postés 116 Date d'inscription dimanche 14 septembre 2008 Statut Membre Dernière intervention 30 août 2012 32
Modifié par Phoenellion le 19/02/2012 à 21:42
Bonjour,

merci pour vos conseils. Concernant le problème d'importation, c'est tout bête j'oubliais l'espace entre dBase et le numéro de version.

Quand à migrer vers du SQL, je crois que cela ne dépend pas de moi car je puise dans des bases de données déjà existantes. De plus, je n'ai aucune connaissance dans ce domaine, bien qu'après cette mésaventure, je pense que ce sera mon prochain objectif d'apprentissage.

Encore merci et bonne continuation.
0
Amricain59 Messages postés 1 Date d'inscription dimanche 31 juillet 2022 Statut Membre Dernière intervention 31 juillet 2022 > Phoenellion Messages postés 116 Date d'inscription dimanche 14 septembre 2008 Statut Membre Dernière intervention 30 août 2012
31 juil. 2022 à 14:34

Bonjour Phoenellion,

Vous avez l'air de maitriser Dbase?

Je suis utilisateur de Dbase pour de la gestion de stock mais je ne trouve pas la table d'enregistrement dans laquelle le stock à été sauvegardé. Savez vous comment faire pour la retrouver ou bien pour en créer une nouvelle que je puisse y accéder.

Merci pour votre aide


Amricain

0