Chères amies, chers amis du forum
Je dois verifier les occurrence manquante sur un vecteur de string vs un autre vecteurs, existe il une fonction dans VBA qui fais cela?
Sinon j'ai penser a un algo avec recherche avec un flag.
Merci
Chères amies, chers amis du forum
Je dois verifier les occurrence manquante sur un vecteur de string vs un autre vecteurs, existe il une fonction dans VBA qui fais cela?
Sinon j'ai penser a un algo avec recherche avec un flag.
Merci
Bonjour,
avant le fichier, déjà une présentation claire & exhaustive sans recourir à un décodeur ! …
C'est vrai j'ai été un peu sec:
soit deux tableaux, un tableau de référence
tab1:
1
2
3
et un que l'on doit tester:
1
2
3
4
5
Ma macro doit m'afficher 4 & 5 c-à-d les valeurs manquantes dans tableau de référence qui existe dans le tableau a tester.
Alors j'ai codé ceci:
Ce code est plutot rapide (sur une colonne a tester de 56000 ligne et une colonne de ref 250 environ une seconde a vue de nez) et fonctionne bien, cepandant j'aurais aimé savoir si il n'ya pas moyen d'avoir mieux en faisant appel a des fonction interne a VBA, ou si vous avez un algo plus sympa que celui là a me proposer.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 Sub checkmissingcode() Dim flag As Boolean Dim Testab() As String Dim Testab2() As String Dim i, j, k, intRow, intRow2 As Long intRow = Range(Cells(1, 2), Cells(1, 2).End(xlDown)).Count - 1 intRow2 = Range(Cells(1, 3), Cells(1, 3).End(xlDown)).Count - 1 ReDim Testab(intRow) 'Tableau de référence ReDim Testab2(intRow2) 'Tableau à verifier 'Initialisation du tableau de référence For i = 0 To intRow Testab(i) = Cells(i + 1, 2).Value Next i 'Initialisation du tableau à tester For i = 0 To intRow2 Testab2(i) = Cells(i + 1, 3).Value Next i 'recherche des éléments manquants du tableau de référence dans le tableau à tester k = 0 For i = 0 To intRow2 flag = False j = 0 'tant que le drapeau est bas et que je n'ai pas parcouru le tableau de référence While (flag = False And j < intRow) 'si la valeur testé apparait dans le tableau de référence 'on léve le drapeaux tableaux pour sortir de la boucle If Testab2(i) = Testab(j) Then flag = True End If j = j + 1 Wend 'si la valeur n'est pas apparue c-à-d que le drapeau est rester bas 'la valeur n'existe pas dans le tableau de référence 'puis je j'ajoute la valeurs trouver à la derniere ligne de mon tab de ref 'pour eviter les doublons If flag = False And j = intRow Then Cells(1, 2).End(xlDown).Offset(1, 0).Value = Testab2(i) Cells(1, 2).Select intRow = intRow + 1 ReDim Preserve Testab(intRow) Testab(intRow) = Testab2(i) End If Next i End Sub
Enfin j'ai un petit souci certaine valeurs apparaissent deux fois dans le résultats final par exemple:
tabref:
1
2
3
et tabtest:
1
2
3
4
4
5
5
5
mon algo me retourne un tableau de 3 ligne avec 4,5 & 5. Ce n'est pas aléatoire car ce sont toujours les meme valeurs qui s'affiche en double ( et pas en triple).
Merci
Utiliser des variables tableaux est préconisé pour gagner du temps mais l'alimenter via une boucle en fait perdre !
Et c'est inutile car une plage de cellules peut être directement affectée à une variable tableau …
Deux méthodes possibles :
soit utiliser les fonctions de feuille de calculs EQUIV (Match en VBA) et INDEX entre les variables tableaux
soit utiliser des dictionnaires (objet Dictionary à consulter dans l'aide VBA intégrée) …
La seconde est peut-être la plus technique mais a des chances d'être la plus rapide.
Parmi tant d'autres sur le forum, exemple dans cette discussion d'utilisation d'un dictionnaire …
Merci je vais étudier les solution proposé, cependant pour l'affectation des tableaux j'ai un souci:
Si je reste sur une boucle pour alimenter mon tableaux je me retrouve avec un vecteur a une seule coordonnée par valeur:
Si j'affecte directement le tableau via:
Là j'ai deux problème je n'arrive pas a déclarer un tableaux autre que variant (je souhaites ici declarer un tableau string) car j'ai une incompatibilité de type, et pour accéder a mes valeurs j'ai besoin de deux coordonné (l'abscisse est toujours egal à 1):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Dim Testab() As Variant Testab = Range(Cells(1, 2), Cells(1, 2).End(xlDown)).Value
![]()
Est ce que cela impact ma macro, comment faire pour declarer un tableau de string?
Merci
Partager