2016-10-21 2 views
-1

Je lis des données à partir d'une feuille de calcul Excel dans une macro de mot pour que je puisse utiliser la feuille de calcul pour instancier un document à partir d'un modèle et définir les propriétés du document instancié de la table Excel. J'essaie d'être aussi explicite avec les types que je peux, mais il s'avère que l'objet qui revient d'une sélection excel a des lignes tapées différemment d'une ligne dans un document Word. Pas vraiment si surprenant maintenant que j'y pense. Existe-t-il une classe de base commune plus spécifique que Object entre un type de ligne de feuille de calcul Excel et un type de ligne de table de mots? Peut-être un moyen de spécifier ce type de ligne Excel? Ou est mon meilleur pari d'utiliser le type d'objet et ne pas s'inquiéter des détails. Le typage dynamique est incroyable ici, la plupart des méthodes de classe sont les mêmes.VBA Interop: Existe-t-il un moyen d'utiliser explicitement les types de données Excel dans une macro de mots et inversement?

Je suis également intéressé à l'exécution de VBA base des sous-routines de mots (situés dans des conditions normales) à partir d'Excel VBA. J'ai essayé de chercher par Google, mais je n'ai pas eu de chance.

Les tripes sont ici:

Set testList = LoadExcel(strFile) 
testList.Activate 

Dim allSuites As Object 
' LoadExcel also selects the rows that contains the data we want in excel 
Set allSuites = testList.sheets("FullSuiteList").Application.Selection 

Dim myRow As row 
Dim Columns() As String 

    Dim i As Integer 

    ' Previously I used a table in word, but there are too many columns 
    '  to be manageable 
    ' LoadPropertyNames testList.Tables(1).Rows(1), Columns 
    ' For i = 2 To testList.Tables(1).Rows.Count 


    ' Now we get data directly from our Excel sheet 
    LoadPropertyNames allSuites.Rows(1), Columns 

    For i = 2 To allSuites.Rows.Count 
     CreateOne allSuites.Rows(i), Columns 
    Next I 

    ' row type yields type mismatch at runtime. myrow as Object works though. 
    Function LoadPropertyNames(myRow As row, Columns() As String) 
    ... 
    End Function 

    ' row type yields type mismatch at runtime. myrow as Object works though. 
    Function CreateOne(myRow As row, Columns() As String)   
    ... 
    End Function 
+0

En regardant les questions similaires, VBA n'est pas bien reçu ici, intéressant. – BenPen

+0

Dans l'éditeur VBA, dans le menu Outils, choisissez Références, puis ajoutez "Microsoft Excel ##. # Bibliothèque d'objets" à votre projet Word VBA. Cela vous donnera accès à tous les objets d'Excel. Notez que certains noms d'objets, par ex. "Range" représente différents objets dans Word vs Excel, donc déclarez les variables comme Word.Range ou Excel.Range comme approprié. – xidgel

+0

@xidgel Oh, c'est super facile, putain. C'est exactement ce dont j'avais besoin, transformer cela en une réponse, et je vais mettre l'étiquette élémentaire sur cette question. – BenPen

Répondre

1

Dans l'éditeur VBA, dans le menu Outils puis choisissez Références ajouter "Microsoft Excel ## # Object Library." À votre projet VBA Word. Cela vous donnera accès à tous les objets d'Excel. Notez que certains noms d'objets, par ex. "Range" représente différents objets dans Word vs Excel, donc déclarez les variables comme Word.Range ou Excel.Range comme approprié.

+0

Merci! Il n'y a pas de façon similaire facile d'accéder aux sous-programmes dans le fichier normal.dotm d'Excel, est-ce qu'il existe? – BenPen

+0

Oui, il y a. Je l'afficherai dans une autre réponse pour qu'il soit plus facile à lire qu'un commentaire. – xidgel

0

Pour répondre à votre question dans le commentaire sur l'exécution d'un des sous-routines du modèle Normal. Tout d'abord dans Excel, ajoutez une référence au modèle d'objet Word --- dans le menu Outils, choisissez Références, puis ajoutez "Microsoft Word ##. # Bibliothèque d'objets" à votre projet Excel. Alors, voici un exemple de comment appeler un sous modèle Normal:

Sub RunNormalTemplateSub() 
    Dim wdapp As Word.Application 
    Dim wddoc As Word.Document 

    Set wdapp = New Word.Application 
    wdapp.Visible = True 

    ' This is the line that runs the sub 
    ' This runs a sub named "ThisIsATest" 
    ' in the module "Sandbox" 
    ' in the Project/Template "Normal" 
    wdapp.Run "Normal.Sandbox.ThisIsATest" 

    ' If the sub takes arguments then you would call 
    ' wdapp.Run "Normal.Sandbox.ThisIsATest", Arg1, Arg2 


    Set wdapp = Nothing 

End Sub 

Notez que Parole exécute le sous-programme. Je ne connais pas de moyen d'avoir Excel sous le sous-programme Word (peut-être que cela peut être fait, mais je ne sais pas comment). En espérant que ça aide

+0

C'est aussi une bonne chose. Cela fait si longtemps que je navigue dans le VBA, mais des choses faciles comme celles-ci me surprennent toujours. Comment la zone VBA est-elle terminée sur la documentation bêta? Au fait, je pense que c'est bien que ce mot l'exécute. Cela impliquerait une certaine gymnastique de la part de Microsoft pour obtenir les modèles d'objet de mot vs excel à repasser correctement pour le code VBA étranger. – BenPen