Strona: [  << <   1 2   > >>  ]  z  2     
Autor Temat: Przenoszenie tabel z kilku dokumentów do jednego w Wordzie
barylek




Typ: neutral
Postów: 19
Zarejestrowany: Dec 2004
Przenoszenie tabel z kilku dokumentów do jednego w Wordzie

Witam wszystkich vba-maniaków.
Mam pytanie w jaki sposób z kilku dokumentów worda automatycznie przekopiować istniejące w nich tabele do jednego nowego dokumentu. Każdy z tych dokumentów posiada tabelę i identycznej liczbie kolumn i o różnej liczbie wierszy.

03-12-2004 19:25
Pokaż profil barylek  Wyślij email do barylek   
losmac
"profesorek"




Typ: neutral
Postów: 758
Zarejestrowany: May 2003

Sprawa jest prosta.

Przed przystąpieniem do programowania umieść wszystkie pliki w jednym katalogu.

1) Wylistuj zawartość katalogu i pobierz nazwy plików wraz z pełną ścieżką dostępu do tablicy.
2) Otwieraj kolejno plik po pliku tworząc za każdym razem obiekt Document
3) Przy każdym otwarciu, zaznaczaj tabelę i kopiuj ją na koniec dokumentu, w którym chcesz przechowywać wszystkie tabele z wszystkich dokumentów

THIS IS THE END!
MY ONLY FRIEND, THE END!

P.S.
Daj znać, a podam przykładowy kod!


_____________________________________________
POSTULATY STARUSZKA:
1) Ludzie, dbajcie o polszczyznę!!!
2) Ludzie, zadawajcie kompletne pytania, a nie rzucacie ochłapy i trzeba się domyślać o co chodzi!!!

Powodzenia
Maciej Łoś

03-12-2004 19:38
Pokaż profil losmac  Wyślij email do losmac   Odwiedź stronę losmac  
barylek




Typ: neutral
Postów: 19
Zarejestrowany: Dec 2004
re: tabela

Dzięki serdeczne spróbuje tak zrobić. Bardzo bym prosił o przykładowy kod.

03-12-2004 21:51
Pokaż profil barylek  Wyślij email do barylek   
losmac
"profesorek"




Typ: neutral
Postów: 758
Zarejestrowany: May 2003
Proszę...

Option Explicit

Sub Start()
Dim cFiles() As String
Dim i As Long
Dim doc As Document
Dim tbl As Table
Dim rng As Range

'wypełnij tablicę nazwami plików
EnumFilesInDir ThisDocument.Path, cFiles
'wyliczaj i "obrabiaj" pliki
For i = LBound(cFiles()) To UBound(cFiles())
    'odwołanie do otwieranego dokumentu
    Set doc = Documents.Open(cFiles(i))
    'odwołanie do tabeli w otwartym dokumencie
    Set tbl = doc.Tables(1)
    'odwołanie do obszaru tabeli
    Set rng = tbl.Range
    'kopiuj całą tabelę
    rng.Copy
    '===ten dokument, w którym wykonywany jest kod===
    With ThisDocument
        'zaznacz obszar dokumentu
        .Range.Select
        'zjedź na sam dół dokumentu
        Selection.MoveDown Unit:=wdParagraph
        'wklej ze schowka skopiowaną tabelę
        Selection.Paste
    End With
    'zamknij otwarty dokument bez zapisywania zmian
    doc.Close SaveChanges:=False
Next i

'zwolnij zmienne, pamięć
Set rng = Nothing
Set tbl = Nothing
Set doc = Nothing

End Sub


'procedura do wyliczania plików w określonej ścieżce
Sub EnumFilesInDir(sDir As String, ByRef colFiles() As String)
Dim fs As FileSearch
Dim i As Long, j As Long

