Excel Forum - Porady, Pomoc,  Excel Help, Excel FAQ Strona Główna
 FAQ  RegulaminRegulamin  Szukaj   Użytkownicy   Grupy   Rejestracja   Profil   Twoje wiadomości   Zaloguj 


Poprzedni temat «» Następny temat
ID tematu: 70138 Skopiuj do schowka Tworzenie pliku Word'a z danymi importowanymi z Excel'a
Autor Wiadomość
Leon M 
Fan Excela


Wersja: Win Office 2010
Posty: 98
Wysłany: 13-02-2021, 15:18   Tworzenie pliku Word'a z danymi importowanymi z Excel'a

Szanowni Forumowicze,

Zwracam się do Was z gorącą prośbą o pomoc w rozwiązaniu następującej kwestii:

Jest plik Exela o nazwie "Obecność w pracy - miesiąc_rok", który zawiera godziny pracy oraz inne dane wymagane do wystawienia rachunku za każdy miesiąc kalendarzowy. Plik Worda zawiera szablon rachunku, do którego byłyby importowane dane z pliku exelowskiego. Tak skompletowany rachunek byłby zapisywany w pliku o nazwie: "nazwisko i imię - Rachunek Nr miesiąc_rok", w folderze: "Rachunki miesiąc_rok".
Polecenie utworzenia lub drukowania takiego rachunku mogłoby wyglądać tak:
po naciśnięciu kontrolki "utwórz rachunek" lub "drukuj rachunek" wyświetla się komunikat: "podaj numer wybranego nazwiska" lub "kliknij na pole wybranego nazwiska".
W przypadku utworzenia rachunku z błędnymi danymi (np. omyłka w kwocie brutto) naciśnięcie kontrolki "usuń rachunek" usuwałoby plik z folderu oraz usuwałoby zabarwienie pola nazwiska.
Po utworzeniu rachunku tło pole wybranego nazwiska zabarwia się na jakiś kolor, jako informacja o utworzeniu pliku.

Przykładowe pliki obrazujące zagadnienie, zamieszczam w załączniku.

Osobiście mam raczej blade pojęcie, jak rzecz wykonać, dlatego serdecznie Was proszę o pomoc.

Z góry pięknie dziękuję za Wasze odpowiedzi.

Demo3.rar
Pobierz Plik ściągnięto 8 raz(y) 24.83 KB

ID posta: 400317 Skopiuj do schowka
 
 
Leon M 
Fan Excela


Wersja: Win Office 2010
Posty: 98
Wysłany: 17-02-2021, 08:02   

Zadanie jest dosyć złożone, stąd może na razie brak odpowiedzi.
Póki co, staram się sam coś wytworzyć. Próbuję zgłębić kwestię podmiany określonych słów w poszczególnych polach w szablonie przez kolejne wartości danego wiersza arkusza. Np. w szablonie "Wpisz nazwisko", "Wpisz imię", "Wpisz Pesel", itd. przez wartości odpowiednich komórek danego wiersza w tabeli arkusza.
Zamieszczam plik poglądowy.

Nie wiem, jak tę koncepcję przełożyć na kod VBA.

Każda inna koncepcja rozwiązania zadania bardzo mile widziana :-)

Ponawiam uprzejmą prośbę o pomoc.
Z góry pięknie dziękuję.

Rachunek.docx
Pobierz Plik ściągnięto 3 raz(y) 16.41 KB

ID posta: 400545 Skopiuj do schowka
 
 
Rafał B.
Exceloholic



Wersja: Win Office 2016
Pomógł: 34 razy
Posty: 235
Wysłany: 17-02-2021, 17:09   

Przygotuj szablon Word:
1. W dokumencie Word zaznaczaj kolejno miejsca, które mają być polami i wstawiaj "Formant zawartości" (albo "Tekst sformatowany", nie pamiętam w tym momencie- ale znajdziesz bez problemu na karcie dewelopera w Word) .
2. Od razu nadawaj im nazwy (właściwości formantu, tytuł), żeby się potem odwoływać do nich w kodzie VBA przez nazwę. Najlepiej włącz na karcie dewelopera w Word tryb projektowania, będziesz wówczas widział wszystkie nadane nazwy formantom

