Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

VBA WORD - Makro zapisujące plik pdf o nazwie tekstu i daty z tabeli

Martini82 14 Sty 2015 15:01 2496 8
  • #1 14 Sty 2015 15:01
    Martini82
    Poziom 8  

    Cześć,

    próbuje skonstruować makro, które zapisuje z szablonu MS Word plik o rozszerzeniu *.pdf, gdzie nazwa pliku pobierana jest z trzech miejsc tabeli (tabela w załączeniu).
    Struktura pliku wynikowego miałaby wyglądać tak:
    "ZZZ NR_XXX YYYY-MM-DD.pdf"

    na razie udało mi się wygrzebać i wydziubać coś co zapisuje do pdf ale
    tylko nazwę pliku worda, z którego tworzę pdf.
    Taki kod:

    Kod: vb
    Zaloguj się, aby zobaczyć kod



    Lub prostsze makro co tworzy mi pdfa o nazwie, którą zdefiniuje:

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Proszę o podpowiedź, jak VB ma do nazwy pliku wstawić dane z tabeli?

    Pozdrawiam

    0 8
  • Pomocny post
    #2 14 Sty 2015 20:01
    adamas_nt
    Moderator Programowanie

    Odwołujesz się podobnie jak w Excelu, musisz znać jedynie indeks tabeli i wyciąć 2 znaki specjalne komórki. Np

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    1
  • #3 14 Sty 2015 23:49
    Martini82
    Poziom 8  

    Adamus

    to brzmi obiecująco :D
    W takim razie jeszcze:
    1. czy trzeba zaznaczyć, że wartości będą pobierane z aktywnego dokumentu?Active.Document.Tables(1)
    2. Czy należy dodatkowo opisywać Tables i Cell zmiennymi?
    3. jak skorzystać z edycji tekstu left(x, len(x) -2) dla pierwszego wiersza mojej tabeli, skoro ma tylko jedną kolumnę?

    Rozumiem, że Left zwraca wskazaną liczbę znaków od lewej strony,
    liczbę wskazujesz zagnieżdżają Len, który daje dowolną ilość znaków, czyli, że zostaną wzięte wszystkie minus dwa ostatnie.
    Ale dlaczego w Twojej propozycji:

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    zadajesz by został zwrócony ciąg znaków od lewej z kolumny 2 dla wiersza 1 i 2
    "Cell (1,2) oraz Cell(2,2)" ?

    Moja oryginalna tabela jest znacznie większa, ale po zrozumieniu zasady na tym trójwierszowym przykładzie, nie powinno być problemu.
    Proszę o podpowiedź.

    0
  • Pomocny post
    #4 15 Sty 2015 09:11
    adamas_nt
    Moderator Programowanie

    Ad.1 Jeśli makro jest w 'Thisdocument;, to nie. Jeśli gdziekolwiek indziej (moduł, normal, inny plik), to musi być nazwa lub indeks: 'Documents("nazwa").Tables(1)'

    Ad.2 To zależy. Jeśli tabelka ma zmienną ilość wierszy, a odwołujesz się do Np ostatniej, to:

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Ad.3 Zrobiłem test, jakie znaki wstawiane są w komórce tabeli. Można spróbować "czyścić" cały ciąg przez Replace. Mi wyszło Chr(13) i Chr(7) - załącznik, gdzie Enter (13) możemy pominąć.

    1
  • #5 15 Sty 2015 10:15
    Martini82
    Poziom 8  

    Dalej nic,

    tabela docelowa jest "sztywna" to szablon.
    Załóżmy, że na razie chcę tylko pdf'a z nazwy z pierwszego wiersza mojej tabeli z załącznika, czyli plik o nazwie NR_XXX.pdf

    poniższy kod po wprowadzeniu 'ActiveDocument' zrwaca błąd:
    Run-time error '-2147467259 (80004005)' i podświetla na żółto cały akapit dotyczący konwersji na pdf od frazy ActiveDocument

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    dlatego pytałem czy definiować komórki i tabelę jako zmienne.
    bez 'ActiveDocument' przy 'Tables' daje komunikat błędu kompilacji
    'Sub or function not defined'

    Trochę mi wstyd, bo to naprawdę wydawało się łatwe,
    już myślałem, czy nie skopiować zawartości komórek do wiersza i stamtąd pobrać do nazwy pliku, ale uznałem, że to trochę naokoło.
    W necie jest kilka przykładów ale wszystkie odwołują się do korespondencji seryjnej albo robią tylko SaveAs.

    Jak to ruszyć dalej?

    0
  • #7 15 Sty 2015 13:18
    Martini82
    Poziom 8  

    U mnie nie działa :cry:
    cały czas wyrzuca ten run-time error (może mam coś nie włączone w ustawieniach MS Office),
    ale z drugiej strony jak puszczam to makro w wersji gdzie wskazuje dokładnie jak ma się nazywać plik, to wszystko chodzi? Dziwne.
    Na pewno ten obiekt 'ActiveDocument' jest w porządku w kodzie?

    Mam jeszcze pytanie, zostańmy przy tej wersji z pierwszym (jednokomórkowym) wierszem tabeli, czy jeśli chciałbym "pobrać" z ciągu Nr_XXX do nazwy pliku tylko XXX, to czy wystarczy sama funkcja Left ze wskazaniem, od którego znaku w ciągu ma odczytywać oraz czy wówczas (a myślę, że tak) zostawić usuwanie tych dodatkowych znaków (-2) jak znak przerwy Chr(13)?

    Dodano po 2 [godziny] 12 [minuty]:

    Adamas,

    wielkie dzięki za pomoc, po kilkunastu próbach podziałało,
    zarówno w przykładzie jak i w większej tabeli.

    Problem leżał po stronie sieciowego odwołania do folderu, w którym powstaje plik,
    oraz przypisania makra do konkretnego pliku *.docx czy *.docm

    Dla zainteresowanych, wycięcie samych znaków XXX z Nr_XXX,
    można zrobić na dwa sposoby:
    1. funkcją Mid - wycinającą we wskazanej pozycji od lewej, zadeklarowaną długość ciągu znaków,
    2. zagnieżdżonymi funkcjami Left(Right)

    Jeśli chodzi o znaki podziału wiersza w tabeli itp., które usuwa się w funkcji Len poprzez -1 lub -2, przy wycinaniu ze środka ciągu znaków problem odpada

    0
  • #8 15 Sty 2015 14:41
    adamas_nt
    Moderator Programowanie

    Ad.2 Warto dodać, że w przypadku zmiennego położenia znaku "_", można je określić funkcją 'InStr'. Ale to już tak na marginesie...

    1
  • #9 18 Lut 2015 13:03
    Martini82
    Poziom 8  

    Adamas_nt z opóźnieniem ale dzięki wielkie,

    fajnie wszystko działa.

    Powodzenia wszystkim.

    Temat zamykam.

    0