'wyszukiwanie plików
Set fs = Application.FileSearch
With fs
    'gdzie szukać?
    .LookIn = sDir
    'jakich plików?
    .FileName = "*.doc"
    If .Execute(SortBy:=msoSortByFileName, _
    SortOrder:=msoSortOrderAscending) > 0 Then
        'wylicz pliki
        For i = 1 To .FoundFiles.Count
            'jeśłi ich nzawa jest odmienna od tego dokumentu
            If .FoundFiles(i) <> ThisDocument.FullName Then
                'powiększ tablicę przekazaną przez referencję
                'bez utraty jej dotychczasowej wartości
                ReDim Preserve colFiles(j)
                'dodaj nazwę znalezionego pliku
                colFiles(j) = .FoundFiles(i)
                j = j + 1
            End If
        Next i
    Else
        MsgBox "Nie znalazłem plików w podanej ścieżce."
    End If
End With

End Sub


Działający przykład znajdziesz tu - rar
tu - zip
tu - exe(sfx.rar)


_____________________________________________
POSTULATY STARUSZKA:
1) Ludzie, dbajcie o polszczyznę!!!
2) Ludzie, zadawajcie kompletne pytania, a nie rzucacie ochłapy i trzeba się domyślać o co chodzi!!!

Powodzenia
Maciej Łoś

03-12-2004 23:15
Pokaż profil losmac  Wyślij email do losmac   Odwiedź stronę losmac  
barylek




Typ: neutral
Postów: 19
Zarejestrowany: Dec 2004
re. przykład

Przykro mi ale podany przykład nie działa.
Kupiłem Pana książkę ale jeszcze się z nią nie zapoznałem, dzisiaj przyszła. Pozdrawiam...

04-12-2004 16:31
Pokaż profil barylek  Wyślij email do barylek   
losmac
"profesorek"




Typ: neutral
Postów: 758
Zarejestrowany: May 2003

Jak to nie działa?
Gdzie, w którym miejscu wyświetla Ci błąd?

U mnie "chodzi" bez zarzutu.


_____________________________________________
POSTULATY STARUSZKA:
1) Ludzie, dbajcie o polszczyznę!!!
2) Ludzie, zadawajcie kompletne pytania, a nie rzucacie ochłapy i trzeba się domyślać o co chodzi!!!

Powodzenia
Maciej Łoś

04-12-2004 17:29
Pokaż profil losmac  Wyślij email do losmac   Odwiedź stronę losmac  
barylek




Typ: neutral
Postów: 19
Zarejestrowany: Dec 2004

Bezpośrednio z Pana dokumentu niechce się w ogóle uruchomić, podając komunikat że makro w tym projekcie jest nie właściwe. Po utworzeniu tego makra w nowym dokumencie  kopiuje jakąś sieczkę. Otrzymuje komunikat "Żądany element kolekcji nie istnieje"
pokazuje błąd w lini:
Set tbl = doc.Tables(1)
Pozdrawiam...

[Post edytowany dnia 04-12-2004 19:03 przez barylek]

04-12-2004 18:57
Pokaż profil barylek  Wyślij email do barylek   
losmac
"profesorek"




Typ: neutral
Postów: 758
Zarejestrowany: May 2003

hmmm

Rozumiem, że ściągnąłeś przykład i rozpakowałeś go do dowolnego katalogu.
Znajdziesz tam 5 plików:
Dok1.doc
Dok2.doc
Dok3.doc
Dok4.doc
Zbij.doc

Dok1 do 4 zawierają po 1 tabeli - przykładowo wypełnioną.
Zbij.doc jest dokumentem, do którego tabele z wszystkich plików są łączone.
Uruchamiasz procedurę Start, która najpierw pobiera nazwy plików w bieżącym katalogu (katalogu, w którym jest zbij.doc) za pomocą procedury EnumFilesInDir(arg1, arg2), a następnie w pętli otwiera pliki, kopiuje tabelę z otwartego pliku i wkleja na koniec dokumentu zbij.doc.

Jakiego masz Windows'a i jakiego Office'a?
To, co dostałeś jest w Office'97.

Dotychczas nie spotkałem się z jakimiś problemami na innych wersjach Office'a i Windows'a.


_____________________________________________
POSTULATY STARUSZKA:
1) Ludzie, dbajcie o polszczyznę!!!
2) Ludzie, zadawajcie kompletne pytania, a nie rzucacie ochłapy i trzeba się domyślać o co chodzi!!!

