2016-10-21 3 views
-1

Ich lese Daten aus einer Excel-Tabelle in einem Word-Makro, damit ich die Tabelle verwenden kann, um ein Dokument aus einer Vorlage zu instanziieren und Eigenschaften im instanziierten Dokument aus der Excel-Tabelle festzulegen. Ich versuche, mit Typen so explizit zu sein, wie ich kann, aber es stellt sich heraus, dass das Objekt, das von einer Excel-Auswahl zurückkommt, Zeilen anders als eine Zeile in einem Worddokument getippt hat. Nicht wirklich überraschend, jetzt, wo ich darüber nachdenke. Gibt es eine gemeinsame Basisklasse, die spezifischer ist als Object zwischen einem Tabellenkalkulations-Zeilentyp und einem Wort-Tabellen-Zeilentyp? Vielleicht eine Möglichkeit, diesen Excel-Zeilentyp anzugeben? Oder ist es am besten, den Objekttyp zu verwenden und sich nicht um die Details zu kümmern. Dynamisches Tippen ist hier erstaunlich, die meisten Klassenmethoden sind gleich.VBA Interop: Gibt es eine Möglichkeit, Excel-Datentypen explizit in einem Word-Makro zu verwenden und umgekehrt?

Ich bin auch daran interessiert, Word-basierte VBA-Subroutinen (in normalen) von Excel VBA laufen. Ich habe versucht, über Google nachzusehen, hatte aber kein Glück.

Die Eingeweide sind hier:

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

Mit Blick auf die ähnlichen Fragen, VBA ist nicht gut hier, interessant. – BenPen

+0

Wählen Sie im VBA-Editor im Menü Extras die Option Verweise, und fügen Sie Ihrem Word VBA-Projekt "Microsoft Excel ##. # Objektbibliothek" hinzu. Dadurch erhalten Sie Zugriff auf alle Excel-Objekte. Beachten Sie, dass einige Objektnamen, z. "Bereich" stellt verschiedene Objekte in Word vs. Excel dar, deklarieren Sie Variablen daher als Word.Range oder Excel.Range. – xidgel

+0

@xidgel Oh, das ist super einfach, verdammt. Das ist genau das, was ich brauchte, verwandle das in eine Antwort, und ich werde das elementare Tag auf diese Frage setzen. – BenPen

Antwort

1

Im Editor VBA, in dem Menü Extras wählen Referenzen fügen Sie dann "Microsoft Excel ## # Object Library." Zu einem Projekt Word-VBA. Dadurch erhalten Sie Zugriff auf alle Excel-Objekte. Beachten Sie, dass einige Objektnamen, z. "Bereich" stellt verschiedene Objekte in Word vs. Excel dar, deklarieren Sie Variablen daher als Word.Range oder Excel.Range.

+0

Danke! Es gibt keine ähnlich einfache Möglichkeit, auf Unterroutinen in Word normal.dotm von Excel zuzugreifen, oder? – BenPen

+0

Ja, es gibt. Ich werde es in einer anderen Antwort veröffentlichen, um es leichter zu lesen als einen Kommentar. – xidgel

0

Um Ihre Frage in dem Kommentar über das Ausführen eines der Subroutinen der normalen Vorlage zu beantworten. Zuerst in Excel fügen Sie einen Verweis auf das Word-Objektmodell --- im Menü Extras wählen Sie Referenzen und fügen Sie "Microsoft Word ##. # Objektbibliothek" zu Ihrem Excel-Projekt. Dann ist hier ein Beispiel, wie eine normale Vorlage Unter nennen:

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 

Beachten Sie, dass Wort das Unterprogramm ausgeführt wird. Ich weiß nicht, wie Excel das Word-Unterprogramm ausführen kann (vielleicht kann es gemacht werden, aber ich weiß nicht wie).

Hoffe, dass hilft

+0

Das ist auch gutes Zeug. Ich habe mich schon so lange mit VBA beschäftigt, aber solche einfachen Dinge überraschen mich immer noch. Wie ist der VBA-Bereich in der Dokumentation Beta? Übrigens, ich denke, es ist gut, dass das Wort es beherrscht. Es würde einige Gymnastik von Microsoft beinhalten, um die Objektmodelle von Word vs Excel zu erhalten, um den fremden VBA-Code richtig auszubügeln. – BenPen

Verwandte Themen