W Excelu:
1. Dodaj w skoroszycie arkusz np. "Formanty", w którym będziesz przechowywał wszystkie formanty, np: w kolumnie A:
[A1] imie_pracownika
[A2] nazwisko_pracownika
[A3] placa_brutto
itd.

Kolumnę B zostaw sobie na wartości, możesz wstawić formuły przeliczające dane danego pracownika.
Czyli kolumna A- same nazwy pól
Kolumna B- odpowiadające polom wartości.
Oczywiście te dane muszą się dynamicznie zmieniać np. na podstawie listy rozwijalnej na innym arkuszu, czyli wszędzie w kolumnie B formuły. Najlepiej po testach taki arkusz ukryć.

2. W excelowym kodzie najpierw opracuj otwieranie tego pliku szablonu (znajdziesz dużo przykładów tutaj na forum). Powiedzmy, ze uchwyt do pliku nazywa się wDoc.
3. Schemat wypełnienia formantu przy wczesnym wiązaniu (VBE->Tools->References->Word Object Library, czy coś podobnego):
Kod:
Dim CC As ContentControl   ' to jest nasz formant
Set CC = wDoc.SelectContentControlsByTitle("imie_pracownika")
  CC.text = "Jan Kowalski"

Zamiast "imie_pracownika" i "Jan Kowalski" odwołuj się oczywiście do swojego arkusza Formanty (odpowiednio A1, B1, A2, B2 i lecisz w dół po wszystkich polach w pętli).
4. Zapisuj dokument Word metodą .SaveAs.

Taka konstrukcja umożliwi Ci późniejsze modyfikowanie pól w szablonie Word bez konieczności grzebania w kodzie VBA- wystarczy, że dodasz formant w pliku Word i opowiadające mu pola na arkuszu formantów. Można używać SQL, ale takie rozwiązanie z formantami- ContentControl nie ma żadnych ograniczeń, jest bardzo stabilne i działa bezproblemowo u moich klientów od długiego czasu; jest odporne na "przenosiny", bo w przeciwieństwie do SQL plik Worda w ogóle nie wie o istnieniu skoroszytu Excel.

Reasumując:
-na arkuszu głównym wybierasz pracownika, miesiąc czy co tam jeszcze.
-automatycznie aktualizują się formuły dotyczące pracownika na arkuszu Formanty
-po ręcznym wyzwoleniu makra otwiera się plik i pętlą uzupełnia wszystkie formanty zawartości o nazwie pobieranej z arkusza Formantów (kolumna A) tekstem pobieranym z kolumny B
-po zakończeniu pętli makro zapisuje plik pod określoną ścieżką.
_________________
Jest niemal niemożliwe nauczenie dobrego programowania uczniów, którzy byli narażeni na kontakt z BASIC: jako potencjalni programiści są okaleczeni, bez nadziei na poprawę. (Edsger Dijkstra, pionier informatyki).
Po części dotyczy również VBA.
  
ID posta: 400559 Skopiuj do schowka
 
 
Leon M 
Fan Excela


Wersja: Win Office 2010
Posty: 98
Wysłany: 17-02-2021, 19:03   