Powodzenia
Maciej Łoś

04-12-2004 19:49
Pokaż profil losmac  Wyślij email do losmac   Odwiedź stronę losmac  
barylek




Typ: neutral
Postów: 19
Zarejestrowany: Dec 2004

Dokładnie tak zrobiłem ale bez efektu jak opisałem wcześniej. Posiadam Office 2000 Perfect w Windows 98.
Pozdrowienia...

[Post edytowany dnia 04-12-2004 20:25 przez barylek]

04-12-2004 20:20
Pokaż profil barylek  Wyślij email do barylek   
losmac
"profesorek"




Typ: neutral
Postów: 758
Zarejestrowany: May 2003

Zrób tak:

Skopiuj kod z posta wcześniej.
Wklej go do nowego modułu do nowego dokumentu.
Zapisz dokument pod dowolną nazwą.

Skopiuj Twoje pliki z tabelami do tego samego katalogu, co plik, który przed chwilą zapisałeś.

Otwórz plik z makrami.
Uruchom procedurę Start().
Powinno działać!

Myślę, że wystąpił problem podczas ściagania pliku, skoro pomogło dopiero skopiowanie kodu do nowego dokumentu. Zatem, moje pliki z tabelami także są uszkodzone... tak myślę...


_____________________________________________
POSTULATY STARUSZKA:
1) Ludzie, dbajcie o polszczyznę!!!
2) Ludzie, zadawajcie kompletne pytania, a nie rzucacie ochłapy i trzeba się domyślać o co chodzi!!!

Powodzenia
Maciej Łoś

04-12-2004 21:50
Pokaż profil losmac  Wyślij email do losmac   Odwiedź stronę losmac  
barylek




Typ: neutral
Postów: 19
Zarejestrowany: Dec 2004

Niestety efekt jest identyczny otrzymuje ten sam komunikat, że żadany element kolekcji nie istnieje a dodatkowo otwiera tymczasowy plik worda w którym kopiuje pare znaków i robi podział strony...
W każdym razie dziękuję bardzo za pomoc i serdecznie pozdrawiam...

04-12-2004 22:11
Pokaż profil barylek  Wyślij email do barylek   
losmac
"profesorek"




Typ: neutral
Postów: 758
Zarejestrowany: May 2003
...na zakończenie...

