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.

MS Excell - makro wyszukujące dane w kilku folderach

02 Gru 2013 22:21 1839 7
  • Poziom 12  
    Cześć

    Mam ogromną prośbę o pomoc w napisaniu Makra które wyszukiwałoby mi w kilkunastu pliakch xls dane z listy umieszczonej w pliku Excela. Lista zawiera listę z nagłówkami: numer(id) imię i nazwisko. Makro przeszukiwałoby mi pliki w których jest id oraz kwota, pliki znajdują się w folderze z listą, wyszukiwanie zwracałoby informację nazwa pliku w którym znalazł dane, oraz kwotę.
    Jestem laikiem jeżeli chodzi o VBA także będę wdzięczny za wyrozumiałość i pomoc.

    pozdrawiam
    Rafał
  • Moderator Programowanie
    Trochę pogmatwany ten opis ;)

    1. Wszystkie w tym samum folderze?
    2. Wszystkie mają być przeszukiwane, czy tylko z jakąś specjalną nazwą, datą modyfikacji, lub tp?
    3. Ile arkuszy do przeszukania w każdym, która kolumna zawiera id, która kwotę?

    Nie oszczędzaj klawiatury, wskazany jakiś plik z przykładem (Np arkusz wynikowy + jeden arkusz z pliku źródłowego (jeśli *.xls*)

    Z drugiej strony: to nic specjalnie trudnego. Nagraj makro otwierania pliku, zaznaczania kolumny, ctrl+f. Zamknij w pętli, popraw, zadeklaruj zmienne, podstaw wartości, usuń błędy :)
  • Poziom 12  
    Sorki nie wiedziałem jak opisać. Zainteresowałem się makrem jak mi temat wpadł, a spędziłem na próbach kilka dni zaczym napisałem na forum :(

    1.Wszystkie pliki są w tym samym folderze
    2.Każdy plik ma zostać przeszukany (bez względu na date, nazwę itd)
    3.każdy plik zawiera wyłącznie jeden arkusz.

    dzięki za pomoc.

    Zarejestrowałem makro niestety nie wiem jak zmienić, aby wyszukiwało we wszytkich w folderze bez wpisywania kolejno każdej nazwy pliku. W załączeniu pliki przykładowe z listą i zarejestrowanym poniżej makrem:
    Sub otworzenie_pliku()
    '
    ' otworzenie_pliku Makro
    '

    '
    ChDir "D:\Nowy folder (2)"
    Workbooks.Open Filename:= _
    "D:\Nowy folder (2)\Sprzedaz_styczen.xlsx"
    End Sub

    Sub Wyszukaj()
    '
    ' Wyszukaj Makro
    '

    '
    ActiveCell.FormulaR1C1 = _
    "=VLOOKUP(RC[-2],[Sprzedaz_styczen.xlsx]Arkusz1!C2:C4,3,FALSE)"
    Range("C2").Select
    Selection.AutoFill Destination:=Range("C2:C11")
    Range("C2:C11").Select
    End Sub[/syntax]
  • Poziom 12  
    Otwierając plik i kopiując uzyskałem zgodnie z poniższym, nie wiem jednak jak zmodyfikować aby nie było konieczności wprowadzania danych plików ręcznie:
    Windows("Lista.xlsm").Activate
    Windows("Sprzedaz_styczen.xlsx").Activate
    Windows("Lista.xlsm").Activate
    Windows("Sprzedaz_styczen.xlsx").Activate
    Windows("Lista.xlsm").Activate
    Range("A2").Select
    Selection.Copy
    Windows("Sprzedaz_styczen.xlsx").Activate
    Cells.Find(What:="10112", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
    :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
    False, SearchFormat:=False).Activate
    Range("D2").Select
    Application.CutCopyMode = False
    Selection.Copy
    Windows("Lista.xlsm").Activate
    Range("D2").Select
    ActiveSheet.Paste
    Range("A3").Select
    Application.CutCopyMode = False
    Selection.Copy
    Windows("Sprzedaz_styczen.xlsx").Activate
    Cells.Find(What:="10113", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
    :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
    False, SearchFormat:=False).Activate
    Range("D3").Select
    Application.CutCopyMode = False
    Selection.Copy
    Windows("Lista.xlsm").Activate
    Range("D3").Select
    ActiveSheet.Paste
    Windows("Sprzedaz_styczen.xlsx").Activate
    Windows("Lista.xlsm").Activate
    Range("A4").Select
    Application.CutCopyMode = False
    Selection.Copy
    Windows("Sprzedaz_styczen.xlsx").Activate
    Cells.Find(What:="10114", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
    :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
    False, SearchFormat:=False).Activate
    Range("D4").Select
    Application.CutCopyMode = False
    Selection.Copy
    Windows("Lista.xlsm").Activate
    Range("D4").Select
    ActiveSheet.Paste
    Range("A5").Select
    Application.CutCopyMode = False
    Selection.Copy
    Windows("Sprzedaz_styczen.xlsx").Activate
    Cells.Find(What:="10115", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
    :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
    False, SearchFormat:=False).Activate
    Windows("Lista.xlsm").Activate
    Range("A6").Select
    Application.CutCopyMode = False
    Selection.Copy
    Windows("Sprzedaz_styczen.xlsx").Activate
    Cells.Find(What:="10116", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
    :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
    False, SearchFormat:=False).Activate
    ActiveWindow.Close
    Workbooks.Open Filename:= _
    "D:\Nowy folder (2)\Sprzedaz_luty.xlsx"
    Windows("Lista.xlsm").Activate
    Range("A2").Select
    Application.CutCopyMode = False
    Selection.Copy
    Windows("Sprzedaz_luty.xlsx").Activate
    Cells.Find(What:="10112", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
    :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
    False, SearchFormat:=False).Activate
    Windows("Lista.xlsm").Activate
    Range("A3").Select
    Application.CutCopyMode = False
    Selection.Copy
    Windows("Sprzedaz_luty.xlsx").Activate
    Cells.Find(What:="10113", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
    :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
    False, SearchFormat:=False).Activate
    ActiveWindow.Close
    End Sub
    e
  • Pomocny post
    Moderator Programowanie
    Ojej! Ale najważniejsze, że próbujesz ;) Przy okazji: wklejając kod, umieść go pomiędzy znacznikami Syntax (opcja listing kodu)

    Poniżej przykład oparty o 'Dir'. Przeanalizuj, dostosuj do własnych potrzeb
    Kod: vb
    Zaloguj się, aby zobaczyć kod
  • Poziom 12  
    Wieeeelkie dzięki
    "pobawiłem się" i bardzo mi pomogło w kolejnych zadaniach :)

    Powiedz jeszcze proszę, jak zmodyfikować aby przeszukiwało również podfoldery? oraz w jaki sposób zmiast numeru kolumny z której zwraca wartość, aby zwracało wartość z kolumny o określonym nagłówku.

    pozdrawiam
    Rafał
  • Moderator Programowanie
    1. Potrzebna będzie jeszcze jedna pętla z funkcją 'Dir' + parametr vbDirectory (opis w helpie). Wynik podstawiasz jako argument 'ChDir' i dalej jak wyżej.

    2. Podobnie jak z wyszukiwaniem identyfikatora (metoda 'Find'). Przeszukujesz pierwszy wiersz, z tym że szukasz ciągu... no właśnie. Tylko "LP" jest we wszystkich plikach, więc musiałbyś najpierw zoptymalizować nagłówki (wszędzie identyczne), albo wykorzystać 'InStr' w pętli - jeszcze jednej ;)
    Szukasz Nr kolumny, czyli zamiast ".Row" - ".Column". Wynik podstawiasz w linii przypisana zmiennej 'test' (jest .Column(2) - będzie .Column(zmienna reprezentująca Nr kolumny)

    Wypróbuj sobie kolejne kroki w osobnej procedurze. Jak już "złapiesz" działanie, poskładaj wszystko w całość...
  • Poziom 12  
    Bardzo dziękuję Ci za pomoc i wskazówki, popróbuję poczytam :)