VBA Zliczanie godzin z innych plików do podsumowania

0

Cześć,

Dopiero zaczynam programowanie w VBA (potrzeba chwili) i od razu skok na głęboką wodę...
Aktualnie wykonałem arkusz, który tworzy projekt, nadaje mu dane w nagłówku i zapisuje go jako nowy plik:
dod_pro.pngprojekty.pngprojekt.png

Wszystko śmiga jak tra lala, jestem z siebie dumny... jednak przyszedł moment, że trzeba dane zestawić w tabeli, która przedstawiać będzie miesięczne wyrobienie godzin przez poszczególnych pracowników:
zestawienie.png

Wiem co chcę zrobić, jednak nie wiem jak temat ugryźć. Program musi kolejno:

  1. Otwierać plik w określonej lokalizacji.
    to można powiedzieć, że wiem, ale mogę się mylić:
sciezka_pliku = "\\EWIDENCJA GODZIN B+R\Projekty_B+R" & "\"
nazwa_pliku = Dir(sciezka_pliku & "*.xlsm")
Do While nazwa_pliku <> ""
Set arkusz = Workbooks.Open(sciezka_pliku & nazwa_pliku)
  1. Wyszukiwać, w których wierszach otwartego pliku znajduje się pierwsze nazwisko z zestawienia.
  2. Pobierać z tych wierszy wartość i "czas" (w zależności od daty, bo musi być podział na miesiące).
  3. Sumować czasy i przepisywać je do konkretnego miesiąca pod danym nazwiskiem,
  4. Gdy spisze dane danego nazwiska ze wszystkich plików to przechodzi do drugiego nazwiska, ew. wersja druga: gdy spisze dane wszystkich nazwisk z danego pliku przechodzi do następnego pliku.

Proszę o pomoc, bo gubię się we własnych myslach.

2

To, co chcesz zrobić to się nazywa Baza Danych. I Excel średnio się do tego nadaje.

0

Cześć, Przede wszystkim dziękuje za zainteresowanie tematem. Średnio się nadaje czy się nie da?
Temat wyniknął z tego, ze przełożony pierwotnie poprosił o wykonanie kalkulatora z podziałem na projekty, a już post factum stwierdził, ze jednak potrzebny jest z podziałem na ludzi. Wolałbym nie tworzyć nowego kalkulatora od nowa, tym bardziej ze wiedza nt. poszczególnych składowych tez jest wg mnie ważna.
Wiem, ze temat jest do ogarnięcia, ale z racji tego, ze ten kalkulator to pierwsza moja styczność z VBA, nie bardzo wiem jak go ugryźć.
Aktualnie udało mi się już utworzyć funkcje przeszukująca wiersze i wypisująca z nich wartości oraz wywołanie jej w pętli while. Nie wiem jeszcze czemu nie zaczytuje wszystkich wartości. Jak będę w pracy chętnie wkleję to co udało mi się wycudować.

0
Marcin.Miga napisał(a):

To, co chcesz zrobić to się nazywa Baza Danych. I Excel średnio się do tego nadaje.

Prawie gotowa relacyjna struktura bazy :)

Strogonovv napisał(a):

Cześć, Przede wszystkim dziękuje za zainteresowanie tematem. Średnio się nadaje czy się nie da?

Temat wyniknął z tego, ze przełożony pierwotnie poprosił o wykonanie kalkulatora z podziałem na projekty, a już post factum stwierdził, ze jednak potrzebny jest z podziałem na ludzi. Wolałbym nie tworzyć nowego kalkulatora od nowa, tym bardziej ze wiedza nt. poszczególnych składowych tez jest wg mnie ważna.

Śliczny argument za relacyjną bazą danych

0

Dziękuje za niezbyt pomocne odpowiedzi. Nadal liczę, ze odpowie ktoś z instrukcją jak ugryźć temat, bo zauważyłem, ze się da.

2

