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

Contribuez Discussion :

[VBA] Passage objet Form : err 13 incompatibilité de type. [Fait]


Sujet :

Contribuez

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 166
    Points : 169
    Points
    169
    Par défaut [VBA] Passage objet Form : err 13 incompatibilité de type.
    Bonjour,

    Je déclare une variable frm de type Form. Je boucle sur la collection Forms et pour chaque frm ouvert, j'appelle une fonction setLangue(frm as Form). Selon la fenêtre espion, frm est bien initialisé à un formulaire. J'obtiens une erreur 13 Incompatibilité de type dont je n'arrive pas à m'expliquer.

    Quand je copie le code de setLangue directement dans setLangueAll, j'obtiens ce à quoi je m'attends.

    Je ne vois pas où regarder d'autres pour trouver ce qui est incompatible. Des idées?

    Merci.
    Caroline

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub setLangueAll()
    Dim frm As Form
     
        'Changement des libellés-variables des modules standards
        setLangueBas
     
        'Changement des libellés de tous les formulaires ouverts
        For Each frm In Forms
            If frm.HasModule Then setLangue (frm) 'ERREUR 13 ICI
        Next
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Public Sub setLangue(frm As Form)
     
        'Changement des libellés du formulaire
        'Activation de la gestion d'erreur pour les formulaires n'ayant pas de fonction publique "Francais" ou "Anglais"
        On Error Resume Next
            Select Case m_LangueAffichage
                Case cFrancais
                    frm.Francais
                Case cAnglais
                    frm.Anglais
            End Select
        On Error GoTo 0
     
    End Sub
    N'oubliez pas le tag . En haut: Outils de la discussion -> Résolu.

  2. #2
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonsoir,

    Je ne suis pas sûr qu'on puisse passer ce genre d'objet en argument. Tu pourais essayer de passer plutôt le nom du form.
    du style
    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
    Private Sub setLangueAll() 
    Dim frm As Form 
     
        'Changement des libellés-variables des modules standards 
        setLangueBas 
     
        'Changement des libellés de tous les formulaires ouverts 
        For Each frm In Forms 
            If frm.HasModule Then setLangue (frm.name) 
        Next 
    End Sub
     
     
    Public Sub setLangue(fname As String) 
     
        'Changement des libellés du formulaire 
        'Activation de la gestion d'erreur pour les formulaires n'ayant pas de fonction publique "Francais" ou "Anglais" 
    dim frm as form
    set form = Forms(fname)
        On Error Resume Next 
            Select Case m_LangueAffichage 
                Case cFrancais 
                    frm.Francais 
                Case cAnglais 
                    frm.Anglais 
            End Select 
     
    End Sub
    Pour voir,

    Bon courage,

    pgz[/code]
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 166
    Points : 169
    Points
    169
    Par défaut
    Passer un string à la place devrait marcher, oui.

    Pourtant, j'utilise "setLangue Me" à l'ouverture de chaque formulaire multilingue et ça fonctionne très bien. Si c'était un problème de form en argument qu'Access n'aime pas, ça planterait aussi.

    EDIT : Ça fonctionne effectivement. C'est mieux que de recopier la fonction! Par contre, je ne comprends toujours pas pourquoi mon SetLangue(frm as Form) fonctionnait quand on l'appelait d'un form_Open avec SetLangue(me) et pas à partir de la boucle For Each frm in Forms...
    N'oubliez pas le tag . En haut: Outils de la discussion -> Résolu.

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut Re: [VBA] Passage objet Form : err 13 incompatibilité de typ
    Bonjour Caroline,

    Je pense que le Pb se situe au niveau du passage de paramètre à la procédure setLangue.

    Il s'agit d'une procédure Sub, qui n'a pas besoin de parenthèses autour des paramètres.
    Ou bien, il faut utiliser la syntaxe d'appel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call <nom procédure Sub> (<arg1>,...<arg n>)
    Dans ton cas, les parenthèses sont interprétées comme une expression à évaluer pour obtenir le paramètre qui sera finalement passé à la procédure.
    Et VBA ne sait pas évaluer une expression comme (<object>).

    Alors choisis...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If frm.HasModule Then setLangue frm
     
    OU
     
    If frm.HasModule Then Call setLangue(frm)
    Quant à la solution de passer en paramètre le nom de l'objet, proposée par pgz, elle ne me convient pas trop car j'utilise fréquemment de multiples instances du même formulaire... et du coup le nom du formulaire n'est plus discriminant.

  5. #5
    Expert éminent
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Points : 6 781
    Points
    6 781
    Par défaut
    Hello,

    on peut parfaitement passer en argument, un objet / collection / variant / form / controle ... ce qui atteste que le problème se situe ailleurs.

    je pense que le post de JBO est une bonne piste.
    Ne mettez pas "Problème" dans vos titres, par définition derrière toute question se cache un problème
    12 tutoriels Access



  6. #6
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Comme cafeine, je pense que JBO a mis le doigt là où il fallait.

    Faut quand même avouer que le passage d'argument à une sub est un peu tordu en VB6.

    Tant qu'on est dans la manipulation de objets, je vais donner deux petites astuces.

    L'utilisation de IS. Is permet de vérifier si deux variables resence le même objet. Exemple dans ton cas pour éviter le formulaire courant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        For Each frm In Forms 
            If frm.HasModule And Not (frm Is Me) Then setLangue (frm.name) 
        Next
    Si frm représente le même objet que Me alors la condition est vrai. Not ... est donc faux, on ne passe pas dans le IF.

    L'utilisation de Set

    En VB on peut déclarer les objets de deux façon :

    Imaginons, une classe nommé clToto possédant une méthode mamethode.

    Je peux déclarer ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim obj as new clToto
    obj.mamethode
    ou bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim obj as clToto
    Set obj= New clToto
    obj.mamethode
    Pourtant, il existe une différence fondamentale entre les deux syntaxe. En Visual Basic, dés qu'une méthode est appelée, une vérification interne est réalisée. Celle ci consiste à vérifier que l'objet a été instancié avant l'appel. Le mot clé SET permet d'outrepasser cette vérification et de dire explicitement au système que l'objet a été instancié. Ainsi, on gagne de nombreuses vérifications internes qui auraient dûes être effectuées à chaque fois que l'objet aurait été référencé. La syntaxe 2 consomme donc une ligne de code de plus mais est beaucoup plus performante

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 166
    Points : 169
    Points
    169
    Par défaut Re: [VBA] Passage objet Form : err 13 incompatibilité de typ
    Citation Envoyé par =JBO=
    Je pense que le Pb se situe au niveau du passage de paramètre à la procédure setLangue.

    Il s'agit d'une procédure Sub, qui n'a pas besoin de parenthèses autour des paramètres.
    Arf... Pile dessus! Je suis déjà tombé sur ce "problème" en utilisant msgbox. Jamais pensé à ça avec setLangue.

    J'ai tout remis comme le premier code et j'ai enlevé les parenthèses. Je trouve bien plus "élégant" de passer l'objet. Pour l'instant, je n'ai pas plusieurs instances du même formulaire mais ça pourrait arriver.

    Merci JBO!

    Citation Envoyé par Tofalu
    [...]And Not (frm Is Me)
    C'est vrai que ça aurait pu poser problème mais là, la fonction est définie dans un module.

    Citation Envoyé par Tofalu
    L'utilisation de Set [...] La syntaxe 2 consomme donc une ligne de code de plus mais est beaucoup plus performante Wink
    Merci pour l'information! C'est bon à savoir.

    Caroline
    N'oubliez pas le tag . En haut: Outils de la discussion -> Résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. passage d'objets forms
    Par Invité dans le forum VB.NET
    Réponses: 6
    Dernier message: 01/06/2007, 09h24
  2. VB6 - connaître si un objet Form est chargé en mode MODAL
    Par CBleu dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 04/01/2006, 21h16
  3. [VBA] Code entre forms
    Par Virgile59 dans le forum Access
    Réponses: 3
    Dernier message: 28/12/2005, 21h57
  4. VBA - Copier Req, Forms & Etats dans un autre MDB
    Par ChrOnOs83 dans le forum IHM
    Réponses: 3
    Dernier message: 20/12/2005, 15h20
  5. VBA : export objet OLE
    Par ghisl1 dans le forum Access
    Réponses: 2
    Dernier message: 12/10/2005, 22h23

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