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

VBA Excel - Import plików txt do kolejnych kolumn w jednym arkuszu

vcarter 24 Jun 2013 13:12 7647 13
  • #1
    vcarter
    Level 11  
    Witam !
    Szukam makra które zaimportuje dane z plików txt do poszczególnych kolumn w jednym arkuszu.

    Mam np folder c:\a i w nim 50 plików txt i chciałbym aby excel po kolei wybierał pliki od AdoZ i wklejał dane z plików do jednego arkusza - czyli kolumna A = dane z pierwszego pliku, kolumna B = dane z 2 pliku itd

    przeszukałem forum i znalazłem tylko makro wgrywające pojedyńcze pliki lub makra do starych wersji excela z ograniczeniem do 65000 komórek lub bardziej skomplikowane makra które wgrywają wybrane fragmenty danych.

    dzięki z góry za pomoc :)

    znalazłem coś takiego ale wgrywa tylko pierwszy plik...
    Code: vbscript
    Log in, to see the code
  • Helpful post
    #2
    cbrman
    Level 27  
    Przetestuj poniższe makro.
    Code: vbscript
    Log in, to see the code

    W sumie jest to szybka przeróbka z innego projektu, ale powinna działać zgodnie z założeniami.
  • #3
    vcarter
    Level 11  
    makro działa chyba tak jak trzeba :)
    ale jest mały problem - gdy ładuje małe pliki txt to jest ok ale gdy ładuje duże pliki txt (około 5mb każdy) to makro ładuje około 30 000 wierszy i wyskakuje błąd "Overflow"
  • #4
    cbrman
    Level 27  
    Zmień deklaracje zmiennej iRw na long.
  • #5
    vcarter
    Level 11  
    hm nie bardzo wiem jak to dokładnie zrobić ...
  • Helpful post
    #6
    cbrman
    Level 27  
    Zmień
    Code: vbscript
    Log in, to see the code

    na
    Code: vbscript
    Log in, to see the code
  • Helpful post
    #7
    adamas_nt
    Moderator of Programming
    vcarter - w pierwszym poście przedstawiłeś kod, w którym wystarczy tylko zmienić wklejanie całej zawartości pliku na odczyt wiersz po wierszu i umieścić wszystko w pętli.

    VBA posiada wbudowane funkcje. które radzą sobie z własnymi oraz niektórymi obiektami systemowymi, w przeciwieństwie do Np Basica w Open Office, gdzie niemal wszystkie obiekty wymagają deklarowania w kodzie. Niczego nie osądzam, niczego nie krytykuję. Wszystko ma swoje plusy i minusy.

    Ale (tu nie wytrzymałem) skoro można zrobić prościej ;)
    W przykładzie zmodyfikowana procedura z postu #1
    Code: vbscript
    Log in, to see the code
  • #8
    cbrman
    Level 27  
    @adamas_nt tak jak napisałem w poście publikując moje makro.
    Miałem już gotową procedurę wczytywania plików txt z innego projektu, więc prościej było mi ją dostosować do wymagań autora wątku niż analizować jego kod i wprowadzać w nim zmiany ;)

    EDIT:
    @adamas_nt w Twoim kodzie brakuje przypisania zmiennej row wartości 1 po wczytaniu ostatniej linii każdego pliku txt
  • #9
    adamas_nt
    Moderator of Programming
    cbrman wrote:
    więc prościej było mi ją dostosować
    To rozumiem doskonale :) i zgadzam się z Tobą.

    cbrman wrote:
    @adamas_nt w Twoim kodzie brakuje przypisania zmiennej row wartości 1 po wczytaniu ostatniej linii każdego pliku txt
    Racja, należy przesunąć je do wewnątrz pętli. Punkt za spostrzegawczość ;)
  • #10
    vcarter
    Level 11  
    dziękuje za odpowiedzi - mam jeszcze jedno pytanie - jeśli w pliku txt mam kilka kolumn danych np:
    1 2 3
    4 5 6
    7 8 9
    to jest możliwość modyfikacji makra aby kopiował dane np z pliku nr 1 do kolumn A B C, później z pliku nr2 do D E F itd ?

    EDIT: pojawił się jeszcze jeden problem - mianowicie gdy mam pliki nazwane:
    abc-1.txt abc-2.txt i tak do 60 to najpierw makro wstawia do kolumny A abc-1.txt a do kolumny B abc-10.txt i do C abc-11.txt a chciałbym żeby dodawał po kolei 1,2,3,4 itd
  • Helpful post
    #11
    cbrman
    Level 27  
    Przetestuj
    Code: vbscript
    Log in, to see the code

    Jako separator kolumn w plikach txt ustawiłem spację.
  • #12
    lapbeer
    Level 10  
    Pozwolę sobie odświeżyć temat bo makro spełnia moje oczekiwania tylko nie mogę sobie poradzić z jego przerobieniem a mianowicie chciałbym, żeby dane z poszczególnych plików txt kopiowały się nie jedno obok drugiego (w kolejnych kolumnach) tylko jedno pod drugim.
    I jeszcze jedno, gdyby się dało też w ostatniej kolumnie przy każdym wierszu wpisać nazwę pliku, z którego dane zostały zaimportowane, to byłoby super!
  • #13
    bielwal
    Level 1  
    lapbeer wrote:
    Pozwolę sobie odświeżyć temat bo makro spełnia moje oczekiwania tylko nie mogę sobie poradzić z jego przerobieniem a mianowicie chciałbym, żeby dane z poszczególnych plików txt kopiowały się nie jedno obok drugiego (w kolejnych kolumnach) tylko jedno pod drugim.
    I jeszcze jedno, gdyby się dało też w ostatniej kolumnie przy każdym wierszu wpisać nazwę pliku, z którego dane zostały zaimportowane, to byłoby super!





    Option Explicit

    Sub Import_TXT_FSO_SPLIT()

    Dim oFSO As Object 'File System Object
    Dim oFld As Object 'Obiekt Folder
    Dim oFls As Object 'Obiekt Plik
    Dim oTemp As Object
    Dim iRw As Integer: iRw = 1 'wiersz do którego wpisywane są dane
    Dim sItem As String 'katalog z plikami
    Dim sExt As String 'rozszerzenie pliku
    Dim fl As Object
    Dim j As Integer: j = 1 'kolumna do której wpisywane są dane
    Dim tTblTemp()
    Dim k As Integer

    Set oFSO = CreateObject("Scripting.FileSystemObject")

    sItem = "C:\a\"

    Set oFld = oFSO.GetFolder(sItem)
    Set oFls = oFld.Files
    For Each fl In oFls
    sExt = oFSO.GetExtensionName(fl)
    If sExt = "txt" Then
    Set oTemp = oFSO.OpenTextFile(fl)
    Do While Not oTemp.AtEndOfStream
    tTblTemp() = Application.Transpose(Split(oTemp.readline, " "))
    If UBound(tTblTemp()) > 1 Then
    For k = 1 To UBound(tTblTemp())
    Cells(iRw, k - 1 + j).Value = tTblTemp(k, 1)
    Next k
    Else
    Cells(iRw, j).Value = tTblTemp(1)
    End If
    iRw = iRw + 1
    Loop
    j = Cells(1, 1).CurrentRegion.Columns.Count + 1
    ' iRw = 1
    End If
    Next

    Set oTemp = Nothing
    Set fl = Nothing
    Set oFls = Nothing
    Set oFld = Nothing
    Set oFSO = Nothing

    End Sub
  • #14
    kinggustav
    Level 27  
    Sorry, ale w tym momencie próbujesz zrobić coś głupiego. Przemyśl temat jeszcze raz. Na mój gust potrzebujesz zbierać dane ze wszystkich plików w jednej kolumnie, ale z dodatkowymi informacjami jak nazwa pliku i może jeszcze coś. Nie ma raczej sensu zapisywać tego w wielu kolumnach. Jak będziesz to dalej przetwarzać? Bo chyba jakoś będziesz. Od tego zależy cała reszta.
    Zapisując wszystko jedno pod drugim zbliżasz się niebezpiecznie do granic możliwości Excela, choć najnowszy chyba sobie poradzi.