Un objet en VBA, quelle philosophie ?

Bonjour,

Avant tout, je suis nouveau sur le forum, ingénieur en informatique depuis longtemps, mais je n'ai jamais vraiment touché au VBA.

Et j'ai l'impression que je passe à coté d'une philosophie de codage qui n'est pas équivalente dans les autres langages que je peux manipuler.

J'ai écris le suivant :

Option Explicit

Sub listefichier()
    Dim dossier As String, fichier As String, i As Integer
    Dim objWord As Object
    Dim objShell As Object
    Dim WScript As Object
    Dim myCur As String
    Dim objDoc As Object
    Set objWord = CreateObject("Word.Application")

    Set objShell = CreateObject("WScript.Shell")
    'WScript.Echo (objShell.CurrentDirectory)
    myCur = objShell.CurrentDirectory

    dossier = myCur & "\*.docx"
    i = 0
    fichier = Dir(dossier)
    Dim nombre As Integer

    Do While fichier <> ""
        i = i + 1

        Sheets("Feuil1").Range("A" & i) = fichier

        Set objDoc = objWord.Documents.Open(myCur & "\" & fichier)
        objWord.Visible = True
        nombre = objDoc.InlineShapes.Count

        traiterFormulaire (objDoc)

        Set objDoc = objWord.Document.Close(myCur & "\" & fichier)

        fichier = Dir
    Loop
End Sub

Function traiterFormulaire(myDocument)
'https://docs.microsoft.com/fr-fr/office/vba/excel/concepts/working-with-other-applications/controlling-one-microsoft-office-application-from-another

    Dim nombre As Integer
    nombre = myDocument.InlineShapes.Count
    'Dim var As InlineShapes
    Dim IShape As Object
    For Each IShape In myDocument.InlineShapes
        Debug.Print IShape.OLEFormat.Object.Selected
        Debug.Print "d"
     'var = iShape
     'var.ConvertToShape
    Next IShape

End Function

Si on met un point d'arrêt sur la ligne traiterFormulaire (myDocument), voilà ce que l'on observe :

nombre = 12
objDoc = Watch :   : objDoc : <Expression non définie dans le contexte> : Empty : ThisWorkbook.traiterFormulaire

Et si je laisse la souris au dessus de objDoc, il me met dans une info bulle : "b.docx".

Tout cela n'est pas cohérent. Si la valeur 12 est trouvée, c'est que l'objet est bien défini, et que ses variables membres sont bien initialisées. Pourquoi le trouve-t-il empty ensuite, pour finalement dire qu'il contient un string ?

Merci beaucoup pour votre aide !

Bonjour et sur le forum

Je ne connais pas tout sur VBA et son fonctionnement, mais je sais que j'ai ce genre de message si par exemple j'écris:

Sub test()
with Feuil1
    msgbox(.range("a1"))
end With
End Sub

et que je regarde directement .range("a1"), il faut que je regarde feuil1.range("a1") pour que VBA puisse me donner sa valeur pour cet exemple, j'ai l'impression que ça nous fait ça quand on est pas assez explicite pour l'espion, là c'est possible que le problème vienne du fait que tu gères un objet Word par exemple, essaye peut-être de regarder objWord.Documents.Open(myCur & "\" & fichier) par exemple pour ton espion. La différence quand tu passes le curseur sur ton objet c'est que VBA semble comprendre le contexte de ton objet, et le fait que nombre affiche bien 12, c'est que c'est une variable simple, un Integer qui n'a pas ce genre de problème avec le programme

En clair, ton objet existe, c'est juste que l'espion n'arrive pas à lire ses propriétés avec les informations que tu lui donnes car il ne comprend pas le contexte de ton objet.

j'espère avoir pu t'éclaircir un peu...

Bonjour Ausecour,

Merci de ta réponse.

Hum, si j'utilise objWord.Documents.Open(myCur & "\" & fichier) comme espion, ça correspond à ouvrir une deuxième instance du fichier. Ca va causer des ennuis.

Si j'ai bien compris votre intuition, il faut que je trouve les adresses absolues des variables. C'est pas simple cette histoire.

Je m'en vais chercher de ce pas.

Merci pour la piste !

Re,

en effet je n'avais pas vu le mot Open

dans ce cas peut-être avec:

objWord.Documents(myCur & "\" & fichier)

si je ne me trompe pas, documents devrait être une collection comprenant tous les fichiers Word ouverts, comme tu as ouvert le fichier, il devrait s'y trouver et tu dois pouvoir l'appeler par son nom

looooooooooooool

Si je mets dans le debugeur

ThisWorkbook.listefichier.objDoc => il ne connait pas.

Si je mets : VarType(objDoc), il me dit que c'est une Long(8)

Et moi en fait, ce que je veux, c'est qu'il passe l'objet à ma fonction, c'est pas très grave si je n'arrive pas à le lire dans le débogueur

En redemarrant toute la suite office, j'ai l'objet et son arborescence dans le debogeur, mais en tant que paramètre de la fonction, il ne passe que son TypeName ...

Edit : Documents est Empty d'après le deboger.

Si je mets : VarType(objDoc), il me dit que c'est une Long(8)

je viens de regarder la doc de la fonction VarType, 8 correspond à String, soit une chaîne de caractère, pas un Long

tu fais bien objWord.Documents ?

Bonjour,

dans ta fonction

Function traiterFormulaire(myDocument)

tu n'as pas typé le paramètre mydocument, et VBA va devoir prendre une option par défaut qui n'est pas celle que tu souhaites. il va prendre par défaut une propriété de l'objet (son nom) et lui attribuer un type string.

si tu veux passer un objet, définis ta fonction ainsi

Function traiterFormulaire(myDocument as object)

Bonjour,

En effet, la définition du type Sub traiterFormulaire(objDoc As Object) était la solution.

Mais maintenant, il y a le deuxième effet kisscool ^^ trop éloigné de celui-ci, je vais refaire un topic.

Merci !

Oh je vois heureusement que j'essaye de plus en plus de définir le type des variables que j'utilise pour les programmes VBA

Merci pour ton intervention

Merci !

Rechercher des sujets similaires à "objet vba quelle philosophie"