2017-08-23 1 views
0

Je suis coincé avec quelque chose que je ne peux pas comprendre (mais je sais que ce pourrait être très simple). J'essaie une routine d'utilisation générale pour recueillir les attributs des objets typiques de mots tels que des tables, des zones de texte, les gammes, etc. va ici l'idée:VBA passant word.table à sous-routine en utilisant la variable objet

Sub GetWobjectAttributes(ByRef WObject As Object) 

    If TypeOf WObject Is Word.Table Then 
      'grab table attributes 
     ElseIf TypeOf WObject Is Word.Range Then 
      'grab range attributes 
     ... 

     End If 
    End Sub 

Malheureusement, l'objet passe en utilisant le type d'objet générique semble changer le type de passé objet. Par exemple l'exécution sous test:

Sub test() 


GetWobjectAttributes (ThisDocument.Tables(1)) 

'MsgBox (TypeName(ThisDocument.Range.Tables(1))) 

End Sub 


Public Sub GetWobjectAttributes(ByRef WObject As Variant) 

    MsgBox (TypeName(WObject)) 

End Sub 

message indiquant:

Range au lieu de "Table" (mais l'exécution MsgBox (TypeName (ThisDocument.Range.Tables (1))) directement dans le test sous (a commenté dans l'exemple) qui affiche:.? Tableau

Toute idée comment passer objet de type sous-programme sans unkown à

Répondre

0

changement de type Le point est que vous ca ll le Sub comme une fonction (en ajoutant() autour du paramètre). Cela renvoie apparemment le «membre par défaut», c'est-à-dire Range.

Appelez le sous comme un sous en supprimant le() autour du paramètre et il sera à la fois le tableau de retour:

Sub test() 

    GetWobjectAttributes ThisDocument.Tables(1) 

    MsgBox (TypeName(ThisDocument.Range.Tables(1))) 

End Sub 


Public Sub GetWobjectAttributes(ByRef WObject As Variant) 

    MsgBox (TypeName(WObject)) 

End Sub 
+0

Merci, il est maintenant évident. J'ai eu un peu de cerveau:/Solution fonctionne parfaitement. – jareckii