Bonjour,
Je suis assez étonné de ce dysfonctionnement :
On a une subroutine dans laquelle on fait une boucle sur un range, et dans lequel on cherche une certaine occurrence (dans la colonne A).
Et simplement, quand on trouve une occurence, on appelle une fonction qui rend un booléen (pour décider si on inscrit les données dans le ListBox) et on passe à l'occurrence suivante.
Le dysfonctionnement que je constate, c'est que selon la façon dont je code la fonction qui rend le booléen (IsDebiteur), VBA plante ou pas !
Pour bien le montrer, j'ai écrit 2 fonctions "identiques", du moins elles donnent le même résultat mais l'une est codée avec un Find, et l'autre avec une boucle For Next.
Et le dysfonctionnement est net:
Si on appelle la première fonction (IsDebiteur) la routine plante sur l'instructioncar C se retrouve bizarrement à Nothing (alors qu'on a mis une condition sur C not nothing et qu'on ne fait que des Findnext !)
Code : Sélectionner tout - Visualiser dans une fenêtre à part Loop While Not C Is Nothing And C.Address <> premier
Si on appelle la seconde (IsDebiteur2), alors ça fonctionne parfaitement, C n'est pas Nothing et le findNext fonctionne bien.
Tout a l'air de se passer comme si le Find qu'on est en train de faire dans la routine principale entrait en conflit avec le Find qui est dans la fonction IsDebiteur (interprétation personnelle!)
Voici la routine principale:
Voici la fonction IsDebiteur qui provoque un plantage:
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 Private Sub TextNom_Change() nom = Me.TextNom Me.ListBox1.Clear Set rng = BaseTatoo.Worksheets("Clients").Range("B:B") With rng Set C = .Find(nom, LookIn:=xlValues, Lookat:=xlPart) i = 0 If Not C Is Nothing Then premier = C.Address Do ' C.offset(0, -1) -> Id du client: If IsDebiteur(BaseTatoo, CLng(C.offset(0, -1).Value)) Then Me.ListBox1.AddItem Me.ListBox1.List(i, 0) = C.offset(0, -1).Value Me.ListBox1.List(i, 1) = C.Value Me.ListBox1.List(i, 2) = C.offset(0, 1).Value i = i + 1 End If Set C = .FindNext(C) Loop While Not C Is Nothing And C.Address <> premier End If End With End Sub
Voici la fonction IsDebiteur2 qui permet un fonctionnement correct. Cette deuxième fonction est pourtant totalement équivalente à la précédente (produit les mêmes valeurs), mais elle n'utilise pas de Find.
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 Public Function IsDebiteur(Book As Workbook, ByVal ClientId As Long) As Boolean Dim LastLig As Long Dim rng, C As Range Dim Duduclient As Currency Dim premier As Variant IsDebiteur = False Duduclient = 0 Set rng = Book.Sheets("Actes").Range("C:C") With rng 'cherche clientId dans la colonne C Set C = .Find(ClientId, LookIn:=xlValues, Lookat:=xlWhole) If Not C Is Nothing Then premier = C.Address Do 'cumule le Dû de la colonne E Duduclient = Duduclient + CCur(C.offset(0, 2)) If Duduclient > 0 Then IsDebiteur = True Exit Function End If Set C = .FindNext(C) Loop While C.Address <> premier End If End With End Function
Quelqu'un a une idée de ce qui se passe ?
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 Public Function IsDebiteur2(Book As Workbook, ByVal ClientId As Long) As Boolean Dim LastLig, L As Long Dim C As Range Dim Duduclient As Currency Dim premier As Variant Dim rng As Range IsDebiteur2 = False Duduclient = 0 LastLig = Book.Sheets("Actes").Range("A1").End(xlDown).Row Set rng = Book.Sheets("Actes").Range("A:E") With rng For L = 2 To LastLig 'cherche clientId dans la colonne C If CLng(.Cells(L, "C").Value) = ClientId Then 'cumule le Dû de la colonne E Duduclient = Duduclient + CCur(.Cells(L, "E")) If Duduclient > 0 Then IsDebiteur2 = True Exit Function End If End If Next L End With End Function
Merci d'avance...
Partager