XL 2021 Excel/vba et vb.net: Propriété de type OBJECT "ingérable"

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

p'tit vieux

XLDnaute Occasionnel
Bonjour à tous
Je ne sais pas si parmi vous certains connaissent vb.net et COM avec VBA.
je suis en train de faire un portage de certaines parties d'un UDF VBA en vb.net.
Je suis débutant en .NET.
Mon problème est "simple" j'ai créé des classes en VB.Net et certaines propriétés doivent être des types Object. Pas le choix.
Devinez!!
Je bloque sur le fait que lorsque je veux passer une valeur à cette propriété de type Object je me fais "jeter".
pour exemple voici ce que j'ai fait:
<ComVisible(True)>
<ClassInterface(ClassInterfaceType.AutoDual)>
Public Property ValueMax As Object
Get
Return _ValueMax
End Get
Set
_ValueMax = Value
End Set
End Property
Quelqu'un peut il m'aider à résoudre ce souci?
Par avance merci à tous.
 
Solution
bonjour,
le problème n'est pas lié aux String mais au objet qui en vba.net sont des variants et des classes en VBA.

il faut bien considérer qu'en vb.net tout est classe. un string en est une.

il faudrait écrire
Code:
set obj.truc=123
ce qui n'est pas possible si truc est un object.

VB:
set obj.truc= me.textbox1
ça c'est ok

si on oublie les instructions com
<ComVisible(True), ClassInterface(ClassInterfaceType.AutoDual)>
ça fonctionne truc=123 mais on perd l'intestil.

il doit être possible de lui dire oublies le typage mais comme faire pour garder l'interopérabilité entre vb.net et VBA ?
bonjour,
j'imagine que tu as créé une bibliothèque de classe ?
VB:
Classe Toto
private _ValueMax as Object
Public Property ValueMax As Object
    Get
        Return _ValueMax
    End Get
    Set(value As Object)
        _ValueMax = value
    End Set
End Property
end classe

ensuite soi tu registre ta librairie:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe

soit tu importe le manifeste dans excel :
Menu Outils → Références → Parcourir…
le fichier porte l'extension [tlb]
 
Dernière édition:
bonjour,
VB:
Classe Toto
private _ValueMax as Object
Public Property ValueMax As Object
    Get
        Return _ValueMax
    End Get
    Set(value As Object)
        _ValueMax = value
    End Set
End Property
end classe
Bonjour Dysort.
Merci pour ta réponse
mais cela ne résout pas le problème qui est dans VBA lorsque je tente d'affecter une valeur :
set toto.ValueMax = 789 ' tout simplement ou aussi une chaine
je me fais jeter : "erreur de type"
A priori je crois que COM a du mal "à digérer" le type Object
 
1774608804182.png
 
tu as dit objet mais quel genre d'objets ?
peut être qu'il faut décliner t.ValueMax.value

si tu mets t dans l'espion ?

comment as tu intègres ta librairie dans les références excel ?

789 n'est pas un objet mais avant toute chose regarde si l'instance t existes
 
Dernière édition:
tu as dit objet mais quel genre d'objets ?
peut être qu'il faut décliner t.ValueMax.value

si tu mets t dans l'espion ?

comment as tu intègres ta librairie dans les références excel ?

789 n'est pas un objet mais avant toute chose regarde si l'instance t existes
par le menu VBE Références: Maclasse.TLB
oui l'instance existe sinon comme le montre la capture je n'aurais pas cela
Quand tu ne sais pas c'est un cauchemard ... je te le dis 😭
 
retour à visualiser studio
Va dans fichier ajouter un nouveau projet de type console par exemple. et défini le comme projet de démarrage.

vas dans le propriété de ce nouveau projet et active la référence qui ce trouve dans la solution
dans sub main déclare un instances de ta librairie.

tan que tu n'arrives pas à l'utiliser dans Visual studio tu ne pourras pas l'utiliser dans excel
 
