Erreur 13 incompréhensible [Résolu]

Messages postés
7
Date d'inscription
vendredi 15 novembre 2013
Statut
Membre
Dernière intervention
15 novembre 2013
-
Bonjour,

Je suis étudiant et je dois réaliser un projet de recherche opérationnelle qui consiste à organiser des exposés sur un planning, le tout en VBA.
Etant incompétent en VBA, j'ai d'abord fait un algo en C, qui marche. Mais au moment de la traduction VBA, je tombe sur un os.

Il y a soit disant une "erreur d'éxecution 13 : incompatibilité de type" sur la ligne du If.
Or la comparaison est faite sur 2 listeClef (tab1D de String) et 1 planning (tab3D d'Integer) avec un -1.

'Retourne true si la clef est dans la session
Function clefSess(ByVal cren As Integer, ByVal sess As Integer, ByVal indi As Integer) As Boolean
    Dim expo As Integer     'variables de parcours du planning
    For expo = 0 To MAXEXPO - 1    'parcourt les cases de la session
        If planning(cren, sess, expo) <> -1 & listeClef(planning(cren, sess, expo)) = listeClef(indi) Then   'si la case est attribue a un expose du meme mot clef
            clefSess = True
            Exit Function
        End If
    Next expo
    clefSess = False
End Function


Là où ça devient chelou c'est que cette comparaison apparait 3x dans le code et il n'y a pas d'erreur sur les autres.
Pire ! Si je vire la comparaison des listeClef ça s'exécute, tandis que si je retire la comparaison de planning on se retrouve avec "erreur 9 : l'indice n'appartient pas à la section" !

Le code (+diagramme) et l'excel entier sont sur ce lien dropbox :
https://www.dropbox.com/sh/8dog9je57tlu46q/7kDL1QSBMt
Afficher la suite 

14 réponses

Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
0
Merci
Bonjour,
1) seuls les moins prudents ouvriraient le classeur objet de ton lien (dit mille et une fois). !
2) montre le code de déclaration et d'initialisation de tes tableaux
3) je note que tu dis que listeclef est un tableau de strings et que, dans ton expression conditionnelle, tu "examines" son item d'index planning(cren, sess, expo), ce qui est doublement surprenant, car :
a) tu dis que planning est un tableau d'integers
b) (mais il y a peut-être une raison que tu es seul à connaître) je vois mal quel est ce "mécanisme".
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
0
Merci
Quant à :
"Pire ! Si je vire la comparaison des listeClef ça s'exécute, tandis que si je retire la comparaison de planning on se retrouve avec "erreur 9 : l'indice n'appartient pas à la section" ! "
si tu retires quoi, exactement ? (car il y a dseux utilisations du ton tableau planning dans ton expression conditionnelle !) Les deux ? une seule (et laquelle)

Et MAXEXPO ? Déclarée et unitialisée où et comment ?
Commenter la réponse de ucfoutu
Messages postés
12253
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
19 juillet 2019
6
0
Merci
Bonjour,

Il y a plusieurs erreurs dans ton code. Je vais laisser aux soins de ucfoutu de gérer l'erreur de ta variable tableau "planning".

Dans la ligne :
If planning(cren, sess, expo) <> -1 & listeClef(planning(cren, sess, expo)) = listeClef(indi) Then   'si la case est attribue a un expose du meme mot clef

il ne faut pas confondre & et AND.

Pour placer deux conditions dans ton If, il convient d'utiliser AND (ou OR ou...).

Par exemple :
Je souhaite tester si MaValeur = 3 ET MonTest = True.
Le code suivant ne fonctionne pas :
If MaValeur = 3 & MonTest = True Then

En effet, le & concatène les expressions "3" et "MonTest = True".
Le code suivant fonctionne :
If MaValeur = 3 And MonTest = True Then

Corrige déjà cela, et reviens avec ton erreur 9 : l'indice n'appartient pas à la section...

Cordialement,
Franck
ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212 -
Bonjour, Pijaku,
celle-là m'avait échappé, tant j'étais concentré sur la nature du message d'erreur ... LOL...
pijaku
Messages postés
12253
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
19 juillet 2019
6 -
Salut Ucfoutu,

Pas de souci.
D'autant plus que ce n'est pas l'erreur la plus ardue à rectifier...
Surtout avec les éléments dont nous disposons actuellement.
Ne reste plus qu'à attendre qu'antiprog revienne.............

Bonne journée à toi
Commenter la réponse de pijaku
Messages postés
7
Date d'inscription
vendredi 15 novembre 2013
Statut
Membre
Dernière intervention
15 novembre 2013
0
Merci
Aaaah je passe pour un débile avec cette histoire de &.
Mauvais reflex du C avec "&&" lors de la traduction.

Du coup, ça marche presque.
Désormais c'est l'erreur 9 qui revient (celle qui apparaissait en ocultant la première condition) .
"erreur 9 : l'indice n'appartient pas à la section"

Bon maintenant, voilà les réponses à vos questions :
Public Const LEXPO As Integer = 100 'nombre d'exposes dans la liste a repartir
Public Const NCREN As Integer = 9   'nombre de creneaux dans l'evenement
Public Const NSESS As Integer = 3   'nombre de sessions par creneau
Public Const MAXEXPO As Integer = 4 'nombre max d'exposes par session
Public listeClef(LEXPO) As String      'exposes dans la liste (indi). valeur au mot clef methodologique.
Public planning(NCREN, NSESS, MAXEXPO) As Integer 'matrice des exposes dans le planning (creneau;session;expose). valeur à id, -1 si non alloué
Public listeAttr(LEXPO) As Boolean 'liste des exposes attribues (Id). valeur true si l'expose a ete attribue. 


