XL 2010 Macro traitant les écarts d'inventaire

zozo

XLDnaute Junior
Bien le bonjour à tous les membres du forum,

Ce travail consiste à traiter les écarts d’inventaire de fin d’année dont je joint mon fichier.

1-Écarts Négatifs : A partir de la feuille « BComptable », dans le cas où un code n’existe pas sur la feuille « BPhysique », cela signifie que l’article en question est introuvable et doit apparaître sur la feuille « E.Négatif ».

2-Écarts Positifs : A partir de la feuille « BPhysique », dans le cas où la cellule du code est vierge sur la feuille « BPhysique », ou bien il n’existe pas sur la feuille «BComptable », cela signifie que l’article en question est nouvellement acquis, et doit apparaître sur la feuille « E.Positif ».

Le problème, c’est que la macro ne me donne pas le résultat que je veux atteindre.

Exemple, sur la feuille « E.Positif », je dois avoir l’enregistrement N°29.

Exemple, sur la feuille « E.Négatif », je dois avoir les enregistrements N° 1 et le N°5.

Merci pour toute intervention.
 

Fichiers joints

Dernière édition:

sylvanu

XLDnaute Nouveau
Bonjour Zozo,
Ton code me semble complexe, je n'ai pas tout comrpis.
As tu remarqué que le N°29 manquant est la dernière ligne de BPhysique, et que le N°5 manquant est la dernière ligne de BComptable.
N'aurais tu pas simplement un problème d'indice de fin de tableau , N à la place de N+1 ?
J'ai mis "a = UBound(TabEcritures, 1) " et en pas à pas il me donne a=5 alors que la table BComptable à 6 éléments.
Est un début de piste ?
 

sylvanu

XLDnaute Nouveau
C'est re-moi.
Une autre piste. En faisant du pas à pas, on s'aperçoit que les éléments 5 et 29 sont déclarés comme trouvés, donc normal qu'ils disparaissent.
Donc le bug doit se trouver qualque part dans ces lignes :
If TabEcritures(j, 2) <> Cle Or TabEcritures(j, 2) = "" Then
TabEcritures(j, UBound(TabEcritures, 2)) = "Trouvé"
TabEcritures(i, UBound(TabEcritures, 2)) = "Trouvé"
End If
et leur équivalent pour l'autre.
En pas à pas ça devrait le faire ...
 

sylvanu

XLDnaute Nouveau
C'est re-moi. J'ai pas pu m'empecher de gratter un peu.
Si on met un point d'arrêt sur With Sheets("E.Positif") et qu'on examine le contenu de TabEcritures on voit que 29 a été taggé Trouvé. Donc le bug vient bien des lignes qui décident si un input est trouvé ou non.
Inventaire.jpg
Sur ce, bonne nuit. A+
 

sylvanu

XLDnaute Nouveau
Ma Pomme, je ne connaissais pas la struture Dictionnaire, et je me suis renseigné pour m'améliorer.
Certains articles disent qu'il faut valider la référence Microsoft Scripting Runtime pour utiliser la notion de Dictionnaire.
Or dans ton fichier qui marche impeccable, cette référence n'est pas validée chez moi. Et ca marche.
Donc cette référence ne sert à rien dans le cas présent ou est t-elle validée par CreateObject("scripting.dictionary") ?
A+
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Donc cette référence ne sert à rien dans le cas présent ou est t-elle validée par CreateObject("scripting.dictionary") ?
Oui c'est exact, si on utilise CreateObject on peut se passer d'activer la référence. Cette liaison est faite au moment de l'exécution de l'instruction.
C'est ce que les Anglo-saxons appellent le late-binding (l'activation de la référence étant appelé du early-binding)


Mais on peut aussi activer la référence Microsoft Scripting Runtime et déclarer la variable dictionary: Dim dico as new Dictionary.
Dans ce cas:
  • la référence est automatiquement crée dans l'environnement du destinataire
  • quand on écrit le code, le fait de taper dico. affiche l'ensemble des propriétés et méthode de l'objet Dictionary (ce qui est sympa)
Attention! les utilisateur de MAC ne disposent pas de cette structure
 

job75

XLDnaute Barbatruc
Bonsoir zozo, sylvanu, mapomme,

Si les tableaux des 2 premières feuilles ne sont pas trop grands on peut se passer du VBA.

Voyez le fichier .xlsx joint et les formules dans les 2 dernières feuilles, matricielles en colonne A.

A+
 

Fichiers joints

Haut Bas