Excel - Visual basic pobieranie danych z excela

0

Witam,
posiadam makro które pobiera wartości z różnych Excelów (zakładając że mają tą samą budowę) w jednym folderze i scala je do jednego.
Teraz mam problem, ponieważ chciałbym aby makro pobierało wartości też z różnych Excelów które są umieszczone w określonych lokalizacjach np. w dysku C w pod folderze A, i na dysku D pod folderze G.
Czy ktoś ma jakiś pomysł jak to zrealizować?
Mój aktualny kod:

Sub dzialaj()
Selection.ClearContents
Dim orzeszek As Workbook
Dim mergeObj As Object, dirObj As Object, filesObj As Object, everyObj As Object
'Application.ScreenUpdating = False
Set mergeObj = CreateObject("Scripting.FileSystemObject")
Set dirObj = mergeObj.Getfolder("tutaj jest ścieżka do folderu")
Set filesObj = dirObj.Files
For Each everyObj In filesObj
Set orzeszek = Workbooks.Open(everyObj)
Range("A3:IV" & Range("A65536").End(xlUp).Row).Copy
ThisWorkbook.Worksheets(1).Activate
Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial
Application.CutCopyMode = False
'Application.ScreenUpdating = True
orzeszek.Close
Next
Rows("1:1").Select
    Application.CutCopyMode = False
    Selection.Delete Shift:=xlUp
End Sub
0

Tę linię musisz zmodyfikować:
Set dirObj = mergeObj.Getfolder("tutaj jest ścieżka do folderu")

0
Marcin.Miga napisał(a):

Tę linię musisz zmodyfikować:
Set dirObj = mergeObj.Getfolder("tutaj jest ścieżka do folderu")

Nie jestem jeszcze tak bardzo doświadczony w VB, w jaki sposób mogę dodać wiele ścieżek w takim przypadku ?

1

Pod sub dzialaj() dodaj linie:
a = Array("c:\katalog1", "e:\katalog3", "d:\katalog2")
Dim s
zamiast linii Set dirObj = mergeObj.Getfolder("tutaj jest ścieżka do folderu") daj:
For Each s In a
Set dirObj = mergeObj.Getfolder(s)
po Next daj jeszcze jednego Next
Powinno być OK.
Ale wiesz, że masz ograniczenie do "starego" Excela?

0
Marcin.Miga napisał(a):

Pod sub dzialaj() dodaj linie:
a = Array("c:\katalog1", "e:\katalog3", "d:\katalog2")
Dim s
zamiast linii Set dirObj = mergeObj.Getfolder("tutaj jest ścieżka do folderu") daj:
For Each s In a
Set dirObj = mergeObj.Getfolder(s)
po Next daj jeszcze jednego Next
Powinno być OK.
Ale wiesz, że masz ograniczenie do "starego" Excela?
Dziękuję za pomoc, a możesz podpowiedzieć o co chodzi z tym ograniczeniem ?

0

"Stary" Excel ma ograniczenie do 65536 wierszy. Nowy do coś ponad 2 mln 220

0
Marcin.Miga napisał(a):

"Stary" Excel ma ograniczenie do 65536 wierszy. Nowy do coś ponad 2 mln 220

Ok dzięki jeszcze raz.
Mam pytanie, bo zmodyfikowałem dalej kod o kolejne funkcje, ale mam problem, zakładając ze mamy kilka komórek np. A1,B2,C3, w każdej z nich mamy wpisaną ścieżkę, i jak zrobić żeby wpisywało te ścieżki do Array? Sugerując się tym co wcześniej

0

a = Array(Range("a1"), Range("b2"), Range("c3"))

0
Marcin.Miga napisał(a):

a = Array(Range("a1"), Range("b2"), Range("c3"))

Super, naprowadziło mnie na coś takiego:
Dim a As Variant
a = Range("a1:a5").Value
Pobiera mi wtedy od zakresu a1 do a5. Tylko że wyskakuje mi błąd bo np. a5 akurat w danym dniu jest pusty, Run-time error 5 w trybie debug zaznacza mi Set dirObj = mergeObj.Getfolder(s).
Ale wszystko wczytuje dobrze. Tylko ten błąd jest irytujący, próbowałem znalazłem jakieś komendy na wyłączenie błędów ale nie działają, nie wiem czy można usuwać jakby puste pola, jeśli nic w nich nie ma, żeby pomijał?

1

Możesz sprawdzać np tak:

If s<> vbNullString Then
' zrób
End If

Albo wyłączyć obsługę błędów:

On Error Resume Next
' już nie reaguje na błędy, tylko leci dalej
' potem trzeba przywrócić przez
On Error Goto 0

ale nie jest to zalecane.

0
Marcin.Miga napisał(a):

Możesz sprawdzać np tak:

If s<> vbNullString Then
' zrób
End If

Albo wyłączyć obsługę błędów:

On Error Resume Next
' już nie reaguje na błędy, tylko leci dalej
' potem trzeba przywrócić przez
On Error Goto 0

ale nie jest to zalecane.