En fait cette fonction vérifie si la session observée contient le mot clef de l'exposé qu'on va peut être attribuer dans cette session (j'essaye d'optimiser l'homogénéité des thèmes). Donc le IF doit vérifier si la case du planning est attribué à un exposé et si cet exposé a le même mot clef que celui qu'on s'apprête à ajouter à la session.
Commenter la réponse de antiprog
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
0
Merci
Et quid :
1) de la remarque que je t'ai faite en mon point 3) ?
2) de la question que je t'ai ensuite posée dans le commentaire qui suit le dit message ?
Commenter la réponse de ucfoutu
Messages postés
7
Date d'inscription
vendredi 15 novembre 2013
Statut
Membre
Dernière intervention
15 novembre 2013
0
Merci
Bah je pensais que tu devinerais avec les com' d'initialisation...

listeClef() est initialisée au début du main à partir des données du fichier excel qu'on me fournit et elle est indexée grace aux identifiant d'exposés (de 0 à 99).

Planning()()() est initialisé à -1 (non alloué). Puis lorsqu'un exposé est réserver sur une case du planning, alors la valeur de planning()()() prend la valeur de l'identifiant de l'exposé alloué.

Donc listeClef(indi) me donne le mot clef de l'exposé d'identifiant indi et listeClef(planning(cren,sess,expo)) est sensée être le mot clef de l'exposé placé dans le créneau cren, session sess et exposé expo s'il y a effectivement un exposé placé à cette endroit.
Commenter la réponse de antiprog
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
0
Merci
Ah ? C'est là ce que tu as à dire ?
Je vais donc te rappeler ma remarque 3) en mettant en souligné gras ce à quoi elle a trait ! ===>>
citation :
3) je note que tu dis que listeclef est un tableau de strings et que, dans ton expression conditionnelle, tu "examines" son item d'index planning(cren, sess, expo), ce qui est doublement surprenant, car
a) tu dis que planning est un tableau d'integers

Fin de citation.
Commenter la réponse de ucfoutu
Messages postés
7
Date d'inscription
vendredi 15 novembre 2013
Statut
Membre
Dernière intervention
15 novembre 2013
0
Merci
Dans ce cas je ne comprends pas ta remarque...
Tu veux bien reformuler autrement pour que je vois où tu veux en venir... ?
Commenter la réponse de antiprog
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
0
Merci
Je ne vois pas comment formuler autrement ma remarque.
Elle est formulée techniquement et tend à mettre en exergue la cause possible de ce que dénonce le message d'erreur exposé dans ton tout premier vmessage !
Pour mémoire ;
Il y a soit disant une "erreur d'éxecution 13 : incompatibilité de type" sur la ligne du If.
Désolé, mais, sur ce forum technique, je m'exprime techniquement et y tiens !
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
0
Merci
Et je viens de voir que tu n'as toujours pas répondu complètement à mon point 2) non plus !
Pour mémoire :
2) montre le code de déclaration et d'initialisation de tes tableaux
C'était pourtant également exprimé techniquement, à l'intention d'un développeur (les termes utilisés seraient rigoureusement les mêmes en C, que tu dis pratiquer !)
Commenter la réponse de ucfoutu
Messages postés
7
Date d'inscription
vendredi 15 novembre 2013
Statut
Membre
Dernière intervention
15 novembre 2013
0
Merci
Et je viens de voir que tu n'as pas lu que l'erreur 13 n'apparaissait plus et qu'il ne restait que la 9.......
Commenter la réponse de antiprog
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
0
Merci
Elle a "disparu" comment ? Précise-le donc, s'il te plait !
Car si en supprimant (en "virant", comme tu as dit plus haut) une des conditions, tu en es encore au tout vdébut du problème exposé !
Et tu n'as alors à ce propos toujours pas répondu à :
"si tu retires quoi, exactement ? (car il y a dseux utilisations du ton tableau planning dans ton expression conditionnelle !) Les deux ? une seule (et laquelle) "
Tu voudras bien m'excuser, mais moi, je te laisse maintenant là. Un autre prendra peut-être la suite de cette ... discussion ...
Je ne veux pas te quitter sans te souhaiter bonne chance (c'est mon habitude dans certains cas).

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Commenter la réponse de ucfoutu
Messages postés
7
Date d'inscription
vendredi 15 novembre 2013
Statut
Membre
Dernière intervention
15 novembre 2013
0
Merci
Il se trouve que pijaku a solutionné la moitié du problème en me rappelant que le "&" VBA était différent du "&&" C et donc que je devais mettre "AND" entre mes conditions du IF.

A partir de là, l'erreur 13 n'apparait plus, cependant l'erreur 9 persiste (elle apparait visiblement à cause de la condition listeClef(planning(cren, sess, expo)) = listeClef(indi)).

Cependant je ne vois pas quel est l'indice qui pose problème.
Commenter la réponse de antiprog
Messages postés
7
Date d'inscription
vendredi 15 novembre 2013
Statut
Membre
Dernière intervention
15 novembre 2013
0
Merci
En fait je viens de résoudre le problème.

Visiblement il existait des cas où planning()()() valait -1. Or comme la comparaison pour éviter le -1 est sur la même ligne que l'appel de listeClef(planning()()()), il est donc arrivé que le programme cherche la case -1 du tableau ce qui n'est évidemment pas possible.

J'ai donc simplement divisé le if en 2 if imbriqués, et là tout marche très bien.
Commenter la réponse de antiprog