Elektroda.pl
Elektroda.pl
X

Search our partners

Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Excel VBA - Eksport do pliku TXT + autoamtyczne otwarcie pliku po eksporcie.

dlugi71 24 Aug 2015 14:04 4917 35
  • #1
    dlugi71
    Level 7  
    Witam wszystkich, zarejestrowałem się tylko dlatego, ponieważ wiem, że tutaj znajdę odpowiedź na nurtujące mnie zagadnienie. Do wszystkiego zazwyczaj dochodzę metodą prób i błędów - jednak tutaj ręce mi już opadają.
    Dodatkowo chciałbym poinformować, że jeszcze raczkuję w VBA dlatego też prosiłbym o zrozumienie bez niepotrzebnych emocji :)

    Jakiś czas temu (na życzenie pracodawcy) zrobiłem makrę, która po naciśnięciu przypisanego "guzika" z automatu generuje mi INSERT INTO do SQL.
    Wszystko działa bez zarzutu.
    Jedyny problem to, że aby wygenerowane dane zobaczyć muszę otworzyć, załóżmy notatnik i za pomocą skrótu ctrl+V je wkleić.

    Chciałbym aby po naciśnięciu tego "guzika", po wygenerowaniu danych automatycznie zapisały się do pliku txt i dodatkowo aby ten plik otworzył się automatycznie..
    Poniżej zamieszczam "końcówkę" kodu, który mam aktualnie:



    Code: vbnet
    Log in, to see the code



    Ktoś coś poradzi? :) Jak ktoś z Wrocławia to postawię piwo w podzięce :)
  • #2
    PRL
    Level 40  
    Czy możesz powiedzieć, co Twoje makro ma robić?
    NA pewno nie można obyć się bez schowka i notatnika?
  • #3
    dlugi71
    Level 7  
    Makro samo w sobie już działa.
    W jednym arkuszu mam tabelkę:

    Excel VBA - Eksport do pliku TXT + autoamtyczne otwarcie pliku po eksporcie.

    która pobiera informacje z Arkusza "Data".
    Po wciśnięciu Generuj kod otrzymuje dane, które chciałem ale one są przechowywane jakby w pamięci i widzę je dopiero jak wkleję przykładowo do notatnika.

    Finalnie chciałbym aby nie przechowywało danych w pamięci tylko generowało gdzieś plik na jakimś tam dysku, wklejało tam te dane a następnie plik automatycznie się otwierał :):)

    Jest to w ogóle do zrobienia?
  • #4
    dlugi71
    Level 7  
    Nikt nie ma pomysłu? :(
  • #5
    clubs
    Level 37  
    dlugi71 wrote:
    Nikt nie ma pomysłu? :(


    Witam

    Używasz funkcji jak sama nazwa wskazuje "kopiuj do schowka"
    powinieneś mieć coś w stylu zapisz jako txt lub export do txt ale możesz i tak

    Code: vbnet
    Log in, to see the code
  • #6
    dlugi71
    Level 7  
    Kurcze nie działa :(
    Mógłbyś mi podpowiedzieć jaką inną funkcję użyć zamiast CopyTextToClipboard?
  • #7
    PRL
    Level 40  
    Problemem jest to, że nie widać całego makra (tego przed CopyText...).
    Pokaż całe makro.
  • #8
    dlugi71
    Level 7  
    Ok.

    Code: vbnet
    Log in, to see the code
  • #9
    PRL
    Level 40  
    Jak widać, chcesz sklejać konstrukcję 'INSERT'.
    Proponuję coś w tym stylu:

    Code: vbscript
    Log in, to see the code


    P.S. Nie wiadomo, jak wygląda sklejony SQL, ale widać, że dodajesz podział linii, więc sobie poradzisz.
    P.S2. Skąd takie nazewnictwo zmiennych?
  • #10
    dlugi71
    Level 7  
    No właśnie sęk w tym, że VBA to dla mnie nowość :)
    Excela znam niemalże perfect ale z VBA nie miałem nigdy do czynienia.
    Sam kod skleiłem (intuicyjnie) jakiś czas temu z różnych innych kodów dostępnych na forach, google, etc. - metodą prób i błędów tyle, że wtedy miałem na to czas a teraz nie mam go wcale :(

    No nic będę próbował dalej.
  • #11
    PRL
    Level 40  
    Jak zapodasz plik, to nie będziesz musiał 'kombinować'.:)
  • #12
    dlugi71
    Level 7  
    W jakim sensie zapodam? :)
  • #15
    PRL
    Level 40  
    Prześlij na forum, a nie gdzieś w kosmos.
  • Helpful post
    #16
    hery
    Level 17  
    tak najprościej to dopisz na końcu modułu Generate SQL to:

    Cells(16, 2).Value = szSql

    Wstawi ci tego stringa w komórce.

    Ewentualnie:

    Workbooks.Add
    ActiveSheet.Paste

    wrzuci do nowego sheeta.

    Albo jedno albo drugie wklejasz zaraz po:

    MsgBox ("Dane zostały wygnerowane: " & iColumnCount & " kolumn i " & iRowCount & " wierszy." & vbNewLine & vbNewLine & _
    "Teraz za pomocą skrótu - CTRL + V - wklejamy do SQL! :)")
  • Helpful post
    #17
    marek003
    Level 40  
    Zrób tak jak radzi kolega PRL dodaj do postu (do kolejnej wypowiedzi) jako załącznik twój plik (skorzystaj z przycisku odpowiedz wtedy będziesz miał taką opcję, a nie z okienka tekstowego pod konwersacją i przycisku "odpowiedź (+2pkt)") - będzie łatwiej pomóc.

    Można spróbować np tak:
    Nie wchodząc w zasady tworzenia twojej zmiennej "szSql"
    Zamiast ją wklejać do pamięci, można od razu ją wrzucić w plik TXT korzystając z metody przedstawionej przez kolegę PRL

    czyli zamiast twojej linii kodu:
    Code:
    CopyTextToClipboard (szSql) 


    wpisz:
    Code: vbscript
    Log in, to see the code


    W pliku SQL.txt w katalogu głównym (C: ) powinien pojawić się wtedy plik sql.txt z zawartością.

    Zaznaczam że nie wchodzę w tworzenie zawartości SQL (To już wogóle dla mnie czarna magia) - ale warto wypróbować "całą" metodę kolegi PRL - Jeżeli nie jako procedurę to jako "wstawka" w kod główny.

    Na marginesie do znawców, bo też jestem laik w VBA:
    Co oznacza #1 lub #2 (przy tworzeniu pliku CSV w przykładach w necie był #2) ?
  • #18
    dlugi71
    Level 7  
    Panowie! Super! Dzięki za pomoc! :)

    Ten:
    Code:
    Workbooks.Add
    
    ActiveSheet.Paste


    jak i ten kod:
    Code:
    Open "C:\SQL.txt" For Output As #1
    
    Write #1, szSql  ' lub Print #1, szSql
    Close #1


    spełniają moje oczekiwania :)

    Dodatkowo jeśli mógłby dopytać :)
    Jeśli chodzi o ten kod:
    Code:
    Workbooks.Add
    
    ActiveSheet.Paste


    Czy istnieje możliwość aby dane nie otwierały się w pliku excelowym tylko w notatniku?
  • #19
    PRL
    Level 40  
    Najpierw zapisujesz do pliku "C:\TwojInsert.sql", a potem:

    Code: vbnet
    Log in, to see the code
  • #20
    dlugi71
    Level 7  
    Plik się tworzy i niby wszystko ok ale jest pusty.. :/

    PRL wrote:
    Najpierw zapisujesz do pliku "C:\TwojInsert.sql", a potem:

    Code: vbnet
    Log in, to see the code
  • #21
    PRL
    Level 40  
    Wykonaj na końcu procedury:

    Code: vbnet
    Log in, to see the code
  • #22
    dlugi71
    Level 7  
    PRL wrote:
    Wykonaj na końcu procedury:
    Code: vbnet
    Log in, to see the code


    Dalej tak samo.

    Code: vbnet
    Log in, to see the code
  • #23
    PRL
    Level 40  
    Quote:
    Dalej tak samo.


    Nie tak samo, bo wyświetlił się komunikat.
    Pusty, czy coś pokazał?
  • #24
    dlugi71
    Level 7  
    Dalej tak samo w sensie, że plik się tworzy ale jest pusty.
  • #25
    PRL
    Level 40  
    Quote:
    PRL napisał:
    Wykonaj na końcu procedury:

    Kod: vbnet [rozwiń] [zaznacz wszystko]
    MsgBox szSql


    Nie wykonałeś tego.
  • #26
    dlugi71
    Level 7  
    Przecież dodałem na końcu procedury o której mówisz..

    Code: vbnet
    Log in, to see the code
  • #27
    PRL
    Level 40  
    Nie dogadamy się.

    Pisanie programów nie polega na wklejaniu gdzie popadnie, co popadnie.
  • #28
    dlugi71
    Level 7  
    To jaki jest sens Twoich wypowiedzi..? Zadałem proste pytanie, określiłem się z moją wiedzą jeśli chodzi o pisanie tych kodów i liczyłem na bezpośrednie odpowiedzi, jeśli uważasz, że nie da mi się pomóc - odpuść temat i przejdź do kolejnego.
  • #29
    PRL
    Level 40  
    Ja też prosiłem o umieszczenie MsgBox szSql.
    W taki sposób nie wiemy, dlaczego plik jest pusty.

    Quote:
    jeśli uważasz, że nie da mi się pomóc - odpuść temat i przejdź do kolejnego


    Prosiłem, żebyś podesłał na forum plik?
    Jak mamy Ci pomóc, jak nie dajesz ku temu możliwości?

    Skoro nie czujesz się dobrze w VBA i oczekujesz gotowca, to podaj plik wejściowy i jakie są oczekiwania.

    P.S. Jakbyś nie zauważył, to lubię i często pomagam kolegom z Elektrody.
  • #30
    dlugi71
    Level 7  
    Przecież załączyłem link z plikiem - nie wiem z czym jest problem..