Rafale, pięknie dziękuję za tak obszerny i szczegółowy instruktarz, lecz na chwilę obecną, zważywszy na moją skąpą wiedzę i umiejętności w Excelu i VBA , raczej nie będę w stanie z Twoich wskazówek uczynić właściwego użytku :-( Ale mimo wszystko będę próbował.
ID posta: 400562 Skopiuj do schowka
 
 
Rafał B.
Exceloholic



Wersja: Win Office 2016
Pomógł: 34 razy
Posty: 235
Wysłany: 17-02-2021, 19:38   

Rób krok po kroku, a jak na czymś utkniesz, to napisz konkretnie na czym i wrzuć progres prac, by widać było Twój wysiłek. Pierwsze kilka kroków bez problemu zrealizujesz, a w reszcie pomogę ja czy ktoś inny. Jeśli się jednak nie uda zrealizować nawet tych pierwszych prostszych etapów, to wybrałeś sobie za ciężkie zadanie na początek i nawet jak dostaniesz gotowca, nie będziesz w stanie go utrzymać przy najmniejszej modyfikacji (brak zrozumienia działania).
_________________
Jest niemal niemożliwe nauczenie dobrego programowania uczniów, którzy byli narażeni na kontakt z BASIC: jako potencjalni programiści są okaleczeni, bez nadziei na poprawę. (Edsger Dijkstra, pionier informatyki).
Po części dotyczy również VBA.
  
ID posta: 400564 Skopiuj do schowka
 
 
Leon M 
Fan Excela


Wersja: Win Office 2010
Posty: 98
Wysłany: 19-02-2021, 13:19   

Adaptując różne materiały znalezione w sieci, stworzyłem rozwiązanie zadania, które prezentuję w załączniku.
Nie jest to makro wedle sposobu przedstawionego przez Rafała. Na razie tego sposobu jeszcze nie ogarnąłem.

Makro, które przedstawiam, tworzy rachunki dla wszystkich pozycji na liście, a chciałbym jeszcze wprowadzić rozwiązanie, które polegałoby na możliwości zaznaczania pozycji, dla których ma być utworzony rachunek (np. zaznaczanie pozycji tzw. "ptaszkami")

Nie wiem, jak tę rzecz skomponować, dlatego po raz kolejny proszę uprzejmie Szanownych Forumowiczów o pomoc w tej kwestii.

Z góry pięknie dziękuję za odpowiedzi.

Utwórz Rachunki.rar
Pobierz Plik ściągnięto 4 raz(y) 110.07 KB

ID posta: 400678 Skopiuj do schowka
 
 
apollo
ExcelSpec


Pomógł: 1306 razy
Posty: 4517
Wysłany: 20-02-2021, 01:26   

Leon M napisał/a:

Nie wiem, jak tę rzecz skomponować, dlatego po raz kolejny proszę uprzejmie Szanownych Forumowiczów o pomoc w tej kwestii.

A. Niech będzie podany kod, tylko trochę poprawimy.

1. Przed linią z For w = 4 To ost_w dodaj taki kod

Kod:

w = Application.InputBox("Podaj numer wiersza na arkuszu", Type:=1)
If w < 4 Or w > ost_w Then Exit Sub


2. Usuń linie For w = 4 To ost_w i Next w
------------
B. Mój kod
1. W Tools wywal referencję Microsoft Word xxx Object Library
2. Żeby skrócić kod używam zakresu komórek AQ4:BB5. W AQ5:AT5 są formuły, w pozostałych są oznaczenia. Np. AX5 = AJ znaczy, że pole $Kwota zostanie zastąpione przez komórkę z wybranego wiersza z kolumny AJ.
3. Mój kod jest w Module1. Stary kod pozostaje jako komentarze.

Lista Obecności.xlsm
Pobierz Plik ściągnięto 7 raz(y) 38.63 KB

ID posta: 400727 Skopiuj do schowka
 
 
Leon M 
Fan Excela


Wersja: Win Office 2010
Posty: 98
Wysłany: 20-02-2021, 14:17   

Apollo, pięknie dziękuję z Twoje makro. Bardzo interesujące rozwiązanie.
Spróbuję je zaadaptować do wersji tworzenia wszystkich rachunków z listy.

Co do opcji z wyborem pozycji do utworzenia rachunku nie chodziło mi o wykorzystanie InputBox i podanie numeru wiersza, lecz o stworzenie możliwości wyboru jednej lub wielu pozycji przez ich zaznaczenie przez kliknięcie w odpowiednie pole danego wiersza. (Coś na podobieństwo np. zaznaczania w smartfonie zdjęć w galerii do przeniesienia lub usunięcia).

Nie wiem, czy takie rozwiązanie jest w ogóle możliwe do stworzenia w VBA.

Bardzo proszę o odpowiedzi, za wszystkie z góry pięknie dziękuję.
ID posta: 400739 Skopiuj do schowka
 
 
apollo
ExcelSpec


Pomógł: 1306 razy
Posty: 4517
Wysłany: 21-02-2021, 11:54   

Kiedy się pojawi okno InputBox wybierz komórki z nazwiskami. Np. jeśli chcesz tworzyć dokumenty dla Radomskowskiego, Kownackiego, Boguckiego to wybierz B4, B6 i B8.

Kod:

Sub UtwórzRachunek()
Const wdReplaceAll = 2
Const wdFormatXMLDocument = 12

Dim c As Long, ost_w As Long, w As Long, dane(), rng As Range, cell_ As Range
Dim wordApp As Object, wordDoc As Object, wordSelection As Object
    With ThisWorkbook.Worksheets("Grupa1")
        ost_w = .Cells(Rows.Count, "B").End(xlUp).Row
        On Error Resume Next
        Set rng = Application.InputBox("Wybierz komórki z nazwiskami, np. B4; B6; B8, i naciśnij OK", Type:=8)
        Err.Clear
        If rng Is Nothing Then Exit Sub
        dane = .Range("AQ4:BB6").Value
        For c = 5 To 11
            dane(3, c) = dane(2, c) ' nazwy kolumn przepisać do wiersza 3
        Next c
    End With

    Set wordApp = CreateObject("Word.Application")
    wordApp.Visible = False
   
    For Each cell_ In rng
        w = cell_.Row
        If w >= 4 And w <= ost_w Then
            Set wordDoc = wordApp.Documents.Open(ThisWorkbook.Path & "\SzablonRachunku.docx")
            Set wordSelection = wordApp.Selection
           
            For c = 5 To 11
                dane(2, c) = ThisWorkbook.Worksheets("Grupa1").Cells(w, dane(3, c)).Value
            Next c
            dane(2, 12) = slownie(CDbl(dane(2, 8)))   ' kwota slownie
             For c = 1 To 12
                 With wordSelection.Find
                     .Text = dane(1, c)
                     .Forward = True
                     .MatchWholeWord = True
                     .Replacement.Text = dane(2, c)
                     .Execute Replace:=wdReplaceAll
                 End With
             Next c
           
             wordDoc.SaveAs ThisWorkbook.Path & "\Rachunki bieżące\" & dane(2, 5) & " " & dane(2, 6) & " - " & "Rachunek Nr  " & dane(2, 1) & ".docx", FileFormat:=wdFormatXMLDocument
             wordDoc.Close (False)
         End If
    Next cell_
   
    wordApp.Quit
   
    Set wordSelection = Nothing
    Set wordDoc = Nothing
    Set wordApp = Nothing
   
    MsgBox "Koniec"
End Sub
ID posta: 400793 Skopiuj do schowka
 
 
Leon M 
Fan Excela


Wersja: Win Office 2010
Posty: 98
Wysłany: 22-02-2021, 12:44   

Apollo, pięknie dziękuję za przedstawioną metodę wprowadzania wybranych pozycji do utworzenia rachunku. Będzie bardzo przydatna. :-)

Pozdrawiam.
ID posta: 400832 Skopiuj do schowka
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Theme xandgreen created by spleen& Programosy modified v0.3 by warna
Opieka techniczna www.marketingNET.pl

Archiwum

Strona używa plików cookies.

Kliknij tutaj, żeby dowiedzieć się jaki jest cel używania cookies oraz jak zmienić ustawienia cookie w przeglądarce.
Korzystając ze strony użytkownik wyraża zgodę na używanie plików cookies, zgodnie z bieżącymi ustawieniami przeglądarki.
Sprawdź, w jaki sposób przetwarzamy dane osobowe