VBA - Plantage - Erreur 400
Bonjour,
Dans le fichier ci-joint, on peut effectuer des tirages pour 3 matchs de pétaque par soirée.
Sur la feuille ‘’BASE’’, il faut choisir au minimum 8 joueurs – soit par double-clic dans la colonne C, soit en sélectionnant quelques joueurs dans la colonne C et en cliquant sur le bouton ‘’Inverser une plage’’ – et lancer la macro par le bouton ‘’Tirage’’.
Après une quinzaine de secondes chez moi, le résultat est prêt.
Afin d’éviter que la même paire de joueurs joue 3 fois l’un CONTRE l’autre le même soir, j’ai tenté d’inscrire le passage mis en commentaire dans la macro ‘’Tirage’’ dans le code de la feuille ‘’BASE’’, vers la ligne 700 de cette macro. Mais si j’active ce passage, j’ai un plantage et une info ‘’400’’ qui apparait.
La macro est alors interrompue et j’ai des données qui restent en place inopinément sur diverses feuilles, tel que sur la plage J2:BB500 de la feuille ‘’Répartition’’ ou dans les colonnes Z:AB de la feuille ‘’BASE’’.
Savez-vous ce qui provoque ce plantage ?
Afin d’effectuer d’autres essais, il est normalement possible de remettre ce maudit passage de la macro en commentaire, d’éventuellement refermer le fichier et de refaire un tirage afin de ‘’nettoyer’’ les feuilles nécessaires, de faire une sorte de remise à zéro.
Cordialement.
bonjour Yvouille,
il faut éviter ce "on error resume next", parce que comme ça, on cache la cause de l'erreur et on cherche sans clou.
par exemple, on utilise un parametre "r", type "variant", donc n'importe quel type et on l'assigne une valeur non-numérique, puis on fait le "match" et si le "r" est devenu une valeur numérique, on l'a trouvé, sinon, on traite l'erreur
Dim r 'as variant
' Brassage
For j = 1 To Iterations_2 ' Nombre d'itérations
For i = 2 To DerLig_Z
r = "": r = Application.Match(Range("Z" & i), ws_Releves.Range("G:G"), 0) 'on commence avec r comme un string !!!
If Not IsNumeric(r) Then
MsgBox "no match"
ElseIf k > 0 Then ' La personne a déjà joué en triplette
Range("AA" & i) = WorksheetFunction.RandBetween(1, 9999) + 100000
Else
Range("AA" & i) = WorksheetFunction.RandBetween(1, 9999)
End If
Next
Nextdonc supprimez tous ces "on error ...."
Bonsoir à tous,
En gardant le type entier long , je fais souvent :
Dim pos As Long
pos = Application.IfError(Application.Match(ValeurCherchée, Plage, 0), 0)
If pos Then
MsgBox "Trouvé à la position : " & pos
Else
MsgBox "Pas trouvé !"
End IfSi la valeur cherchée ne figure pas dans la plage alors pos vaudra 0.
Salut Mafraise,
Merci pour ta réponse. Je vais tester cela.
Cordialement.
Bonjour,
J'ai testé avec ces joueurs
Ton erreur (du moins l'éventuelle première erreur car il peut y en avoir d'autres ensuite puisque j'ai vu des boucles qui ressemblent à celle-ci ailleurs) est dans ta boucle For
' DEUXIEME MATCH
'[...]
For i = 38 To DerCol ' 38 = colonne AL
If .Cells(2, i) <> "" Then
Emplacement_tiret = WorksheetFunction.Find(" - ", .Cells(2, i))
.Cells(Ligne, Colonnes_gauches_droites) = Left(.Cells(2, i), Emplacement_tiret - 1)
.Cells(Ligne, Colonnes_gauches_droites + 1) = Right(.Cells(2, i), Len(.Cells(2, i)) - (Emplacement_tiret + 2))
If Colonnes_gauches_droites = 2 Then
Colonnes_gauches_droites = 6
Else
Colonnes_gauches_droites = 2
Ligne = Ligne + 1
End If
End If
Next
'[...]
' TROISIEME MATCHau moment où les variables sont :
- DerCol = 101
- i = 42 ("i" étant ton index colonne c'est la colonne "AP")
Ta ligne Emplacement_tiret = WorksheetFunction.Find(" - ", .Cells(2, i)) va chercher " - " dans "AP2" de ta feuille "Répartition". Cette cellule contient "0" et pas de " - ". Cela créé donc une erreur.
Re-bonjour,
@ mafraise
Je n'ai pas compris où placer ton passage dans ma macro ''Tirage'' afin qu'il me soit utile. Peux-tu m'en dire plus, s'il-te-plait ?
@ Alex
Lorsque je lance ma macro avec les lignes 702 à 721 de la macro ''Tirage'' mises en commentaire, ça ne plante jamais dans le passage que tu m'indiques.
Si j'active ce passage mis en commentaire, que je lance un tirage (avec 11 joueurs, il y a plus souvent des personnes qui jouent jusqu'à 3 fois l'une CONTRE l'autre) et que ça passe par ce passage maudit parce que cette limite est atteinte, ça plante. Toutefois ce passage est placé après le passage que tu m'indiques. Je me demande donc si tu n'as pas fait un deuxième essai après un plantage et qu'il restait des données en place qui auraient dû être effacées normalement.
De plus, chez moi, ça plante et la macro s'arrête complètement. Je ne peux donc pas voir à quel endroit elle est restée bloquée. Je suis donc surpris que tu puisses me dire que c'est lorsque i vaut 42 que ça bloque.
Si vous avez encore le courage de m'aider .....
Cordialement.
J'ai lancé 1 fois ou 2 sans inclure ton surplus de code et je n'ai pas eu de plantage (mais aucune idée si les résultats étaient corrects).
Ensuite j'ai décommenté ton surplus et là badaboum 400.
Dans tous les cas je n'avais mis que les 8 premiers joueurs.
Maintenant il est vrai que j'ai fait plusieurs essais successifs du bouton les uns derrière les autres pour trouver précisément.
Ce n'est pas l'IDE qui m'a mit en jaune cette ligne. J'ai eu droit à un formulaire 400 et basta fin. Ensuite j'ai relancé pas à pas.
Maintenant s'il faut faire le ménage entre 2 tests...
Peux-tu mettre un fichier ici sans résidus ? Je referai mes tests en partant de cette version à chaque fois.
Bonsoir,
avez-vous essayé de mettre :
.Range("F2").FormulaR1C1 = "=MAX(C[-1])"Afin que VBA comprenne qu'il faut inscrire une formule et non pas une valeur...
et le "UnProtect" est mal placé si vous inscrivez une formule en F2 avant :
' With ws_Releves
' .Range("F2") = "=MAX(C[-1])"
' If .Range("F2") > 2 And Compteur < 2 Then
' .Unprotect@ bientôt
LouReeD
Bonsoir,
En prenant un peu de toutes vos idées, j'ai finalement réussi à résoudre mon problème, selon le nouveau fichier ci-joint.
J'ai activé mon bloc des lignes 703 à 721. A la ligne 706, je déprotégeais inutilement la feuille ws_Releves qui l'était déjà et je la protégeais à nouveau à la ligne 718, ce qui faisait que lors du retour à l'étiquette "Retour_Troisieme_match", lors du deuxième passage à la ligne 638 et suivantes, la macro plantait car je voulais inscrire une donnée sur une feuille (nouvellement et inutilement) protégée !
En faisant un essai par exemple avec 11 joueurs, parfois la macro trouve pas plus de 2 joueurs jouant l'un contre l'autre et elle va au bout sans soucis. Ou alors elle trouve 1 paire de joueurs jouant 3 fois ensemble et elle tente à deux reprises de faire mieux, avec chaque fois une information intermédiaire entre deux.
J'ai maintenant constaté d'autres problèmes à la suite, mais je vais normalement m'en sortir tout seul
Un grand merci à vous tous pour votre aide.
J'ai repris ton fichier initial, décommenté ton surplus de code, modifié ton code en mettant en commentaire les applications de protection (tous tes *.protect), déprotégé toutes tes feuilles, sélectionné les 8 premiers joueurs et relancé le code. Pas eu de plantage (je n'ai pas contrôlé les résultats) le code arrive au bout bien qu'il m'est arrivé d'avoir en boucle
LouReeD plus haut a peut-être bien vu juste. Quelque part dans ton code tu essayes de faire "un truc" sur une feuille protégée et il n'aime pas.
Approfondis cette piste. Je te conseille de tout déprotéger au lancement du code et de tout reprotéger à la fin seulement.
Sinon tu peux aussi utiliser "UserInterfaceOnly" de "protect". "UserInterfaceOnly" permet de protéger des manipulations utilisateur tout en acceptant les modifications macro. Attention : "UserInterfaceOnly" ne reste pas à la fermeture du fichier. Les feuilles seront toujours verrouillées mais les modifications également après la fermeture/réouverture du fichier. A l'époque, à chaque ouverture du fichier je déprotégeais et reprotégeais chaque feuille avec "UserInterfaceOnly" à true.
Oups. Messages croisés.
Tu n'avais pas posté ta réponse au moment où j'ai cliqué sur "Répondre" mais je vois ta réponse après avoir cliqué sur "Envoyre" ma réponse.
Salut Alex,
Merci pour ton complément de réponse. Nos messages se sont effectivement croisés.
J'avais effectivement utilisé UserInterfaceOnly à certaines occasions, mais j'avais remarqué quelques exceptions où ça ne jouait pas et je me suis décidé cette fois de partir sur une utilisation .unprotect / .protect.
Comme j'ai mis dans ThisWorkbook des .protect lors de la sélection d'une feuille, ça protège certaines feuilles en cours de macro, raison pour laquelle je suis obligé de placé des .unprotect un peu partout. Mais je vais suivre ton idée en partie et protéger à nouveau toutes les feuilles uniquement à la fin de la macro, ce qui m'économisera également certainement quelques .unprotect
Merci encore pour ton aide.
Bonsoir,
Merci pour ce retour et je prend "ma part" des remerciements !
Bon courage pour la suite du développement de votre application !
@ bientôt
LouReeD
Pour ma part je considère de toute façon que dans un fil chacun met sa pierre à l'édifice.
Bonjour Alex030181 !
Pas de soucis
Je répondais à Yvouille suite à son message : " En prenant un peu de toutes vos idées..."
@ bientôt
LouReeD
il faut commencer avec quelque chose facile, par exemple 25 (ou plus) joueurs. 11 joueurs en 3 matches, cela est pour des utilisateurs avancés.
Puis, on fait un tirage pour les 3 matches en même temps, on compte les erreurs et les élimine progressivement.
Donc mettez 25 fois X dans "Base" et lance la macro dans "Brouillon".