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.

24demo-09-03.xlsm (192.22 Ko)

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
     Next

donc 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 If

Si 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

image

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 MATCH

au 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.

19demo-10-03.xlsm (198.45 Ko)

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

image

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

Oui LouReeD. Bien sûr que tu es compris dans le lot. D'ailleurs, et je l'ai bien marqué dans ma réponse, c'est toi qui a mis le doigt dessus. De mon côté j'ai fait les tests en étant plus général avec la suppression de tous les protect et pas seulement de celui que tu avais vu mais c'est toi qui a identifié le souci

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".

7demo-09-03.zip (301.73 Ko)
Rechercher des sujets similaires à "vba plantage erreur 400"