Ok, sprawdziłem, niestety ale żadna z opcji nie działa :( zacząłem wstawiać na wszystkie możliwe kombinacje, ale za każdym razem występuje ten błąd, jedynie w momencie kiedy wszystkie komórki mam wypełnione ścieżkami jest ok. Chyba że źle gdzieś wstawiam te kody.
Wklejam kod złączony z podpowiedziami z tego wątku:
Sub dziaaaaaalaj()

Dim a As Variant
a = Range("H5:H7").Value
Dim s
Selection.ClearContents
Dim orzeszek As Workbook
Dim mergeObj As Object, dirObj As Object, filesObj As Object, everyObj As Object
'Application.ScreenUpdating = False
Set mergeObj = CreateObject("Scripting.FileSystemObject")
For Each s In a
Set dirObj = mergeObj.Getfolder(s)

Set filesObj = dirObj.Files
For Each everyObj In filesObj
Set orzeszek = Workbooks.Open(everyObj)

Range("A3:G" & Range("A65536").End(xlUp).Row).Copy

ThisWorkbook.Worksheets(1).Activate
Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial

Application.CutCopyMode = False
'Application.ScreenUpdating = True

orzeszek.Close

Next
Next

End Sub

0
Sub dziaaaaaalaj()

Dim a As Variant
a = Range("H5:H7").Value
Dim s
Selection.ClearContents
Dim orzeszek As Workbook
Dim mergeObj As Object, dirObj As Object, filesObj As Object, everyObj As Object
'Application.ScreenUpdating = False
Set mergeObj = CreateObject("Scripting.FileSystemObject")
For Each s In a
   If s<>vbNullString Then
      Set dirObj = mergeObj.Getfolder(s)

      Set filesObj = dirObj.Files
      For Each everyObj In filesObj
         Set orzeszek = Workbooks.Open(everyObj)
         Range("A3:G" & Range("A65536").End(xlUp).Row).Copy

         ThisWorkbook.Worksheets(1).Activate
         Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial

         orzeszek.Close
      Next
   End If
Next

Application.CutCopyMode = False
'Application.ScreenUpdating = True

End Sub

0
Marcin.Miga napisał(a):
Sub dziaaaaaalaj()

Dim a As Variant
a = Range("H5:H7").Value
Dim s
Selection.ClearContents
Dim orzeszek As Workbook
Dim mergeObj As Object, dirObj As Object, filesObj As Object, everyObj As Object
'Application.ScreenUpdating = False
Set mergeObj = CreateObject("Scripting.FileSystemObject")
For Each s In a
   If s<>vbNullString Then
      Set dirObj = mergeObj.Getfolder(s)

      Set filesObj = dirObj.Files
      For Each everyObj In filesObj
         Set orzeszek = Workbooks.Open(everyObj)
         Range("A3:G" & Range("A65536").End(xlUp).Row).Copy

         ThisWorkbook.Worksheets(1).Activate
         Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial

         orzeszek.Close
      Next
   End If
Next

Application.CutCopyMode = False
'Application.ScreenUpdating = True

End Sub

Witam,
Chciałem się spytać ponieważ robię podobny projekt z pobieraniem plików, jedna rzecz mnie zastanawia, sugerując się tym kodem,jeśli mam X plików, każdy ma po kilkaset danych, i w każdym są tez nagłówki od A1 do A2 to program próbuje mi pobrać te nagłówki z każdego pliku i wklejać je momencie kiedy wkleja zawartość. Da się kod zmodyfikować aby pobierał A1:A2 czyli tytuł i potem treść z pliku np.H5 a z reszty H6 i H7 itd sama treść ?

0

Na pewno się da, choc nie kumam, co napisałeś...

0

Dzieki za odpowiedz. Kod który zrobiliście bardzo mi pomógł bo scala wszystkie pliki z określonych ścieżek wpisanych w excelu. Ale mam taki problem, jeśli mamy podane 4 ścieżki z plikami do scalenia, i każdy z nich ma trescl i nagłówki.
Czy jest możliwość zrobienia żeby właśnie tak jak teraz jest scalał te wszystkie pliki + żeby pobierał nagłówek ale tylko z jednej ścieżki a nie ze wszystkich ?

0
Marcin.Miga napisał(a):

Na pewno się da, choc nie kumam, co napisałeś...

Wydaje mi się że chodzi mu o to że:
Mamy ściężki z których scala pliki Excel czyli tak jak teraz. Załóżmy że mamy 4 pliki lub więcej o tej samej budowie:
Plik A - Ma nagłówek czyli jakąś treść tekstową i potem liczby, potem pliki B,C,D. W momencie kiedy scala wszystkie pliki pobiera z A nagłówek i go umieszcza na górze potem liczby. Następnie pobiera z B nagłówek i liczby itd. Wydaje mi się że chodzi o to żeby Tylko z pliku A pobierało nagłówek i liczby, a z całej reszty tylko liczby.

0
Gacek excelsio napisał(a):

Dzieki za odpowiedz. Kod który zrobiliście bardzo mi pomógł bo scala wszystkie pliki z określonych ścieżek wpisanych w excelu. Ale mam taki problem, jeśli mamy podane 4 ścieżki z plikami do scalenia, i każdy z nich ma trescl i nagłówki.
Czy jest możliwość zrobienia żeby właśnie tak jak teraz jest scalał te wszystkie pliki + żeby pobierał nagłówek ale tylko z jednej ścieżki a nie ze wszystkich ?

Czyli budowa pliku jak na zdjęciu ? Każdy z nich ma taką samą budowę, a tylko z jednego ma pobrać nagłówek i liczby, a u reszty bez nagłówka czyli od A3 w dół

0
Marcin.Miga napisał(a):

Na pewno się da, choc nie kumam, co napisałeś...
Aktualnie pobiera z A3 wszystkich ścieżek w dół wszystkie wartości i scala.
A jak zrobić żeby scalał tez komórki od A1 do A2 gdzie jest nagłówek ?
Bo jak zmienię zakres od A1 to ok pobiera je, ale pobiera ze wszystkich a mi by zależało żeby pobierał tylko z jednego

1 użytkowników online, w tym zalogowanych: 0, gości: 1