Problème pour définir un tableau avec des variables de type utilisateur

Résolu
cs_marco62118 Messages postés 176 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 1 avril 2013 - 30 janv. 2009 à 23:33
cs_marco62118 Messages postés 176 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 1 avril 2013 - 1 févr. 2009 à 01:47
j'ai voulu  créer un type et en faire un tableau puis chercher dans chaque élément une particularité mais j'ai un message d'erreur dont l'explication et l'aide n'est pas très compréhensible

Public Type AdresseWeb
    ok As Boolean
    adresse As String
End Type
Public adresse50 As AdresseWeb
Public adresse66 As AdresseWeb
Public adresse55 As AdresseWeb
Public adresse35 As AdresseWeb
Public adresse60 As AdresseWeb
Public adresse31 As AdresseWeb
Public adresse  As AdresseWeb
Public AdressesWeb As Variant

Public Sub RechercheDefinition(Mot As String)


   AdressesWeb = Array(adresse50, adresse66, adresse55, adresse35, adresse60, adresse31)

        For Each adresse In AdressesWeb
            If adresse.ok = False Then
                OuvreUrl adresse.adresse(Mot)
            End If
        Next

end sub

voici le message d'erreur "Erreur de Compilation : Seuls les types publics définis par l›utilisateur qui sont définis dans les modules objet publics peuvent être convertis depuis ou vers un variant ou passés à des fonctions à liaison tardive"
voici ce qu'en donne l'aide
"Seuls les types publics définis par l›utilisateur dans les modules objet publics peuvent être utilisés comme paramètres ou types renvoyés pour les procédures publiques des modules de classe ou comme champs des types publics définis par l›utilisateur

Cause et solution de cette erreur : Vous avez tenté d›utiliser un type public défini par l›utilisateur comme paramètre ou comme type renvoyé pour une procédure publique d›un module de classe, ou comme champ d›un type public défini par l›utilisateur. Seuls les types publics définis par l›utilisateur dans un module d›objet public peuvent être utilisés de cette façon. "

je  pense bien qu'il y a un pb de définition des variables mais je ne trouve pas la solution .Comment devrais je définir cela

merci d'avance

7 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
31 janv. 2009 à 20:08
Re
Ah c'est vrai que j'ai tiqué sur le TYPE mais je n'avais pas fait gaffe au Array qui est assez particulier comme le souligne "cnt"

C'est l'instruction ARRAY qui pose problème, pas la mise en tableau. Il suffit donc de s'en passer.
Une déclaration comme celle-ci suffit, sauf que l'index ne correspond pas aux chiffres de tes variables, il faudra donc que tu t'adapetes !

Public Type AdresseWeb
    ok As Boolean
    adresse As String
End Type
Public AdressesWeb() As AdresseWeb

Préparation du tableau avant de mettre les valeurs dedans :
    ReDim AdressesWeb(0 To 5)

Pour entrer tes valeurs dans tes variables, il suffira de t'adresser à AdresseWeb(monIndex) au lieu des déclarations individuelles adresse50, adresse66 ...

Quand tu voudras faire une recherche :
   Dim i As Byte
   For i = 0 To 5
        If AdressesWeb(i) .ok = False Then
            'OuvreUrl AdressesWeb(i).adresse
        End If
    Next i

Je n'ai pas bien compris ce que tu veux faire avec "Mot".
Adresse est une String
Adresse(Mot) n'a pas de sens

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
31 janv. 2009 à 00:51
Salut
Parce que tu as dû déclarer ces types publics dans une Classe ?
Si les variables doivent aussi être connues (accessibles) depuis l'hôte (le programme priuncipal qui utilisera cette classe), il faut qu'il puisse préparer une structure équivalente avant d'appeler la Classe.
Donc, la seuls solution est de placer ta déclaration de type dans un module, en public, toujours. De cette manière, tout le projet partagera cette définiton.

D'autre part, maîtrise bien les étendues des variables.
Tu sembles tout dimensionner en Public : Ce n'est pas une solution viable, tu t'en apercevras.
Opte aussi pour la déclaration obligatoire des variables avec "Option Explicit" en tête de chaque partie Déclarations des pages de code (Voir Option) : Ca t'oblige à dimensionner toutes tes variables. Ca peut sembler lourd, mais au contraire, cela permet de réflechir pour chacune d'elle à leur étendue : Devront-elles être accessible de partout (est-ce utile) ?

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_marco62118 Messages postés 176 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 1 avril 2013 1
31 janv. 2009 à 14:46
bonjour


