IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Erreur : Initialize Type Array


Sujet :

Macros et VBA Excel

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 63
    Par défaut Erreur : Initialize Type Array
    Bonjour,

    En vbscript, j'ai l'habitude de faire des fonctions qui retournent des tableaux pour utiliser les résultats dans un for/each. Ici en vba, je veux faire la même chose. Mais impossible d'initialiser le tableau... Pour le dire en bon Vba, je veux utiliser un tableau dynamique, comme avec le dernier exemple du tuto sur les variables vba par silkyroad, sauf que ce dernier est statique. Je reçois des erreurs, quelque soit le moyen pour essayer de contourner.

    A l'aiiiiiiiiiiiiiiiiiiiiiide...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    Public Type Handle
        nHandle As Long
        ...
    End Type
     
    Function getAllHandle()
        Dim var As Handle
        Dim aList() As Handle
        aList = Array()                ' <---- Erreur 13: incompatibilité de type
     
        'une boucle...
           var.nHandle = 123
     
           ReDim Preserve aList(UBound(aList) + 1)
           aList(UBound(aList)) = var
     
        'fin boucle
     
        getAllHandle() = aList
    End Function
     
    Sub Main()
       For each oHandle in getAllHandle()
          Debug.Print oHandle.nHandle & ", ..." 
       Next
    End Sub
    Avec un commentaire sur "aList = Array()", l'erreur vient de Ubound() qui ne retourne pas -1 car aList est déclaré mais pas encore initialisé.

    Si je remplace "aList = Array(var)", pour qu'il connaisse mes intentions, erreur "seuls les types définis par l'utilisateur et sont définis dans les modules d'objets peuvent être convertis depuis ou vers un variant, ou passés à des fonctions à liaison tardive"... C'est pourtant bien ce que j'ai fait en créant mon Type en haut de mon module.

    En remplaçant "Dim aList() As Handle" par "Dim aList As Variant", l'initialisation du tableau passe, mais c'est l'affectation "aList(UBound(aList)) = var" qui plante par une erreur de compilation : "seuls les types définis par l'utilisateur et sont définis dans les modules d'objets peuvent être convertis depuis ou vers un variant, ou passés à des fonctions à liaison tardive". J'ai aussi essayé de forcer par un casting, mais j'y arrive pas non plus...

    J'ai encore essayé de contourner ça en trichant :
    -en déclarant "Dim aList(0) As Handle" (comme ca init du tableau automatique à la déclaration);
    -en commentant "aList = Array()" (car du coup plus besoin, l'init est faite);
    -et en intégrant mon affectation dans une condition, pas de redim si position 0,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        If (UBound(aList) > 0) Then
            ReDim Preserve aList(UBound(aList) + 1)
        End If
        aList(UBound(aList)) = var
    et bien ici, le compilateur me fait une erreur pour le "Redim Preserve aList" alors qu'il est dans le if, avec pour message "Tableau déjà dimensionné". Il n'essaie même pas d'aller jusque là le gars! Il râle avant... Alors que ca marcherait si bien...


    La belle affaire ! Je suis vraiment à sec d'idées là...
    Alors que c'est si simple en vbs (hors excel), pas de sensiblerie du compilateur, il y va...
    Une vraie princesse ce pseudo-compilo!

    Voili voilou, donc si un de vous avait déjà joué avec ce genre de choses, je serais bien content de savoir comment y arriver.

    Merciiiii,
      0  0

  2. #2
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour,

    alors dans ce cas pourquoi ne pas avoir codé comme en VBScript ?‼
    Car de mon côté tous mes codes VBScript fonctionnent forcément avec son cousin VBA !

    Sinon par exemple créer une fonction pour tester la matrice avec une gestion d'erreurs …

    ___________________________________________________________________________________________________________
    Je suis Paris, Egypte, Stockholm, London, Istanbul, Berlin, Nice, Bruxelles, Charlie, …
      0  0

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 63
    Par défaut
    Bonjour Marc-L,

    Ta réponse est aussi décevante qu'inutile, voudrais-je dire...

    En vbs le container (la structure) est une classe, non utilisable sans créer un module de classe en vba. Un peu compliqué pour bêtement renvoyer un tableau d'autre chose que les types primitifs. Surtout que j'en ai des dizaines à faire... Tu comprendras qu'à défaut du Type, je cherche un véhicule de type structure, qui rentre bien dans un tableau, et dont je pourrais en créer des dizaines au sein du même module. Ensuite catcher l'erreur parce que je ne suis pas capable de programmer proprement. Pas mal! Sinon le but de ma question était justement de faire ça proprement!

    Après, je suis bien content pour toi de savoir que tes codes sont parfaitement compatibles vbs/vba. Moi je dis bravoooo! Néanmoins, tu te rends bien compte que ta réponse n'apporte absolument rien à la réflexion technique évoquée dans ce post. Dommage... Si je ne le fais pas comme en vbs,... Réfléchis... C'est peut être parce qu'en vba, je rencontre les contraintes évoquées supra.

    Aussi, le sujet spécifique des tableaux dynamiques de type personnalisés en vba n'est pas très populaire sur Google. Ce post à selon-moi un intérêt légitime sur ce forum. De plus, je pense que quelqu'un doit te le dire : si tu ne sais pas de quoi je parle, laisse répondre ceux qui savent... Avec ta réponse, vu du forum, on pourrait maintenant penser que quelqu'un m'a adéquatement répondu. Sauf que ta réponse ne sert absolument à rien. De plus, un internaute qui se documente sur le sujet via Google, devra se taper tes vantardises avant de peut-être arriver sur une réponse pertinente, ou pas...

    De plus, pour info, il y a bien des différences substantielles entre vba/vbs/wsf/hta sans même invoquer le vb.net. Forcer des vbs à se rendre compatibles vba te limitent dans beaucoup de choses : absence de certaines fonctions natives vbs en vba, programmation dynamique (eval) impossible en vba, prototypage des déclarations de fonctions différentes, usage des class en vba doivent répondre à des manipulations particulières avec les modules alors qu'en vbs presque tout passe, redéfinition manuelle de toutes les constantes excel en vbs car inconnues (qui plantent si redéfinies en vba), et j'en passe. Donc si ton code se limite à deux Msgbox, ok d'accord. Mais après c'est plus compliqué.

    Loin de moi l'envie d'épiloguer sur ce sujet qui n'a rien à voir avec ma question initiale. Mais bon, tu remarqueras qu'en plus d'être inutile et polluant, ton commentaire est techniquement discutable. Donc vraiment, sauf si tu as un concept technique à évoquer avec démonstration, merci de ne plus répondre à ce message.

    sans rancune et joyeux dimanche,

    Nico
      0  3

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    j'ai bien une réponse mais là je n'ose plus trop vu l'accueil que tu fais aux helpers...
    Donc continue à chercher tout seul monsieur 'j'm'la pète'
    Pas la peine de te défouler sur moi, je sais que ma réponse ne t'aide pas. Ou plutôt si, tu sais maintenant que c'est possible.
    eric
      3  0

  5. #5
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Je te retoune Nico le côté "vantardise" comme tu affirmes cela fonctionne bien en VBScript
    alors je te demande de publier ici ce code VBScript !

    Sans oublier qu'en lisant bien mon précédent message une voie est clairement indiquée,
    enfin pour quelqu'un sachant coder même en VBScript, sans vantardise aucune …


    Edit : en regardant de nouveau le code initial (et incomplet ! Comme si on avait le temps de combler les trous … )
     je vois déjà une grossière erreur, il suffit juste de consulter l'aide VBA interne (Dim / ReDim et Array !)
     ou encore les tutoriels pourtant disponibles sur ce forum concernant les variables matrice / tableau !
     Si au moins la matrice est initialisée avec un indice, ce que je pratique déjà en VBScript …
      0  0

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour nico.exe
    Ce qui est "décevant" et quelque peu "polluant", c'est pour moi de lire une discussion ouverte dans le sous-forum VBA pour y lire une comparaison (un peu ratée, d'ailleurs) avec le comportement d'un autre langage (en l'occurrence : VBS).
    Et ton
    A l'aiiiiiiiiiiiiiiiiiiiiiide...
    n'était pas là pour m'inciter à observer une autre attitude, hein ...
    J'avais donc ouvert, lu .. et en était "sorti" sans accepter d'intervenir. Seule ta réaction au message de Marc-L (que je salue) vient de me faire changer d'avis, mais uniquement pour te dire ce que dit la première phrase du présent message.
    Bonne chance dans tes "démarches" de l'espèce.
      0  1

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 63
    Par défaut
    Bonjour,

    Et bien je vous remercie pour vos nombreuses réponses, un peu moins pour le contenu. LOL!!! Je me permets de penser qu'il n'y en a pas un pour sauver l'autre ici. Chapeau! Je regrette un peu l'absence d'une quelconque manifestation technique dans vos réponses. J'ajouterai encore que vos réactions émotionnelles n'ont pas vraiment de place dans un forum technique. Je demandais juste un bon tuyau, pas vos filles à marier hein!

    Mais je vous comprends ! En me relisant je reconnais être légèrement cassant dans ma réponse, bien que ce n'était pas l'objectif. Habitués des forums, vous devez quand même admettre que lorsque vous cherchez une réponses, que vous avez la chance de trouver un gars qui se l'est déjà posée sur un forum, que vous devez lire des pages et pages de commentaires aussi "à côté de la plaque" qu'inutiles, c'est toujours extrêmement pénible. Ce sur quoi, je persiste et signe : je ne comprends pas ceux qui prennent du temps pour répondre alors qu'ils savent pertinemment bien que ça n'apporte rien... Valeur ajouté 0 de chez 0. Mais bon, soit!

    Donc mea culpa, mes plus plates excuses, je ne voulais ni vous heurter, ni vous énerver.
    Je me suis juste mal exprimé! Sorry sir!

    Sinon, puisqu'il faut tout faire soi-même ici, si quelqu'un avec la même question venait à tomber sur ce post bien pourri, voici quand même quelques éléments. J'ai bien trouvé quelqu'un qui avait exactement le même petit problème : http://stackoverflow.com/questions/2...for-each-loops (avec juste une question technique et réponse technique).

    Il en ressort que l'usage des "Type" est soumis à des contraintes et limitations inhérentes à l'implémentation Vba du Visual Basic. Ainsi, il n'est pas possible d'utiliser des tableaux de structures de type "Type" au sein d'un for-each, comme c'est si simple de le faire avec des objets. L'usage d'un dictionnaire en lieu et place d'un tableau dynamique génère le même problème.

    2 solutions me sont apparues :

    1] Créer une class (démonstration suivie dans le lien supra), mais étant en Vba, il faudra créer un module de class dédié. Bref 36 complications (selon moi) qu'on ne retrouve pas dans un "bête" vbscript , surtout si vous devez créer plein de class différentes à boucler dans dans vos for-each.

    2] Abandonnez For-each et utilisez For i To..., avec là aussi différentes obligations de typages et prototypages qu'on ne retrouve pas en vbscript, et une crasse pour sauter le redim de la position 0. Revoici l'exemple du matin qui fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    ' usage 
    Sub main()
     
        Dim arr() As Handle
        arr = fct_ok()
     
        For i = 0 To ubound(arr)
    		msgbox arr(i).nHandle
    	Next
     
    End Sub
     
     
    ' fonction d'alimentation
    Function fct_ok() As Handle()
        Dim oHandle As Handle
        ReDim aList(0) As Handle
     
        oHandle.nHandle = 123
     
    	'boucle pour provisionner le tableau
    		If UBound(aList) > 0 Then
    			ReDim Preserve aList(UBound(aList) + 1)
    		End If
    		aList(UBound(aList)) = oHandle
        'fin boucle 
        fct_ok = aList
    End Function
     
     
    ' structure de données
    Public Type Handle
        nHandle As Long
        nChilCount As Long
        nParentHandle As Long
    End Type
    PS : en vbscript, on fait un, deux, dix class dans un même fichier, où les variables membres servent à véhiculer les données au sein de cette structure. Aucun typage/prototypage n'est nécessaire ni dans les fonctions/méthodes d'alimentation, ni dans le main. On clape aTab = Array, puis on redim à chaque itération. Çà marche "nickel bleu ciel", sans complexité et limitation induite à la compilation (enfin l'interpréteur de script).

    Encore sans rancune...
    Et bonne semaine
      0  0

  8. #8
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Tu continues à mettre VBS en avant en "comparaison" ?
    Je continue personnellement à n'attendre les tenants et aboutissants qu'EN VBA !
    Sinon, puisqu'il faut tout faire soi-même ici
    Mais ne te gêne surtout pas -->> fais donc, fais donc !
    Juste pour ta petite info :
    1) les développeurs VBA n'ont pas à connaître forcément le développement sous un autre langage (qu'il soit ton VBS ou autre).
    2) VBS est carrément inhibé sur de nombreuses machines (décision du responsable informatique), dont la mienne
    3) les structures se traitent parfaitement sous VBA (qu'il s'agisse de structures de matrices ou de matrices de structures). Qu'elles se traitent à coup de For Each ou d'une autre manière ne regarde que VBA (le langage de développement de cette section du forum)

    Je me garderais personnellement d'ouvrir une discussion dans un forum concernant un langage X pour dire grosso-modo :
    "comment transposer en langage X ce que je traiterais ainsi en langage Y"
    J'exposerais uniquement les tenants et aboutissants et ne mentionnerais QUE le langage Y. Et je le ferais très techniquement (c'est à dire sans comparaisons oiseuses).
    J'interviendrais peut-être sur une nouvelle discussion que tu ouvrirais et qui respecterait ces principes fondamentaux.

    EDIT : j'ajouterais bien volontiers que j'ai compris le regard que TU posais sur le fonctionnement que TU jugerais utile d'un forum.
    Tu voudras bien comprendre que TON regard n'est pas FORCEMENT celui des autres. Il n'est par exemple pas du tout le MIEN.
    Après : lequel des deux "regards" est "adéquat" et le plus "approprié" ? Hmmm ?
    Tu vas me répondre : celui qui "m'arrange", puisque j'ai une "soluce" sans trop forcer.
    Et je vais te répondre : celui qui "m'arrange" car il contribue seul à la création de vrais développeurs.
    Compris ?
      0  0

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 63
    Par défaut
    Tsssssssssssssss Uparia Upariiiiiiiiiiiiiia,

    Tu rallumes des incendies toi! Tu es un bannndiiiiiit !

    Je me suis excusé d'avoir été "piquant", inutile d'encore en rajouter.
    Après un brin d'humour ne doit pas t'énerver hein ?!?
    Faut pas tout prendre au premier degré...

    Et si tu ne vois pas bien le tronc commun entre les langages de script dérivés du vb,
    On ne peut plus rien pour toi

    Et oui je sais bien : "le bon sens n'est pas commun"
    --> humour belge encore ici

    Mais ce n'est pas grave, je t'aime quand même et la vie est belle.
    Je te souhaite beaucoup de succès dans ta carrière "développeur vba".

    Nico
      0  0

  10. #10
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Mais ce n'est pas grave, je t'aime quand même et la vie est belle.
    Je te souhaite beaucoup de succès dans ta carrière "développeur vba".
    J'ai les mêmes sentiments à ton égard et à celui de ta carrière (la mienne est terminée depuis plus de quinze ans).
    Et j'adore tes "second degrés". Reste à savoir où tu places l'abscisse de départ...
      0  0

  11. #11
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Citation Envoyé par nico.exe Voir le message
    2 solutions me sont apparues :
    1] Créer une class […]
    2] Abandonnez For-each et utilisez For i To […]
    Ces deux "consignes" étant superfétatoires,   pourtant il suffit juste de suivre la documentation de Dim & ReDim dans l'aide VBA !

    La ligne de code n°10 est idiote (d'où l'erreur !) car
    pourquoi vouloir affecter une simple matrice vide à une variable déjà déclarée en matrice spécifique ?‼ 

    Déjà conseillé dans un précédent message :  juste utiliser un ReDim indicé et, encore une fois,
    comme pourtant écrit explicitement dans l'aide VBA interne - le B-A-BA ! - et dans les tutoriels de ce forum …

    ___________________________________________________________________________________________________________
    L'avenir n'appartient pas qu'à ceux se levant tôt mais surtout à ceux se donnant la peine de lire …
      0  0

  12. #12
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Ouais ...
    Et apprendre dans la foulée (autre B.A.BA) comment traiter un tableau avec une fonction
    Sa fonction :
    - ne saurait en aucun cas retourner un tableau de structures
    - Il lui faut alors :
    --- soit passer le tableau en paramètre de la procédure
    --- soit déclarer le tableau dans la partie déclarative du module et s'y référer dans la fonction
    Remarque faite en passant, sans préjudice de l'adresse du reste du code, hein ... (nico.exe y reconnaîtra son "petit")

    EDIT : j'ajoute que je ne peux le vérifier (VBS étant inhibé sur ma machine), mais que, de mémoire, il n'est pas possible d'utiliser une structure dans VBS ...
    Les comparaisons curieuses faites par nico.exe avec le comportement de VBS seraient alors assez étranges, puisque aucune comparaison possible !

    Et si l'on se limite à une fonction devant retourner non un tableau de structures, mais un tableau normal, VBA le fait sans aucune espèce d'état d'âme (et même mieux que VBS, puisque le tableau peut y être typé (sauf évidemment typé en structure)).
    Bref ...
      0  0

Discussion fermée
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 19/07/2014, 19h35
  2. erreur :invalid types ‘bool[int]’ for array subscript
    Par ferhat.adel dans le forum Débuter
    Réponses: 1
    Dernier message: 10/06/2013, 18h56
  3. erreur : subscript requires array or pointer type
    Par GabrielD dans le forum C++
    Réponses: 1
    Dernier message: 18/04/2011, 07h51
  4. Erreur : invalid types «int[int]» for array subscript
    Par fabrice91 dans le forum Débuter
    Réponses: 9
    Dernier message: 01/10/2010, 16h00
  5. Réponses: 4
    Dernier message: 02/08/2010, 09h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo