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

VBA excel makro - Przesłanie tekstu do notatnika poprzez SendKeys

09 Kwi 2017 23:42 1473 10
  • Poziom 29  
    Opis:
    ------
    1. W trakcie swojego działania pewne makro przypisuje do danej zmiennej tekstowej bardzo długi tekst pochodzący ze zmiennej tablicowej. Tekst ten zostaje następnie przepisany do notatnika i wyświetlony na ekranie. Ze względu na ograniczenia nałożone przez admina nie jest możliwe zapisanie tego tekstu do pliku tekstowego/sekwencyjnego na dysku. "Plik" z owym tekstem może istnieć tylko tymczasowo, "w powietrzu", bez zapisywania go
    2. Do przesłania tekstu do notatnika została użyta funkcja SendKeys

    Przykładowe dane zawarte są w pliku "SendKeys - Arkusz1.txt":
    -----------------------------------------------------------------------
    1. Dane do wkopiowania w arkusz excela - każdy wiersz symuluje porcję danych ze zmiennej tablicowej
    2. Dane te przy pomocy prostej pętli For/Next wpisywane są wiersz po wierszu do zmiennej tekstowej, np: 'bufor':
    ...
    For w = 1 To 86
    bufor = bufor & Cells(w, 1).Value & vbCr
    Next w
    ...
    3. Zmienna 'bufor' funkcją SendKeys przesyłana jest do notatnika:
    ...
    apli = Shell("Notepad.exe", 1)
    AppActivate apli
    SendKeys bufor, True
    ...

    Problem:
    ----------
    1. Przy długich "tekstach" rzędu 3 tys. - 4 tys. znaków, po około 2 tys.-2,8 tys. znaków następuje "wysypanie/zacięcie" się przesyłu znaków do notatnika. Wygląda to tak, jakby notatnik został zapchany przesyłanym tekstem i zakorkował się niczym butelka napełniana zbyt dużym strumieniem wody.
    2. Pobocznym efektem działania SendKeys stało się wyłączanie klawiatury numerycznej - tutaj jednak nie ma "problemu", wystarczy bowiem - SendKeys "{NUMLOCK}" - i sprawa załatwiona.

    PYTANIE:
    -----------
    Czy jest możliwe jakieś rozwiązanie, które w połączeniu z SendKeys prześle tekst do owego notatnika "za jednym zamachem" ?
    Tu nadmieniam, że chodzi mi o takie bez dzielenia zmiennej 'bufor' na dwie części i w połączeniu z 'Application.Wait' przesyłanie ich do notatnika - wygląda to bowiem ... jakoś tak mało elegancko ...
  • Pomocny post
    Specjalista - VBA, Excel
    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Dodano po 50 [sekundy]:

    P.S. Reference to Microsoft Forms 2.0
    VBA excel makro - Przesłanie tekstu do notatnika poprzez SendKeys
  • Poziom 29  
    JRV napisał:
    ...
    Dim bf As New DataObject 'schowek
    ...
    bf.SetText bufor
    bf.PutInClipboard ' do schowka
    ...
    SendKeys "^V", True 'wklej
    ...
    Reference to Microsoft Forms 2.0
    :D
    Nawet nie byłem bliski pomyślenia o tym ... znaczy się ... nie myślałem ... :|
    :D

    Dzięki za podpowiedź ... ale niestety przyda się do innych celów ... chodzi o to że, jeśli kopiujemy (korzystając ze schowka systemowego) tekst sformatowany, tak jak w moim przypadku (uporządkowana kolumna danych poprzez 'vbCr'), do programu nieobsługującego formatowania, czyli do notatnika, to kopiowany tekst zostaje rozformatowany, nawet w przypadku znaku końca linii. Zrzutki na obrazkach:

    1. Widok po kopiowaniu ze schowka systemowego - według Twojej procedury
    VBA excel makro - Przesłanie tekstu do notatnika poprzez SendKeysSendKeys_..01.jpg Download (92.32 kB)

    2. Widok pożądany
    VBA excel makro - Przesłanie tekstu do notatnika poprzez SendKeysSendKeys_..02.jpg Download (58.33 kB)

    Dodatkowo po kopiowaniu ze schowka powinno się go wyczyścić - dla bezpieczeństwa.
    Tutaj chyba jednak nie wystarczyłoby zwykłe 'bf.Clear' (?), potrzebna by była chyba dodatkowa cała procedura (?), korzystająca pewnie z API (?)

    Pozdrawiam
  • Pomocny post
    Specjalista - VBA, Excel
    lanzul napisał:
    tekst zostaje rozformatowany

    Zamiast & vbCr (jak w Ciebie)
    Treba & vbCrLf

    lanzul napisał:
    potrzebna by była chyba dodatkowa cała procedura

    Tak :)
    bf.SetText ""
    bf.PutInClipboard ' do schowka
  • Poziom 29  
    JRV napisał:
    Zamiast & vbCr (jak w Ciebie)
    Treba & vbCrLf
    [...]
    Tak :)
    bf.SetText ""
    bf.PutInClipboard ' do schowka

    Ad 1) A treba ... treba :D ... z vbCrLf działa, jak należy ... ale ... wpisanie, na koniec makra, linijek z przypisaniem pustego tekstu do zmiennej 'bf' i przesłanie do schowka ...
    Kod: vbscript
    Zaloguj się, aby zobaczyć kod

    ... powoduje jedynie otwarcie pustego notatnika, następnie jak dłużej takie makro "pomęczyć", to potrafi wyskoczyć komunikat jak poniżej.
    VBA excel makro - Przesłanie tekstu do notatnika poprzez SendKeysSendKeys_D...t_0001.jpg Download (12.27 kB)

    Tak więc w schowku pozostają dla wścibskich 'nasze tajności' ... :D

    Ad 2) I pytanie jeszcze odnośnie deklaracji 'DataObject'

    Kolega forumowicz JRV użył deklaracji - 'Dim bf As New DataObject' - natomiast zauważyłem, po przejrzeniu 'prasy anglo-saskiej', że często używa się deklaracji - 'Dim bf As MSForms.DataObject', z przypisaniem następnie 'Set bf = New MSForms.DataObject', (oczywiście zmienna inna, niż ta 'nasza').
    Czy kolega JRV orientuje się może w różnicach pomiędzy tymi deklaracjami ?
    Czy może jest to jedno i to samo ?
  • Pomocny post
    Specjalista - VBA, Excel
    lanzul napisał:
    wpisanie, na koniec makra, linijek z przypisaniem pustego tekstu

    Wstaw przed (bf.SetText "") w celu nieco opóźnić makro, aby mieć czas dla ^V (wklej)
    tt=Timer
    While timer - tt < 0.5: Doevents: Wend

    Dodano po 14 [minuty]:

    lanzul napisał:
    bf As MSForms.DataObject'
    właściwe podejście powinno być tak.
    Z innej strony DataObject jest tylko w włączonej referencji do Microsoft Forms 2.0
  • Moderator Programowanie
    lanzul napisał:
    Ze względu na ograniczenia nałożone przez admina nie jest możliwe zapisanie tego tekstu do pliku tekstowego/sekwencyjnego na dysku.
    Jakoś nie jestem przekonany.
    1. Każdy Windows zapisuje/usuwa pliki tymczasowe. Ściągnij (otwierając, nie zapisując) dowolny załącznik i się przekonaj.
    2. Zalogowany User zwykle ma jakąś przestrzeń do tego celu (plik nad którym pracujesz trzeba też w końcu zapisać).
    W obu przypadkach można to sprawdzić (przypisać ścieżkę do zmiennej) za pomocą Environ...

    Po drugie: jaki cel ma wklejanie tekstu do notatnika, skoro efektu zachować (jak twierdzisz) nie można? Wydrukować da się przecież wygodnie z Excel'a.
  • Poziom 29  
    adamas_nt napisał:
    lanzul napisał:
    Ze względu na ograniczenia nałożone przez admina nie jest możliwe zapisanie tego tekstu do pliku tekstowego/sekwencyjnego na dysku.

    Jakoś nie jestem przekonany.
    1. Admin ma zawsze rację
    2. Kiedy nie ma - patrz pkt 1.
    :D
    Nie dyskutowałem, jeszcze mi pasmo 'wyjściowe na miasto' ograniczy ... :D

    adamas_nt napisał:
    Po drugie: jaki cel ma wklejanie tekstu do notatnika, skoro efektu zachować (jak twierdzisz) nie można?
    Właśnie taki, żeby nie było można ... w zamyśle ma to być 'pośrednik' pomiędzy oknami wyszukiwań 'pewnych rzeczy' - podręczny kapownik.

    adamas_nt napisał:
    Wydrukować da się przecież wygodnie z Excel'a.
    Hmmm ... bez drukarki ? :|
    :D

    Dodano po 46 [sekundy]:

    JRV napisał:
    lanzul napisał:
    wpisanie, na koniec makra, linijek z przypisaniem pustego tekstu
    Wstaw przed (bf.SetText "") ...
    tt=Timer
    While timer - tt < 0.5: Doevents: Wend

    "Działa i buczy" ... :D

    JRV napisał:
    lanzul napisał:
    bf As MSForms.DataObject'
    właściwe podejście powinno być tak.
    Z innej strony DataObject jest tylko w włączonej referencji do Microsoft Forms 2.0

    Jeśli dobrze zrozumiałem, 'bf As MSForms.DataObject' jest właściwsze niż 'bf As New DataObject' ?
  • Specjalista - VBA, Excel
    Moja znajomość języka nie pozwala dokładnie wyjaśnić.
    Różnicę między 'New' i bez niego Szukaj w podstawach programowania objektowego(definicja objektow)
  • Moderator Programowanie
    lanzul napisał:
    1. Admin ma zawsze rację
    2. Kiedy nie ma - patrz pkt 1

    :D
    No, w każdym razie dzięki za awans :)

    Rzecz w tym, że zawsze szukam najprostszych rozwiązań. W takim razie jeszcze jedna próba:
    A gdyby tak zamiast do zmiennej, zapisywać wiersz pod wierszem w tymczasowym arkuszu, skopiować do schowka i wkleić do Notepad'a cały zakres?
  • Poziom 29  
    adamas_nt napisał:
    lanzul napisał:
    1. Admin ma zawsze rację
    2. Kiedy nie ma - patrz pkt 1

    :D
    No, w każdym razie dzięki za awans :)

    Rzecz w tym, że zawsze szukam najprostszych rozwiązań. W takim razie jeszcze jedna próba:
    A gdyby tak zamiast do zmiennej, zapisywać wiersz pod wierszem w tymczasowym arkuszu, skopiować do schowka i wkleić do Notepad'a cały zakres?

    Pewnie że tak można by było zrobić ...
    ... tylko że te wiersze w arkuszu, to tylko przykład był, jak napisałem 'symulacja danych ze zmiennej tablicowej', w której zapisane zostały różne dane, z różnych części arkusza / arkuszy - nie była to taka zwykła, prosta kolumna z danymi - część danych była łączona 'w locie' pomiędzy opcjami formatki / formatek.

    Dodano po 1 [minuty]:

    JRV napisał:
    Moja znajomość języka nie pozwala dokładnie wyjaśnić.
    Różnicę między 'New' i bez niego Szukaj w podstawach programowania objektowego(definicja objektow)

    oki, dzięki za pomoc :D

    Dodano po 17 [minuty]:

    JRV napisał:
    Moja znajomość języka nie pozwala dokładnie wyjaśnić
    To działa w obie strony ... :D

    JRV napisał:
    Różnicę między 'New' i bez niego Szukaj w podstawach programowania objektowego(definicja objektow)
    ... poiszczu ...
    :D