Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[EXCEL VBA]- Pobieranie danych z kilkunastu zamknietych plików

pietaszeq1 23 Mar 2011 15:48 7353 6
  • #1
    pietaszeq1
    Level 9  
    Witam Wszystkich Forumowiczów,

    mam taki problem i zastanawiam się jak można go rozwiązać.



    Potrzebuję zrobić taką bazę na potrzeby raportowania która by się aktualizowała z 17 pilików .xls w cyklu codziennym. Mówiąc bardziej szczegółowo, będę otrzymywał codziennie 17 plików po podobnej stróże z których dane chciał bym aby się automatycznie przenosiły do jednej bazy która posłuży do generowania raportu. struktura w plikach będzie zawsze taka sama dla danego obszaru. (przykład pliku w załączniku), żaden z plików nie będzie posiadał danych z więcej niż 5 miast ale są też takie obszary gdzie może być jedno miasto.

    Chciał bym aby baza pobierała dane z tych plików codziennie i uzupełniała je w stosunku do dnia jaki jest w pliku. Dane z plików mogą być umieszczane w bazie jeden pod drugim aby baza stworzyła identyczny format jak plik tylko zawierający wszystkie obszary na poszczególne dni.

    Dodam jeszcze że sumy w pliku obszar1 nie muszą się przenosić (A6:E30)

    Bardzo bym prosił o pomoc w rozwiązaniu tego problemu.
  • #2
    adamas_nt
    Moderator of Programming
    Co to znaczy "automatycznie przenosiły". Chcesz kopiować kolumny, czy zsumować dane z 17 plików w jednej kolumnie wg daty?

    Jeśli pliki umieszczone są w osobnym katalogu, lub posiadają jakąś wspólną część nazwy, to można wykorzystać funkcję Dir VBA, otwierać kolejne pliki, przepisywać/dodawać wartości i zamykać w pętli Do.
  • #3
    pietaszeq1
    Level 9  
    chodzi mi tylko o stworzenie bazy ze wszystkich plików które znajdują się w katalogu. jeżeli pliki bedą przychodzić codziennie to myślę że do każdej daty powinien być osobny katalog w którym umiszczał bym pliki. i teraz moje pytanko czy istnieje możliwość taka aby przy kopiowaniu danych z plików do bazy kopiowało wartości dla daty która jest w plikach i umieszczało w bazie w kolumnie odpowiadającej tej dacie?

    obszar miasto typ produkt Data1 Data2 Data3 Data 4 ...

    Kujawski Toruń TYP1 Produkt1 123 234 235 345 ...
  • #4
    adamas_nt
    Moderator of Programming
    pietaszeq1 wrote:
    czy istnieje możliwość taka aby przy kopiowaniu danych z plików do bazy kopiowało wartości dla daty która jest w plikach i umieszczało w bazie w kolumnie odpowiadającej tej dacie?
    Oczywiście. A jak u Ciebie z VBA?
  • #5
    pietaszeq1
    Level 9  
    hehe tak jak z fizyką jądrową :p

    znalazłem taki kod który działa w moim przypadku prawie dobrze tylko próbuję go trochę zmodyfikować ale mi nie wychodzi. Trochę topornie ale działa:)

    Code:
    Dim OutCel As Range
    
    Dim InpZbior As Workbook
    Dim OstatniWiersz

    On Error Resume Next
     ChDrive ThisWorkbook.Path
     ChDir ThisWorkbook.Path
    On Error GoTo 0

    ListaZbiorow = Application.GetOpenFilename("zeszyty (*.xls),*.xls", , "Zbiory z arkuszami do łączenia", , True)
    If Not IsArray(ListaZbiorow) Then Exit Sub

    For Each FileFullName In ListaZbiorow
     Set InpZbior = Workbooks.Open(FileFullName, 0, True)
     
     If OutCel Is Nothing Then 'pierwszy raz
      With Workbooks.Add(1)
       Set OutCel = .ActiveSheet.Cells(1, 1)
      End With
      With InpZbior.ActiveSheet
      'kopiowanie nagłowka
       .Range(.Rows(1), .Rows(PoczWierszDanych - 1)).Copy OutCel
       Set OutCel = OutCel.Cells(PoczWierszDanych, 1)   'następny będzie 5+1 wiersz
      End With
     End If
    With InpZbior.ActiveSheet
    'wyszukanie ostatniego wiersza
     OstatniWiersz = .Cells.Find("*", .Cells(1, 1), xlValues, xlWhole, xlByRows, xlPrevious).Row
     If OstatniWiersz >= 5 Then
      'kopiowanie danych od wiersza PoczWierszDanych
      .Range(.Rows(PoczWierszDanych), .Rows(OstatniWiersz)).Copy OutCel
      '1 + OstatniWiersz - 5 + 1  <- następny wolny wiersz
      Set OutCel = OutCel.Cells(1 + OstatniWiersz - PoczWierszDanych + 1, 1)
     End If
    End With
    '
     Application.DisplayAlerts = False
     InpZbior.Close False
     Application.DisplayAlerts = True
     Set InpZbior = Nothing
    Next

    End Sub



    Problem pojawia się przy wczytywaniu pierwszego pliku bo wczytuje sie w calosci pozostałe wczytuja się od 31 wiersza czyli tak jak ma byc.

    jak teraz można wyciągnąć tą datę z e3 albo jak tworzyć baze na podstawie tych dat.

    Jest jeszcze opcja ze każdy dzień bedzie w osobnym katalogu i wtedy wystarczyło by tylko dopisanie kolumny E z plików do kolejnej kolumny w bazie odpowiadajacej kolejnej dacie

    Dodano po 23 [minuty]:

    Ok z wczytywaniem sobie poradziłem poprostu na końcu usuwam wiersze w pliku wynikowym
    Code:
    Rows("1:34").Select
    
    Selection.Delete Shift:=xlUp


    tylko teraz co z tą datą?
  • #6
    adamas_nt
    Moderator of Programming
    Tak z grubsza przeanalizowałem ten kod i przestaję rozumieć...
    Kopiujesz całe zakresy wierszy?
  • #7
    pietaszeq1
    Level 9  
    tak do ostatniego pełnego wiersza, przynajmniej tak mi sie wydaje

    Dodano po 17 [minuty]:

    co do daty to zrobiłem taki motyw ze w kolumnie F dałem odwołanie do E3 aby do każdej pozycji przypisało datę tylko że poskopiowaniu dostałem w kolumnie F =#ADR!. co zrobić aby kopiowało mi wartości a nie formuły?

    Dodano po 1 [godziny] 37 [minuty]:

    dzięki juz sobie poradziłem jakoś