merci pour cettet prompte réponse.


c'est vrai j'ai tendance à mettre toutes les variables public car j'essaie de diviser mon prog enplusieur module et feuille mais il arrive souvent que ça bloque car les variables ne sont pas connus!


De plus je choisi toujours option explicit, c'est vrai aussi très contraignant et je n'ai pas vu vraiment l'intéret car sans cette option VB se débrouille bien pour définir les variables , mais enfin j'essaie de respecter les conventions puristes des programateur!

Ce n'ai pas un module de classe c'est un module ordinaire!
et avec ce message d'erreur VB surligne " AdressesWeb = Array(adresse50, adresse66, adresse55, adresse35, adresse60, adresse31)"
précision la procédure "ouvreUrl" est dans le même module.

Comment toi tu aurais déclaré tout ça?
merci encore
0
cnt Messages postés 219 Date d'inscription lundi 21 novembre 2005 Statut Membre Dernière intervention 20 décembre 2010 1
31 janv. 2009 à 19:52
La réponse au sujet de l'utilisation de la fonction "Array" est dans l'aide MSDN de VB6.
En  voici un extrait:
<title>Array, fonction</title><style><![CDATA[import url(msdn_ie4.css);]]></style><link disabled= "" href="msdn_ie3.css" rel="stylesheet" />   Note    Une variable de type Variant non
déclarée comme tableau peut cependant en contenir un. Une variable de type
Variant peut contenir tout type de tableau, à l'exception des chaînes de
longueur fixe et de
<object id ="alink_9" type= "application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"></object>[javascript:alink_9.Click() types définis par l'utilisateur]. Bien que
le concept de variable de type Variant contenant un tableau diffère d'un
tableau contenant des éléments de type Variant, la manière d'accéder aux
éléments du tableau est identique.
 J'ai déja été confronté à ce problème et l'ai résolu comme ci-dessous
------------------------------------------------------------------
Option Explicit

Public Type AdresseWeb
    ok As Boolean
    adresse As String
End Type
Public adresse50 As AdresseWeb
Public adresse66 As AdresseWeb
Public adresse55 As AdresseWeb
Public adresse35 As AdresseWeb
Public adresse60 As AdresseWeb
Public adresse31 As AdresseWeb
Public adresse  As AdresseWeb
Public AdressesWeb()  As Variant
--------------------------------------
Public Sub RechercheDefinition(Mot As String)
    Dim i As Byte
  
    ReDim AdressesWeb(0 To 1, 0 To 5)
    AdressesWeb(0, 0) = adresse50.adresse
    AdressesWeb(1, 0) = adresse50.ok
    AdressesWeb(0, 1) = adresse66.adresse
    AdressesWeb(1, 1) = adresse66.ok
    AdressesWeb(0, 2) = adresse55.adresse
    AdressesWeb(1, 2) = adresse55.ok
    AdressesWeb(0, 3) = adresse35.adresse
    AdressesWeb(1, 3) = adresse35.ok
    AdressesWeb(0, 4) = adresse60.adresse
    AdressesWeb(1, 4) = adresse60.ok
    AdressesWeb(0, 5) = adresse31.adresse
    AdressesWeb(1, 5) = adresse31.ok
   
    For i = 0 To 5
        If AdressesWeb(1, i) = False Then
            'OuvreUrl AdressesWeb(0, i)(Mot)
        End If
    Next i
End Sub
********************************
J'espère que cela répond au problème
Salut
0

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

Posez votre question
cs_marco62118 Messages postés 176 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 1 avril 2013 1
1 févr. 2009 à 01:13
bonsoir et merci pour vos réponses , solutions .


je venais de trouver une méthode en suivant quelques messages sur ce forum en fait j'ai créé un module de class dans le quel j'ai mis


Option Explicit


 Public OK As Boolean
 Public Adresse As String
 Public name As String

puis dans mon prog dans le module ordinaire
Option Explicit
'déclaration et attribution d'adresse web de "class1"
Private adresse50 As New Class1
Private adresse66 As New Class1
Private adresse55 As New Class1
Private adresse35 As New Class1
Private adresse60 As New Class1
Private adresse31 As New Class1
Private AdressesWeb As Variant 'tableau des adresses web

 Public Sub RechercheDefinition(Mot As String)


Dim eltAdresse As Class1 'élément du tableau des adresses web
Dim shw As New ShellWindows 'collection de fenêtre window
Dim sW As New WebBrowser_V1 'fenêtre internet
Dim typeSW As String 'type de fenêtre windows


adresse50.Adresse = "http://www.mediadico.com/dictionnaire/definition/" & Mot & "/1" 'adresse avec le "MOT" _
                                                                                                    à rechercher
adresse50.name = "http://www.mediadico.com/dictionnaire/definition/" & MotRechercheAntecedant & "/1" 'nom pour _
                                            retrouver les pages déjà ouverte donc avec le MOT de recherche précédente
adresse66.Adresse = "http://francois.gannaz.free.fr/Littre/xmlittre.php?rand=&requete=" & UCase(Mot)
adresse66.name = "http://francois.gannaz.free.fr/Littre/xmlittre.php?rand=&requete=" & UCase(MotRechercheAntecedant)
adresse55.Adresse = "http://free.mediadico.com/dictionnaire.asp/definition/" & Mot & "/dictionnaire"
adresse55.name = "http://free.mediadico.com/dictionnaire.asp/definition/" & MotRechercheAntecedant & "/dictionnaire"
adresse35.Adresse = "http://www.cnrtl.fr/lexicographie/" & Mot
adresse35.name = "http://www.cnrtl.fr/lexicographie/" & MotRechercheAntecedant
adresse60.Adresse = "http://dictionnaire.tv5.org/dictionnaires.asp?Action=1&mot=" & Mot & "&che=1"
adresse60.name = "http://dictionnaire.tv5.org/dictionnaires.asp?Action=1&mot=" & MotRechercheAntecedant & "&che=1"
adresse31.Adresse = "http://fr.wiktionary.org/wiki/" & Mot
adresse31.name = "http://fr.wiktionary.org/wiki/" & MotRechercheAntecedant


AdressesWeb = Array(adresse50, adresse66, adresse55, adresse35, adresse60, adresse31)
If PasPremiereRecherche = False Then
    Mod_URL.AfficheUrl (Mot)
Else
    For Each eltAdresse In AdressesWeb
        eltAdresse.OK = False
    Next
    On Error Resume Next 'obligatoire sinon erreur à la premeière fenêtre
    For Each sW In shw
        typeSW = ""
        typeSW = sW.Type
        If typeSW = "Document HTML" Then
            For Each eltAdresse In AdressesWeb
                If sW.LocationURL = eltAdresse.name Then
                    eltAdresse.OK = True 'la page est trouvée
                    sW.Navigate eltAdresse.Adresse 'nouvelle recherche
                    Exit For
                End If
            Next
        End If
    Next
    For Each eltAdresse In AdressesWeb
        If eltAdresse.OK = False Then 'si la page n'a pas été retrouvée
            OuvreUrl (eltAdresse.Adresse) 'ouverture d'une nouvelle recherche
        End If
    Next
End If
MotRechercheAntecedant = Mot 'enregistre le mot à rechercher
PasPremiereRecherche = True
   
End Sub

maintenat ceci fonctionne très bien
mais je crois que je vais reprendre votre formule  pour éviter d'utiliser un module de classe
je vais me repencher ladessus

merci encore pour votre aide
0
cs_marco62118 Messages postés 176 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 1 avril 2013 1
1 févr. 2009 à 01:43
oui c'est vrai "Adresse(Mot) n'a pas de sens" mot était entrop une erreur qui m'a bien perturbé
0
cs_marco62118 Messages postés 176 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 1 avril 2013 1
1 févr. 2009 à 01:47
merci c'est impécable j'ai rectifié et ça me parrait plus simple mais l'utilisation de type personnel dans des tableaux pose énormément de problème même ensuite avec each ça ne fonctionne pas
merci
merci aussi à toi cnt qui a vu ma bévue
0
Rejoignez-nous