Import z Tabeli w Pliku Word'a   strona główna:
A po co ten Excel ;-)
  strona główna
     Dziś trochu o automatyzacji.  
  Najlepsza książka o Excelu i VBA
jak wpadła mi w ręce :-)
"Wszystkie aplikacje Office są w stanie eksponować swoje obiekty do innych. Można programować współpracę  
między nimi z poziomu dowolnej z nich. Aby na przykład pracować z obiektami Worda w Excelu, trzeba tylko    Excel 2007 PL.
Programowanie w VBA
Autorzy: John Green, Stephen Bullen, Rob Bovey, Michael Alexander
ustawić łącze do Worda. Uzyskamy w ten sposób dostęp do jego obiektów, tak jakbyśmy programowali VBA  
w samym Wordzie."  
                                              Excel 2007 PL. Programowanie w VBA  
                                                Rozdział. 19 Współpraca z innymi aplikacjami Office. s. 459  
 
     Naszym zadaniem na dziś będzie napisanie narzędzia do importu danych z tabeli w pliku Worda do komórek Arkusza Excela.  
 
Zastanówmy się jaki informacje będą nam potrzebne:  
    - ścieżka do pliku (strDOCFileFullName)  
    - trzeba określić z której tabeli dane nas interesują (nrTabeli)  
    - z których kolumn lub całej tabeli chcemy importować dane (nrKol())  
 
    Naszym celem jest utworzenie tablicy która przechowa określone dane z tabeli Worda. Napiszemy więc funkcję która zwróci taką tablicę.  
Żeby jednak wygodnie zwrócić tę tablicę do komórek arkusza będziemy potrzebować znać wymiary tej tablicy. Oczywiście wystarczyłyby funkcje  
Lbound i Ubound. Jednak te wymiary są już znane na etapie tworzenia tablicy. Zatem nasza funkcja, oprócz samej tablicy danych może również   User Defined Types
Daily Dose of Excel
zwracać wymiary utworzonej tablicy. Jak jednak funkcja może zwracać więcej niż jeden wynik / tablicę? Funkcja może zwracać strukturę danych  
określonych przez użytkownika jako Typ danych UDT (User Defined Type). I nasza funkcja zwróci właśnie taką strukturę (wdTableInfo)  
 
    Typ danych wdTableInfo oraz funkcja ImportZDOCTable poniżej  
 
Option Explicit  
 
Type wdTableInfo  
    lngRowsCount As Long  
    intColumnsCount As Integer  
    vDateTable As Variant  
End Type  
 
Function ImportZDOCTable(strDOCFileFullName As String, _  
                         nrTabeli As Integer, _  
                         ParamArray nrKol() As Variant) As wdTableInfo  
      
    On Error GoTo ImportZDOCTable_Error  
      
    Dim wdApp As Object 'Word.Application  
    Dim wdDoc As Object 'Word.Document  
    Dim wdTable As Object 'Word.Table  
    Dim tbl() As Variant, i As Long, j As Integer  
    Dim nr As Variant  
    Dim strNewLineChr As String  
      
    strNewLineChr = Chr(13) & Chr(7)  
      
    Set wdApp = VBA.CreateObject("Word.Application")  
    With wdApp  
        '.Visible = True  
        Set wdDoc = .Documents.Open(Filename:=strDOCFileFullName)  
        With wdDoc  
            Set wdTable = .Tables(nrTabeli)  
            With wdTable  
                ImportZDOCTable.lngRowsCount = .Rows.Count  
                If IsMissing(nrKol) Then  
                    ImportZDOCTable.intColumnsCount = .Columns.Count  
                    ReDim tbl(1 To .Rows.Count, 1 To .Columns.Count)  
                    For i = 1 To .Rows.Count  
                        For j = 1 To .Columns.Count  
                            tbl(i, j) = Replace(.Cell(i, j).Range.Text, _  
                                                strNewLineChr, _  
                                                vbNullString)  
                        Next  
                    Next  
                Else  
                    ImportZDOCTable.intColumnsCount = UBound(nrKol) + 1  
                    ReDim tbl(1 To .Rows.Count, 1 To UBound(nrKol) + 1)  
                    For i = 1 To .Rows.Count  
                        For Each nr In nrKol  
                            j = j + 1  
                            tbl(i, j) = Replace(.Cell(i, nr).Range.Text, _  
                                                strNewLineChr, _  
                                                vbNullString)  
                        Next  
                        j = 0  
                    Next  
                End If  
            End With  
            .Close False  
        End With  
        .Quit  
    End With  
      
    ImportZDOCTable.vDateTable = tbl  
      
    Set wdDoc = Nothing  
    Set wdApp = Nothing  
      
ImportZDOCTable_Exit:  
    On Error Resume Next  
    If Not wdDoc Is Nothing Then  
        wdDoc.Close SaveChanges:=False  
        Set wdDoc = Nothing  
    End If  
    If Not wdApp Is Nothing Then  
        wdApp.Quit  
        Set wdApp = Nothing  
    End If  
Exit Function  
       
ImportZDOCTable_Error:  
    MsgBox "Błąd Nr - " & Err.Number & vbCrLf & vbCrLf & _  
            Err.Description, vbExclamation, "VBAProject - ImportZDOCTable"  
    Resume ImportZDOCTable_Exit  
 
End Function  
 
I przykładowa procedura.  
     
Sub Test()  
    Dim tbl As wdTableInfo  
    Dim xlWks As Excel.Worksheet  
      
    Const strFileName As String = "C:\Users\MiTKuchta\Desktop\test.doc"   Ciekawe strony:
    Const intDocTblNr As Integer = 1   How do I add/modify/read a (Word) table programmatically? 
      
    tbl = ImportZDOCTable(strFileName, intDocTblNr, 4, 3, 1)  
    If Not IsEmpty(tbl.vDateTable) Then  
        Set xlWks = ThisWorkbook.Worksheets("Arkusz1")  
        With tbl  
            xlWks.Range("B2").Resize(.lngRowsCount, .intColumnsCount) = .vDateTable  
        End With  
    End If  
    Set xlWks = Nothing  
      
End Sub  
 
Ścieżka do pliku - stała strFileName, nr tabeli z której importujemy - stała intDocTblNr  
 
     W linii  tbl = ImportZDOCTable(strFileName, intDocTblNr, 4, 3, 1)  tworzona jest tablica, która następnie będzie zwrócona do określonych  
komórek arkusza. Przyjrzyjmy się jej ostatnim trzem argumentom. Tak naprawdę wszystkie te liczby określają wartość jednego arg. Funkcji  
ImportZDOCTable tj tablicy nrKol(). Zauważmy że nie tylko określamy tu numery kolumn ale również ich kolejność w jakiej zostaną zwrócone do  zakresu  
docelowego. Jeżeli jednak nie podamy żadnego numeru kolumny - podawanie argumentów do funkcji zakończymy po podaniu numeru tabeli z której  
mają być importowane dane. Zostanie zaimportowana cała tabela.