VBA Excel : Boucle qui oublie des données ?

Résolu
Phoenellion Messages postés 116 Date d'inscription   Statut Membre Dernière intervention   -  
Amricain59 Messages postés 1 Date d'inscription   Statut Membre Dernière intervention   -
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 !!

2 réponses

Géca Messages postés 799 Date d'inscription   Statut Contributeur Dernière intervention   106
 
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   Statut Membre Dernière intervention   33
 
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   Statut Membre Dernière intervention   33
 
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   Statut Membre Dernière intervention   33
 
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   Statut Contributeur Dernière intervention   106
 
Tant mieux.
0
Géca Messages postés 799 Date d'inscription   Statut Contributeur Dernière intervention   106
 
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   Statut Membre Dernière intervention   33
 
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   Statut Contributeur Dernière intervention   106
 
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   Statut Membre Dernière intervention   33
 
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   Statut Membre Dernière intervention   > Phoenellion Messages postés 116 Date d'inscription   Statut Membre Dernière intervention  
 

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