jak się okazało problem jest nie w tym, że makro jest źle napisane, a tkwi w czymś innym (prawdopodobnie instalacji Office'a). Ponadto, nie chodziło wyłącznie o kopiowanie tabel  z kilku dokumentów do jednego, a także o nagłówki tych tabel. Nagłówki tabel przechowywane są w polach formularza, a tekst poza sekcjami niechronionymi jest zablokowany.

Rozwiązanie problemu jest takie:

Option Explicit

Sub Start()
Dim cFiles() As String
Dim i As Long
Dim doc As Document, doc_all As Document
Dim tbl As Table
Dim rng As Range
Dim fld As FormField


'wypełnij tablicę nazwami plików
EnumFilesInDir ThisDocument.Path, cFiles
'dodaj nowy plik, do którego bedziesz
'wstawiał wszystkie połączone dane
Set doc_all = Documents.Add
doc_all.PageSetup.Orientation = wdOrientLandscape
'wyliczaj i "obrabiaj" pliki
For i = LBound(cFiles()) To UBound(cFiles())
    'odwołanie do otwieranego dokumentu
    Set doc = Documents.Open(cFiles(i))
    'odwołanie do tabeli w otwartym dokumencie
    Set tbl = doc.Tables(1)
    'odwołanie do obszaru tabeli
    Set rng = tbl.Range
    'kopiuj całą tabelę
    rng.Copy
    '===ten dokument, w którym wykonywany jest kod===
    With doc_all
        'zaznacz obszar dokumentu
        .Range.Select
        'zjedź na sam dół dokumentu
        Selection.MoveDown Unit:=wdParagraph
        'pobierz nazwę wydziału
        Set fld = doc.FormFields(1)
        'wstaw do tego dokumentu
        Selection.TypeText fld.Result
        'znowu zjedź na sam dół dokumentu
        Selection.MoveDown Unit:=wdParagraph
        'wklej ze schowka skopiowaną tabelę
        Selection.Paste
    End With
    'zamknij otwarty dokument bez zapisywania zmian
    doc.Close SaveChanges:=False
Next i

'uaktywnij
doc_all.Activate
If MsgBox("Czy chcesz zapisać plik zbiorczy?", _
    vbQuestion + vbYesNo + vbDefaultButton1, _
    "Pytanie" = vbYes Then doc_all.Save

'zwolnij zmienne, pamięć
Set fld = Nothing
Set rng = Nothing
Set tbl = Nothing
Set doc = Nothing
Set doc_all = Nothing

End Sub


'procedura do wyliczania plików w określonej ścieżce
Sub EnumFilesInDir(sDir As String, ByRef colFiles() As String)
Dim fs As FileSearch
Dim i As Long, j As Long

'wyszukiwanie plików
Set fs = Application.FileSearch
With fs
    'gdzie szukać?
    .LookIn = sDir
    'jakich plików?
    .FileName = "*.doc"
    If .Execute(SortBy:=msoSortByFileName, _
    SortOrder:=msoSortOrderAscending) > 0 Then
        'wylicz pliki
        For i = 1 To .FoundFiles.Count
            'jeśłi ich nzawa jest odmienna od tego dokumentu
            If .FoundFiles(i) <> ThisDocument.FullName Then
                'powiększ tablicę przekazaną przez referencję
                'bez utraty jej dotychczasowej wartości
                ReDim Preserve colFiles(j)
                'dodaj nazwę znalezionego pliku
                colFiles(j) = .FoundFiles(i)
                j = j + 1
            End If
        Next i
    Else
        MsgBox "Nie znalazłem plików w podanej ścieżce."
    End If
End With

End Sub



_____________________________________________
POSTULATY STARUSZKA:
1) Ludzie, dbajcie o polszczyznę!!!
2) Ludzie, zadawajcie kompletne pytania, a nie rzucacie ochłapy i trzeba się domyślać o co chodzi!!!

Powodzenia
Maciej Łoś

05-12-2004 12:49
Pokaż profil losmac  Wyślij email do losmac   Odwiedź stronę losmac  
barylek




Typ: neutral
Postów: 19
Zarejestrowany: Dec 2004

Wielkie bardzo wielkie dzięki. Działa idealnie

05-12-2004 21:42
Pokaż profil barylek  Wyślij email do barylek   
barylek




Typ: neutral
Postów: 19
Zarejestrowany: Dec 2004

Witam ponownie...
Sądziłem, że sprawa z niemożliwością uruchmienia tego makra jest zakończona, ale wynikła dość ciekawa sytuacja.
Faktycznie makro uruchomiło się bez problemu pod Officem XP z systemem windos XP. Myślałem, że jest to problem niewłaściwej instalacji offica 2000 u mnie ale ten sam problem wynikł na innych komputerach u znajomych. Co ciekawe makro nie dające się uruchomić z dysku bez problemu uruchamia się na wzystkich komputerach z dyskietki.
Sądziłem, że problem jest ze ścieżką ale
po wpisaniu MsgBox This Document.Path zawsze zwraca ścieżkę poprawną także zupełnie już nie wiem gdzie tkwi problem.

06-12-2004 16:13
Pokaż profil barylek  Wyślij email do barylek   
losmac
"profesorek"




Typ: neutral
Postów: 758
Zarejestrowany: May 2003
Interesujące....

Interesujące, bardzo interesujące...

Czy ktoś ma jakiś pomysł?

Czy moglibyście sprawdzić to u siebie na komputerach?

Nie potrafię dojść przyczyny błędu. Testowałem też na komputerze z Win2000 i Office'2000 szło bez zarzutu.


_____________________________________________
POSTULATY STARUSZKA:
1) Ludzie, dbajcie o polszczyznę!!!
2) Ludzie, zadawajcie kompletne pytania, a nie rzucacie ochłapy i trzeba się domyślać o co chodzi!!!

