Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Contribuez
Contribuez Access : Vos contributions. Postez ici vos codes sources, conseils, astuces et autres propositions. Ce forum n'est pas un forum technique mais destiné aux contributions pour www.developpez.com
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/04/2006, 21h33   #1
Membre habitué
 
Inscription : mars 2006
Messages : 166
Détails du profil
Informations personnelles :
Âge : 34
Localisation : Canada

Informations forums :
Inscription : mars 2006
Messages : 166
Points : 145
Points : 145
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 :
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 :
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
Caroline1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/04/2006, 22h00   #2
pgz
Expert Confirmé Sénior
 
Avatar de pgz
 
Homme Pierre GONZALEZ
Développeur Office VBA
Inscription : août 2005
Messages : 3 412
Détails du profil
Informations personnelles :
Nom : Homme Pierre GONZALEZ
Âge : 58
Localisation : France

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

Informations forums :
Inscription : août 2005
Messages : 3 412
Points : 5 934
Points : 5 934
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 :
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]
pgz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/04/2006, 22h13   #3
Membre habitué
 
Inscription : mars 2006
Messages : 166
Détails du profil
Informations personnelles :
Âge : 34
Localisation : Canada

Informations forums :
Inscription : mars 2006
Messages : 166
Points : 145
Points : 145
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...
Caroline1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2006, 07h35   #4
En attente de confirmation mail
 
Inscription : février 2005
Messages : 1 731
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : février 2005
Messages : 1 731
Points : 2 010
Points : 2 010
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 :
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 :
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.
=JBO= est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2006, 10h22   #5
Expert Confirmé Sénior

 
Avatar de cafeine
 
Inscription : juin 2002
Messages : 3 882
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 3 882
Points : 4 500
Points : 4 500
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

Développez une application de gestion des comptes bancaires dans Access de A à Z
Déjà 12 tutoriels, le dernier en date : Comment faire un TextBox auto-extensible dans un formulaire ?


cafeine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2006, 11h21   #6
Rédacteur

 
Avatar de Tofalu
 
Christophe Warin
Inscription : octobre 2004
Messages : 8 635
Détails du profil
Informations personnelles :
Nom : Christophe Warin
Âge : 28

Informations forums :
Inscription : octobre 2004
Messages : 8 635
Points : 13 718
Points : 13 718
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 :
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 :
1
2
Dim obj as new clToto
obj.mamethode
ou bien

Code :
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
Tofalu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2006, 14h39   #7
Membre habitué
 
Inscription : mars 2006
Messages : 166
Détails du profil
Informations personnelles :
Âge : 34
Localisation : Canada

Informations forums :
Inscription : mars 2006
Messages : 166
Points : 145
Points : 145
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
Caroline1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h05.


 
 
 
 
Partenaires

Hébergement Web