déjà on peut éliminer le coté VS.
ceci dit la propriété retourne en objet pas une variable classique!
VB:
Sub test()
    Dim t As New AL7_FDXDLL.clsColumnInfo
    t.ValueMin = 10 'la conversion en object est implicite coté vb.net
    Debug.Print CDbl(t.ValueMin)  ' ou CStr(t.ValueMin)
End Sub
 
déjà on peut éliminer le coté VS.
ceci dit la propriété retourne en objet pas une variable classique!
VB:
Sub test()
    Dim t As New AL7_FDXDLL.clsColumnInfo
    t.ValueMin = 10
    Debug.Print CDbl(t.ValueMin)  ' ou CStr(t.ValueMin)
End Sub
Oui sinon j'aurais les mêmes problèmes avec les autres propriétés de la classe et ce n'est pas le cas.
Juste avec celles déclarées comme Object. D'aprés ce que j'ai pu lire (mais bon je suis novice) c'est fréquent avec les types Object et interfaces COM. Mais pas trouvé de solution qui fonctionne.
 
1774629876778.png


VB:
Imports System.Runtime.InteropServices

Public Class ClsColumnInfof

    Private _ValueMax As Object

    Public Property ValueMax As Object
        Get
            Return _ValueMax
        End Get
        Set(Value As Object)
            _ValueMax = Value
        End Set
    End Property

End Class

registrer la dll
Code:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe "C:\Projets GuilLab\al7_fdxdll\AL7_FDXDLL\bin\x86\Debug\AL7_FDXDLL.dll"
dé registrer la dll
Code:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe "C:\Projets GuilLab\al7_fdxdll\AL7_FDXDLL\bin\x86\Debug\AL7_FDXDLL.dll" /unregister

 
Dernière édition:
Regarde la pièce jointe 1229018

VB:
Imports System.Runtime.InteropServices

Public Class ClsColumnInfof

    Private _ValueMax As Object

    Public Property ValueMax As Object
        Get
            Return _ValueMax
        End Get
        Set(Value As Object)
            _ValueMax = Value
        End Set
    End Property

End Class

registrer la dll
Code:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe "C:\Projets GuilLab\al7_fdxdll\AL7_FDXDLL\bin\x86\Debug\AL7_FDXDLL.dll"
dé registrer la dll
Code:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe "C:\Projets GuilLab\al7_fdxdll\AL7_FDXDLL\bin\x86\Debug\AL7_FDXDLL.dll" /unregister

bonjour dyso
j'ai regardé ton code.
je n'ai rien remarqué de plus. Désolé.
Jusqu'à présent la seule chose qui fonctionne c'est de déclarer ceci:
<ComVisible(True)>
<ClassInterface(ClassInterfaceType.AutoDispatch)>

Inconvénient dans la fenetre espions de vba tu ne vois plus la totalité de la classe juste propriété par propriété.
Tu perds aussi l'Intesense et l'autocomplétioon. Donc il faut connaitre toutes les propriété par cœur 🤕😁.
A ce stade une seule propriété avec un type Object pour le passage d'un variant VBA vers un type Object oblige à faire cela.

Merci pour ton aide.
P.S. :
Si je trouve une solution je te la mettrai ici.
 
bonjour,
Ok je regarde pour l'Intesense
[
Code:
Imports System.Runtime.InteropServices

<ComVisible(True)>
<ClassInterface(ClassInterfaceType.AutoDual)>
Public Class ClsColumnInfof

    Private _ValueMax As Object

    Public Property ValueMax As Object
        Get
            Return _ValueMax
        End Get
        Set(Value As Object)
            _ValueMax = Value
        End Set
    End Property

End Class
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

A
Réponses
17
Affichages
4 K
Abdenour
A
G
Réponses
0
Affichages
1 K
guiboubou233
G
C
Réponses
1
Affichages
4 K
Conrad13
C
T
Réponses
11
Affichages
8 K
T
Réponses
2
Affichages
1 K
B
Réponses
4
Affichages
1 K
B
Retour