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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

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