Powodzenia
Maciej Łoś

06-12-2004 21:33
Pokaż profil losmac  Wyślij email do losmac   Odwiedź stronę losmac  
karolinavb




Typ: neutral
Postów: 468
Zarejestrowany: Jan 2003

A mógłbyś mi przesłać Maćku "to samo" co Barylkowi, nie chce mi się "wklepywać"...


_____________________________________________
Karolina

06-12-2004 22:29
Pokaż profil karolinavb  Wyślij email do karolinavb   
anonim




Typ: Nie zarejestrowany

No niestety u mnie również nie chodzi! Sytuacja podobna do Barylka.

07-12-2004 10:18
  
karolinavb




Typ: neutral
Postów: 468
Zarejestrowany: Jan 2003

Być może problem polega na tym, że funckcja EnumFilesInDir zbiera wszystkie dokumenty doc z katalogu ThisDocument.Path (czyli tego, w którym znajduje się plik doc zawierający makro). W tablicy cFiles są i te w których jest jakaś tabela i te w których nie ma żadnej tabeli .

Podstawienie Set tbl = doc.Tables(1) zakłada, że w każdym dokumencie znajdującym się w tablicy jest tabela, gdy jej nie ma jest informacja o braku elementu w kolekcji.
Jeśli chodzi o importowanie wszystkich tabel, należałoby może skorzystać z pętli " For Each tbl In doc.Tables...", lub przynajmniej sprawdzić czy są tabele np.: doc.Tables.Count jest większe od 0 i ewnetualnie wybierać dopiero odpowiednio indeks tabeli,  albo nie korzystać z funkcji EnumFilesInDir tylko "ręcznie" wypełnić tablicę cFiles nazwami pożądanych plików posiadających wpomniana tabelę.
Być może przy uruchamianiu z dyskietki panowie mają tam tylko te pliki doc, które mają co najmniej 1-dną tabelę i dlatego nie ma błędu ?

Dalej nie weryfikowałam, ale to samo dotyczy doc.FormFields.... Myślę, że Maciek chciał podsunąć tylko myśl, a panowie to trochę muszą przerobić, uwgledniając wszystkie możliwości i potrzeby.

[Post edytowany dnia 07-12-2004 13:07 przez karolinavb]


_____________________________________________
Karolina

07-12-2004 12:54
Pokaż profil karolinavb  Wyślij email do karolinavb   
losmac
"profesorek"




Typ: neutral
Postów: 758
Zarejestrowany: May 2003

Pragnę powiedzieć, że każdy dokument zawiera co najmniej 1 tabelę i z założenia wszystkie pliki znajdują się w tym samym katalogu, co dokument z makrem.

W sprawie przykładowych dokumentów muszę się skontaktować z barylkiem, czy będzie chciał je udostępnić...

Z moich obserwacji wynika, że w niektórych dokumentach (po kopiowaniu z dokumentu wzorcowego) występują błędy, bo Word danej tabeli - dziwnym sposobem - nie widzi jako tabelę, a jako ... nie wiem co. Wyświetla prawidłowo, tylko nie można za pomocą polecenia
Set tbl = doc.Tables(1)
ustanowić zmiennej typu tabela.


_____________________________________________
POSTULATY STARUSZKA:
1) Ludzie, dbajcie o polszczyznę!!!
2) Ludzie, zadawajcie kompletne pytania, a nie rzucacie ochłapy i trzeba się domyślać o co chodzi!!!

Powodzenia
Maciej Łoś

07-12-2004 19:19
Pokaż profil losmac  Wyślij email do losmac   Odwiedź stronę losmac  
karolinavb




Typ: neutral
Postów: 468
Zarejestrowany: Jan 2003

Wobec tego czekam na Twoją decyzję Maćku bo jestem po Twoich wyjaśnieniach tym bardziej ciekawa.


_____________________________________________
Karolina

07-12-2004 20:17
Pokaż profil karolinavb  Wyślij email do karolinavb   
Wszystkich odpowiedzi: 34 :: Maxymalnie na stronę: 20
Strona: [  << <   1 2   > >>  ]  z  2