Salut sianto57 et bonne année à tous
bébutant en VBA, j'ai fait un programme et il bug à un endroit mais je ne comprend pas sa remarque
Ouais, moi non plus... ni ton sujet
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 57 58 59 60 61 62
| Private Sub IDENTIFICATION_Click()
Dim nblivreretard As Integer, nbjourretard As Integer
Dim i As Long, j As Integer, dureeretard As Integer
Dim dateretour As Date
Dim error As Boolean
Sheets("stocklivre").Select
Call statut 'module de traitement de l'état du doc
'macro pour déterminer le retard si il existe des clients
Sheets("Stocklivre").Select
i = 2
Do While Cells(i, 1) <> ""
dateretour = CDate(Cells(i, "G"))
If Cells(i, "E") = "Emprunté" And dateretour < Date Then
dureeretard = Date - dateretour
With Cells(i, "H")
.Value = dureeretard
.Interior.Color = 255
.Font.Bold = True
End With
Else
Cells(i, "H") = ""
End If
i = i + 1
Loop
'utiliser la feuille excel Saisie comme element permettant de faire des recherches dans la base client
'afin de faire apparaitre certains éléments du profil du client
'ensuite ouvrir le code d'identification du livre
Sheets("Saisie").Select
If Not (IsNumeric(idclt)) Then
Unload IDENTIFICATIONCLIENT
MsgBox ("Le code d'identification du client se compose de 1 à 5 chiffres. Reportez-vous à la carte du client")
IDENTIFICATIONCLIENT.Show
End If
'formule pour vérifier que le code saisi existe version client
Sheets("base clients").Select
point1:
i = 2
error = True
Do While (Worksheets("base clients").Cells(i, 2) <> "")
If CInt(idclt.Value) = CInt(Worksheets("base clients").Cells(i, 1).Value) Then
error = False
i = i + 1
Exit For
End If
Loop
If error = True Then
MsgBox "Le code saisi n'existe pas dans la base de donnée. Veuillez en ressaisir un. Merci"
GoTo point1
End If
Sheets("saisie").Select
Range("B3") = IDENTIFICATIONCLIENT.idclt.Value |
Le code un peu modifié. Mais regarde les remarques suivantes, ça pourrait aider. Ou précise ton problème.
Un dépannage, c'est un peu comme reconstruire le code. Mais si on ne sait pas ce qu'il veut dire exactement, on est obligé d'interprêter. Et une interprétation vaut ce qu'elle vaut : de très bonne à "à coté de la plaque".
Il faut déclarer chaque variable dans son type : dans ta déclaration, nblivreretard, i et j sont déclarés en Variant.
Pour i : tu t'en sert en variable de ligne => peut atteindre 65536. Dans ce cas, tu dépassera la capacité de Integer. Il faut prendre l'habitude de déclarer en Long pour les variables risquant de dépasser la limite de Integer.
Pas obligatoire, mais la perte de RAM (2 octets) sera largement compensée par le temps économisé à ne pas rechercher une panne qui peut apparaître des années plus tard, quand tu ne sais plus ce que devait faire le code qui fonctionnaît et que tu n'as pas modifié.
Personnellement, je ne traite pas les boucle en DO While
1 2
| i = 2
Do While (Worksheets("stocklivre").Cells(i, 1) <> "") |
j'utiliserai
for i = 2 to Worksheets("stocklivre").Cells(i, 1).end(xldown).row
Ou plus exactement
for i = 2 to Worksheets("stocklivre").Cells(i, 1).end(xlup).row
Je ne comprends pas ta boucle :
1 2 3 4 5 6 7 8 9
| Do While (Worksheets("base clients").Cells(i, 2) <> "")
If CInt(idclt.Value) <> CInt(Worksheets("base clients").Cells(i, 1).Value) Then
error = True
i = i + 1
End If
Loop
If error = True Then |
en admettant que le code correspondant à idcit soit en ligne 3 de Worksheets("base clients") colonne 1
(perso, je préfère travailler en variable X, ça me semble plus lisible et plus différentiable de 1 que i);
i=2 =>do While... = faux => (idcit<>A2):Vrai => Error = true => i=2+1
i=3 =>do While... = faux => (idcit<>A3):Faux =>
i=3 =>do While... = faux => (idcit<>A3):Faux => etc... pas près de finir!!!
1 2 3 4 5 6 7
| Do While (Worksheets("base clients").Cells(i, 2) <> "")
If CInt(idclt.Value) <> CInt(Worksheets("base clients").Cells(i, 1).Value) Then
error = True
End If
i = i + 1
Loop
If error = True Then |
i=2 =>do While... = faux => (idcit<>A2):Vrai => Error = true => i=2+1
i=3 =>do While... = faux => (idcit<>A3):Faux => Error ne change pas => i=3+1
i=4 =>do While... = faux => (idcit<>A2):Vrai => Error = true => i=4+1 etc... : si j'ai 32000 lignes, je les testes, jusqu'à la dernière, alors que mon but (supposé d'après le code) est juste de changer un booléen si idcit apparaît au moins une fois dans la colonne. Je préfère ma méthode qui positionne la variable à Vrai au départ, et que si elle la trouve, elle met à faux avant de sortir.
1 2 3
| If error = True Then
MsgBox = "Le code saisi n'existe pas dans la base de donnée. Veuillez en ressaisir un. Merci" Endif
If= 1 Then GoTo point1 |
Je suppose que c'est là l'erreur, le code ne voulant rien dire :
- MsgBox = C'est erronnée comme syntaxe. MsgBox ("...") ou MsgBox "..."
- If=1 then : veut pas dire grand chose, manque des éléments
Range("B3").Value = IDENTIFICATIONCLIENT.idclt.Value
Me gène : soit tu emploies le nom "informatique" des feuilles, soit tu les désignes par le nom des onglets. Sinon, un jour t'auras une erreur de nom et tu mettras du temps à trouver ta panne.
Tu utilises beaucoup de Select : on peut généralement les éliminer : ils sont sources de ralentissement et peuvent faire buger la macro en cas de module de classe feuille. Mais n'ayant qu'un extrait de la macro, je ne sais pas s'il n'y a pas un impératif (comme pour le tri).
Tu te dis débutant en VBA : fais un algo sur une feuille de papier et le faire tourner à la main, pour t'assurer que ton raisonnement est correct.
Quand tu apprends à conduire, tu ne vas pas directement sur un circuit de compétition. Tu apprends à démarrer, puis à passer la première, puis la seconde avant de commencer à foncer.
Plus tu donnes moins de données, moins on peut plus t'aider.
Ne jamais hésiter à se relire et à vérifier que sans le tableau, juste avec le sujet, un extérieur au problème comprendra ce qui bloque. Si trop d'infos tue l'info, pas assez n'autorise que les magiciens et autres devins à tenter de répondre
A+
PS
Bonne et Heureuse Année 2010 à tous
Partager