Bonjour,
existe-t-il une instruction pour pouvoir comparer en 1 passage 2 tables dynamiques ayant le même nombre d'élements du même type ?
On peut rêver![]()
Bonjour,
existe-t-il une instruction pour pouvoir comparer en 1 passage 2 tables dynamiques ayant le même nombre d'élements du même type ?
On peut rêver![]()
Salut,
qaund tu parles de comparer, ca serait en terme de contenu, de structure, les deux mon capitaine ?
Le plus efficace serait eventuellement une requete SQL sous Access![]()
Cycle de vie d'un bon programme :
1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise
Pas de question technique par MP, je ne réponds pas
Mes ouvrages :
Migrer les applications VBA Access et VBA Excel vers la Power Platform
Apprendre à programmer avec Access 2016, Access 2019 et 2021
Apprendre à programmer avec VBA Excel
Prise en main de Dynamics 365 Business Central
Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
Pensez à consulter la FAQ Excel et la FAQ Access
Derniers tutos
Excel et les paramètres régionaux
Les fichiers Excel binaires : xlsb,
Autres tutos
Juste le contenu mon capitaine.
Je fais sous excel un tri totalement variable de mes données avec un nombre de colonnes de tri variable aussi.
Ensuite je veux tester les ruptures sur mes zones de matching qui sont là aussi variable.
D'où mon utilisation de tables pour comparer les valeurs.
Je ne suis pas très disposé à faire un sql pour si peu, alors qu'une boucle est vachement plus courte à mettre en oeuvre.
J'ai besoin de ce tester pour générer une nouvelle clé pour ma DB en cas de rupture.
Voici l'extrait de mon code, avec boucle
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 'Init Old Matching Values For off = 0 To UBound(TMatch) OVmatch(off) = Mysh.Range(TMatch(off) & lrow) Next off 'init Event Nbr EventNbr = 1 'Loop on data lines For lrow = Xls_File_First_Line To Mysh.Range("A65535").End(xlUp).Row 'Init Current Matching values and compare with old Rupt = False For off = 0 To UBound(TMatch) CVMatch(off) = Mysh.Range(TMatch(off) & lrow) If CVMatch(off) <> OVmatch(off) Then Rupt = True End If If Rupt Then OVmatch(off) = CVMatch(off) End If Next off 'If rupture in matching Increment EventNbr If Rupt Then EventNbr = EventNbr + 1 End If 'Store EventCode in Mysh.Range(Xls_File_Reference_Key & lrow) = Xls_Importing_Event_Prefix & Format(EventNbr, "0000")
Hum, en faisant une formule match sur la concatenation de tous tes champs de la table 1 vers la table 2 et vice versa ferait-elle l'affaire ?
Cycle de vie d'un bon programme :
1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise
Pas de question technique par MP, je ne réponds pas
Mes ouvrages :
Migrer les applications VBA Access et VBA Excel vers la Power Platform
Apprendre à programmer avec Access 2016, Access 2019 et 2021
Apprendre à programmer avec VBA Excel
Prise en main de Dynamics 365 Business Central
Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
Pensez à consulter la FAQ Excel et la FAQ Access
Derniers tutos
Excel et les paramètres régionaux
Les fichiers Excel binaires : xlsb,
Autres tutos
Bonjour
En transformant les tableaux en variable "texte" avec Join, on peut les comparer avec InStr :
à plus
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 Sub Compare_deux_tableaux() FlagId = 0 Dim laliste1(10000) Dim laliste2(10000) For i = 1 To 10000 laliste1(i) = "essai de comparaison de contenu de tableaux" & i laliste2(i) = "essai de comparaison de contenu de tableaux" & i Next i 'laliste2(5) = "erreur" ' pour tester la comparaison liste1 = Join(laliste1, ",") liste2 = Join(laliste2, ",") If InStr(liste1, liste2) <> 0 Then FlagId = 1 If FlagId = 1 Then Msg = "Listes identiques" Else Msg = "Listes différentes" MsgBox Msg End Sub
Bonjour,
merci à tous les 2.
J'avais pensé à une solution de ce genre, mais je pense qu'elle ne fonctionnera pas si un des éléments du tableau est vide pour une entrée.
je m'explique :
Tableau 1 : AAA BBB C
Tableau 2 : AAA BBBC
Je crois qu'ici le join puis instr ne va trouver de différence.
Alors dans ce cas, il faut trouver la longueur max de chaque éléments et générer des entrées de string à space de la longueur max pour les chaines vide pour forcer la comparaison globale correcte.
Mais, cela devient un peu
-----------Edit--------
Je suis idiot. ca marche très bien gâce à ,.
Mais j'ai quand même un problème.
Quand je veux refaire split du résultat du join pour le remettre dans 1 des tables, ca calle avec "Type mismatch" (ligne en gras).
Les 2 tables sont variant, CVM et OVM sont string. j'ai essayé tout en variant, ca plante aussi.
Cela ne fonctionne qu'avec tout en String. J'aurais voulu garder mes tables en variant.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 'If rupture in matching Increment EventNbr and set old to currentr CVM = Join(CVMatch, "|") OVM = Join(OVmatch, "|") If InStr(CVM, OVM) = 0 Then 'Difference car pas trouvé Rupt = True OVmatch = Split(CVM, "|") 'Set old to current EventNbr = EventNbr + 1 End If
Partager