VBA : Petit mystère Excel (Problème de format?)

Y compris Power BI, Power Query et toute autre question en lien avec Excel
Répondre
Avatar du membre
Yvouille
Passionné d'Excel
Passionné d'Excel
Messages : 9'116
Appréciations reçues : 89
Inscrit le : 6 avril 2007
Version d'Excel : 2016

Message par Yvouille » 11 juin 2014, 21:14

Bonjour,

Afin de pouvoir comparer un très grand nombre de données, j’ai cherché une solution en passant par des tableaux VBA.

Mon code fonctionne assez bien, à l’exception d’un petit mystère qui m’embête bien. Afin d’en faire la démonstration, j’ai réduit mon fichier ci-joint à une ligne alors que qu’il peut aller jusqu’à 1500 lignes environ.

Mon problème est que si je lance la macro placée derrière le ‘Bouton 1’, les résultats en E5 et en H5 ne sont pas identiques, alors que les données de base – en C5:D5 et en F5:G5 - semblent tout à fait égales. Afin d’en avoir la preuve, j’ai effectué des tests en A12 et B12. Le format des cellules C5:D5 et F5:G5 est également identique de prime abord.

En deux mots voici les étapes principales de ma macro : ça remplit un Tableau_A avec les données des colonnes C à BD, ça place en colonnes IA et IB – les unes à la suite des autres - les données des colonnes BF:DY, ça trie les colonnes IA et IB, ça charge le Tableau_B avec les données des colonnes IA:IB, ça compare en boucle les données du Tableau_A avec les données en boucle du Tableau_B afin de trouver des chevauchements de période entre les deux (mais afin de réduire le nombre de comparaisons nécessaires, ça recherche au préalable par les instructions 'WorksheetFunction.Match' les données du Tableau_B qu’il est nécessaire de traiter), ça charge le Tableau_C avec les résultats trouvés, résultats qui sont finalement placés dans les colonnes E, H, K, etc.

Afin de bien voir le problème, il faudrait placer un point d’arrêt sur la ligne If Inférieur_majoré <= Tableau_B(m, 2) And Inférieur >= Tableau_B(m, 1) Then Compteur_Bis = 1. A la première pression sur la touche F5, k =1, m =18, Inférieur_majoré = 00:18:10, Tableau_B(m, 2) = 00:18:10, Inférieur = 00:18:00 et Tableau_B(m, 1) = 00:17:10. Bizarrement, en appuyant alors sur la touche F8, le code ne passe pas par Then Compteur_Bis = 1, ce que je n’arrive absolument pas à expliquer.

Ci-dessus, les valeurs des variables Inférieur_majoré, Tableau_B(m, 2), Inférieur et Tableau_B(m, 1) correspondent aux données des cellules C5:D5.

En appuyant 3 fois sur F5 - jusqu’à ce que k = 2 et m = 18, les autres variables correspondant alors aux données des cellules F5:G5 et étant, à ce que je peux constater, absolument identiques – et en appuyant une fois sur F8, le code passe cette fois par Then Compteur_Bis = 1, ce qui correspond à ce que je désirerais.

Si j’effectue un copier-coller des cellules C5:D5 ou F5:G5 vers un autre endroit du tableau de gauche (par exemple collé en I5:J5), le problème suit.

Avez-vous une idée pour résoudre mon problème ?
Yvouille

Valais de Coeur
Avatar du membre
Nad
Passionné d'Excel
Passionné d'Excel
Messages : 4'813
Appréciation reçue : 1
Inscrit le : 16 mars 2008
Version d'Excel : 2003 FR - 2007 FR

Message par Nad » 11 juin 2014, 21:16

Bonsoir
Yvouille a écrit :j’ai réduit mon fichier ci-joint
Il est où le fichier ?
Ah ces nouveaux membres !!! :lol: :lol:

Amicalement
Nad
Avatar du membre
Yvouille
Passionné d'Excel
Passionné d'Excel
Messages : 9'116
Appréciations reçues : 89
Inscrit le : 6 avril 2007
Version d'Excel : 2016

