Erreur 13 incompréhensible

Résolu
antiprog Messages postés 7 Date d'inscription vendredi 15 novembre 2013 Statut Membre Dernière intervention 15 novembre 2013 - Modifié par antiprog le 15/11/2013 à 07:10
antiprog Messages postés 7 Date d'inscription vendredi 15 novembre 2013 Statut Membre Dernière intervention 15 novembre 2013 - 15 nov. 2013 à 23:33
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

14 réponses

antiprog Messages postés 7 Date d'inscription vendredi 15 novembre 2013 Statut Membre Dernière intervention 15 novembre 2013 1
15 nov. 2013 à 18:45
Dans ce cas je ne comprends pas ta remarque...
Tu veux bien reformuler autrement pour que je vois où tu veux en venir... ?
1
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
15 nov. 2013 à 07:16
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".
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 15/11/2013 à 07:40
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 ?
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 14
Modifié par pijaku le 15/11/2013 à 08:41
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 15/11/2013 à 09:27
Bonjour, Pijaku,
celle-là m'avait échappé, tant j'étais concentré sur la nature du message d'erreur ... LOL...
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 14
15 nov. 2013 à 09:40
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
antiprog Messages postés 7 Date d'inscription vendredi 15 novembre 2013 Statut Membre Dernière intervention 15 novembre 2013 1
15 nov. 2013 à 18:05
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.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
15 nov. 2013 à 18:13
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 ?
0
antiprog Messages postés 7 Date d'inscription vendredi 15 novembre 2013 Statut Membre Dernière intervention 15 novembre 2013 1
15 nov. 2013 à 18:28
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.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
15 nov. 2013 à 18:38
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.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
15 nov. 2013 à 18:48
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 !
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
15 nov. 2013 à 19:04
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 !)
0
antiprog Messages postés 7 Date d'inscription vendredi 15 novembre 2013 Statut Membre Dernière intervention 15 novembre 2013 1
15 nov. 2013 à 20:09
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.......
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 15/11/2013 à 20:39
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
0
antiprog Messages postés 7 Date d'inscription vendredi 15 novembre 2013 Statut Membre Dernière intervention 15 novembre 2013 1
15 nov. 2013 à 23:10
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.
0
antiprog Messages postés 7 Date d'inscription vendredi 15 novembre 2013 Statut Membre Dernière intervention 15 novembre 2013 1
15 nov. 2013 à 23:33
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.
0
Rejoignez-nous