Widzisz, czytasz, a nie rozumiesz. Te rady są właśnie po to, by odwieźć cię od złego zamiaru, póki jeszcze możesz. Póki nie zabrnąłeś za daleko.
Jeśli na tym etapie wiesz że powinieneś skorzystać z bazy danych, to postaraj się tak zrobić. Wszystkie te dane z bazy danych pobierzesz jednym (w miarę nieskomplikowanym) zapytaniem.
A w Excelu samo przepisanie danych to mnóstwo kodu - przynajmnijej 3 pętle z otwieraniem, zamykaniem plików, iteracji po nich (po jakichś nieznanych obszarach) po to tylko, żeby przepisać dane do jednego wspólnego. A na końcu się okazuje, że ktoś w ilości godzin wpisał 3,50, zamiast 3:50.
Naprawdę - oszczędź sobie nerwów, poświęć więcej czasu i przejdź na bazę danych. Excel może nadal służyć do wpisywania danych do niej. (jeśli nie masz Accessa)

0

Ok, nie twierdzę, że to podejście nie jest rozsądniejsze, jednak o ile w VBA co nieco już podłapałem i potrafiłbym się w tym poruszać, to znowu baza danych to dla mnie ciemna masa. Mogę prosić o pomoc jak ruszyć?

0

Zacznij od Access, o ile masz.
Spróbuj przemyśleć strukture danych, uporzadkować i przenisć je do bazy danych. W razie czego jest tu społeczność, która Ci pomoże i doradzii.

0

Dzień dobry,

Temat w godzinę ogarnięty w VBA w excel. Potrzebne dane, tj. imie nazwisko, data oraz czas, listowane w osobnym arkuszu w pliku zestawienia ze wszystkich plików składowych.
Do zestawienia dane wyciągane ze zbiorczego arkusza sumą warunków.

Poniżej załączam kod źródłowy, może ktoś kiedyś będzie borykał się z podobnym problemem.

Sub Aktualizuj_Click()

Application.ShowWindowsInTaskbar = False
Application.ScreenUpdating = False

Dim Zestawienie As Worksheet
Dim sciezka_pliku As String
Dim nazwa_pliku As String
Dim Arkusz As Workbook
Dim DaneP As Worksheet
Dim Ostatni_wiersz As Long
Dim Ost_zest As Long
Dim IiN As String
Dim Dl_Str As Integer

Set Zestawienie = ThisWorkbook.Worksheets(3)
sciezka_pliku = ThisWorkbook.Path & "\" & "Projekty_B+R" & "\"
nazwa_pliku = Dir(sciezka_pliku & "*.xlsm")

'--> obowiązkowy wyczyścić na początek listę w zestawieniu!
Ost_zest = Last(1, Zestawienie.Columns("A:Z"))
If Ost_zest > 2 Then Zestawienie.Range("A3:Z" & Ost_zest).Clear

Ost_zest = Last(1, Zestawienie.Columns("A:Z"))

Do While nazwa_pliku <> ""
    Set Arkusz = Workbooks.Open(sciezka_pliku & nazwa_pliku)
    Set DaneP = Arkusz.Worksheets(1)
    Ostatni_wiersz = Last(1, DaneP.Columns("A:G"))

    
    For i = 5 To Ostatni_wiersz
            IiN = CStr(DaneP.Cells(i, 2))
            Zestawienie.Cells(Ost_zest + 1, 2) = Mid(IiN, InStr(IiN, "(") + 1, Len(Mid(IiN, InStr(IiN, "(") + 1)) - 1)  'Imię i nazwisko
            Zestawienie.Cells(Ost_zest + 1, 3) = CDate(DaneP.Cells(i, 4))                                               'Data
            Zestawienie.Cells(Ost_zest + 1, 4) = Round(CDbl(DaneP.Cells(i, 5)), 2)                                      'Ilość h
            Zestawienie.Cells(Ost_zest + 1, 5) = DaneP.Cells(3, 4)                                                      'Projekt
            Zestawienie.Range("F" & Ost_zest + 1).FormulaR1C1 = "=Month(RC[-3])"                                        'Miesiąc
            Ost_zest = Ost_zest + 1
    Next i

    Arkusz.Close savechanges:=False
    nazwa_pliku = Dir()
Loop

ActiveWorkbook.Save

Application.ShowWindowsInTaskbar = True
Application.ScreenUpdating = True

MsgBox "Zakończono aktualizację pliku"

End Sub

Dziękuję za wszelkie próby pomocy, temat do zamknięcia.
Pozdrawiam

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.