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.

Kopiowanie linii w vba - Wczytanie pliku txt do excela

stahkom 10 Mar 2014 08:32 1728 4
  • #1 10 Mar 2014 08:32
    stahkom

    Poziom 5  

    Witam,

    Mam problem z długo wykonującym się kodem. Pisze krótki program wczytujący pliki txt do Excela za pomocą VBA. z zapisem danych do pliku nie ma problemu, jednak wczytanie pliku zajmuje trochę czasu.

    Struktura pliku txt to:

    1;12;12;12;12;12;12;12;12;8;8;8;8;8;8;8;8;8;6;6;6;6;6;6;6;6;12;12;12;12;12;12;
    5;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;
    4;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;
    2;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;12;

    gdzie ilość linii jest zmienna a ilość wartości jest taka sama.

    Kod wygląda następująco:

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    Tekst wyłączony jest to 2 pętla z którą próbowałem jednak czas się nie zmienia. Zastanawiam się czy istnieje możliwość wczytania z takiego pliku całej linii ( bez wewnętrznej pętli while ( lub for w drugim przypadku ) z zaznaczeniem, że każda komórka jest oddzielona ";". Proszę o Pomoc.

    Chodzi mi po głowie jeszcze jeden pomysł. A mianowicie:
    Wiem jak skopiować dane metodą zaznaczenia do schowka i zapisać je jako txt. Próbowałem nagrać makro które dodawało by dane zewnętrzne z pliku txt tylko po nagraniu dodając kod do tej funkcji wyskakiwał komunikat o braku pamięci przy
    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Oto nagrane makro:

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Przy dodaniu do funkcji wyżej zmieniłem tylko linie:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    na:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0 4
  • #2 10 Mar 2014 10:02
    Aldrin
    Poziom 22  

    Z przyspieszeniem możnaby zrobić tak:

    1)
    Oprócz Application.ScreenUpdating = False ustawić jeszcze na starcie:
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False

    a na końcu:
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True

    Jak duży będzie zysk? Zależy od odwołań do danych/przeliczeń.

    2)
    Myślę, że większe korzyści można odnieść optymalizując:
    Me.Repaint
    Call pas1.Pasek_Up1(i + 1)
    Me.Repaint

    Jeśli będzie 10.000 odwołań, to trzeba to odrysować, a człowiek i tak nie zauważy. Może nawet nie trzeba wyświetlać każdego procenta?
    Przydaje się tu dodatkowy licznik/krok, który co x przebiegów pętli odrysuje co trzeba. Wartość x można dobrać eksperymetalnie, w zależności od możliwości maszyny i czasochłonności wykonywanych poleceń, lub obliczyć wstępnie krok np. co 3%
    Na próbę można w ogóle zrezygnować z wyświetlania postępu i zmierzyć czas całości - czy opłaca się coś tutaj zmieniać? Powinno się opłacać.

    Przydatne jest też DoEvents (nie za często), bo nie tracimy kontaktu z Excelem.

    Zamiast rysować można też wyświetlać komunikaty na pasku stanu:
    Application.StatusBar = "a tutaj treść komunikatu"

    Co jest lepsze: Me.Repaint czy pas1.Repaint ?

    0
  • #3 10 Mar 2014 15:09
    JRV
    Specjalista - VBA, Excel

    Witaj

    stahkom napisał:
    Struktura pliku txt to:
    1;12;12;12;12;12;12;12;12.....

    Dlaczego '.TextFileTabDelimiter = True' a '.TextFileSemicolonDelimiter = False'
    a nie na odwrót?

    0
  • #4 11 Mar 2014 06:32
    stahkom

    Poziom 5  

    Tak nagrało mi makro które zarejestrowałem. Znalazłem problem z komunikatem Out of Memory:

    Problemem był pusty plik. Dodałem sprawdzenie czy plik jest pusty i wszystko działa jak powinno.

    Odnośnie :

    Aldrin napisał:

    Myślę, że większe korzyści można odnieść optymalizując:
    Me.Repaint
    Call pas1.Pasek_Up1(i + 1)
    Me.Repaint


    ustawiłem już, żeby pasek był zależny od wartości najmniejszej - tu było od ilości pracowników. Kiedy nie było paska myślałem, ze więcej czasu zajmuje inna funkcja ale się myliłem.

    Temat uważam za zakończony ;-)[/tr]

    0
  • #5 11 Mar 2014 19:40
    Aldrin
    Poziom 22  

    stahkom napisał:
    Mam problem z długo wykonującym się kodem...
    Kiedy nie było paska myślałem...

    Temat uważam za zakończony

    Ja też dziekuję.

    0
  Szukaj w 5mln produktów