Message par Yvouille » 11 juin 2014, 21:30

Oh, la honte :)

Merci Nad de m'avoir rendu attentif à cela.

Très bonnes salutations et ..... au plaisir de lire ta solution :D
Démo Forum.zip
(122.81 Kio) Téléchargé 17 fois
Yvouille

Valais de Coeur
Avatar du membre
Nad
Passionné d'Excel
Passionné d'Excel
Messages : 4'813
Appréciation reçue : 1
Inscrit le : 16 mars 2008
Version d'Excel : 2003 FR - 2007 FR

Message par Nad » 11 juin 2014, 21:47

Re

L'erreur vient de F5.
Bien que C5=F5 si tu revalides F5 tu obtiens bien 2
Par contre, te dire le pourquoi du comment ...

Nad
Avatar du membre
Yvouille
Passionné d'Excel
Passionné d'Excel
Messages : 9'116
Appréciations reçues : 89
Inscrit le : 6 avril 2007
Version d'Excel : 2016

Message par Yvouille » 12 juin 2014, 08:05

Salut Nad et merci pour ta réponse.

J’avais bien remarqué qu’en réinscrivant les données, ça modifiait les résultats. Mais tout d’abord ça les modifie dans le faux sens (en réinscrivant F5, je ne trouve plus que 2 occurrences alors que selon moi il y en a 3, comme avant la modification de F5) et secondement si j’ai un tableau de 1500 lignes, je ne vais pas pouvoir réécrire toutes les cellules des 18 paires de colonnes de C à BC.

Il me semble pourtant que lors du passage sur la ligne mentionnée dans mon premier message, la première condition est remplie [If Inférieur_majoré <= Tableau_B(m, 2), 00 :18 :00 est bien égal à 00 :18 :00] ainsi que la deuxième condition [ And Inférieur >= Tableau_B(m, 1), 00 :18 :00 est bien supérieur à 00 :17 :10].

Je cherche donc toujours une solution afin de trouver 3 occurences avec ces données.

A vous relire.
Yvouille

Valais de Coeur
Avatar du membre
Banzai64
Fanatique d'Excel
Fanatique d'Excel
Messages : 16'690
Appréciations reçues : 5
Inscrit le : 21 novembre 2010
Version d'Excel : 2003 FR (learning 2010 - 2013)

Message par Banzai64 » 12 juin 2014, 11:52

Bonjour

Une autre piste à explorée : Le stockage des données par XL

Il y a souvent des erreurs de calculs avec les nombres non entier

Le moyen utilisé est d'arrondir

Essayes
        If Round(Inférieur_majoré, 8) <= Round(Tableau_B(m, 2), 8) And Inférieur >= Tableau_B(m, 1) Then Compteur_Bis = 1
Avatar du membre
Yvouille
Passionné d'Excel
Passionné d'Excel
Messages : 9'116
Appréciations reçues : 89
Inscrit le : 6 avril 2007
Version d'Excel : 2016

Message par Yvouille » 12 juin 2014, 12:14

Salut Banzai et merci pour ton intervention,

A première vue, ta solution semble résoudre tous mes problèmes :) …… en espérant que ça n’en crée pas d’autres à un autre niveau.

J’avais travaillé au début avec des heures décimales arrondies à 10 chiffres après la virgule (ce qui s’est avéré exagéré) mais ça créait d’autres problèmes à d’autres niveaux, d’où mon passage aux heures au format ‘Date’, de plus bien plus agréable à lire en tant que variables. Mais je n’aurais jamais pensé qu’il fallait quand même arrondi ces données ‘Date’.
Banzai64 a écrit :Une autre piste à explorée : Le stockage des données par XL
Je ne connais pas du tout. Est-ce une solution beaucoup plus rapide que les tableaux VBA ?

A te relire.
Yvouille

Valais de Coeur
Répondre
  • Sujets similaires
    Réponses
    Vues
    Dernier message