Kategorie szkoleń | Egzaminy | Kontakt
  • 1
  • 2
  • 152

Posiadam arkusz Excel z obliczeniami, które wykonywane są na dużej tabeli (do 100 tys. rekordów). Poszczególne zakładki stanowią podsumowania i wykresy, które wyliczane są z zakładki z danymi.

Polecono mi stworzyć kilkanaście baz z tymi samymi obliczeniami, jednak zakładka z danymi (w tym samym formacie) będzie zawierała inne dane. Wiem, że wygodne byłoby oddzielenie danych od części analitycznej Excela. Dane te muszą jednak istnieć w zakładce, ponieważ makra w poszczególnych zakładkach włączają filtr. Chciałbym również, aby po zakończeniu pracy arkusz był kopiowany i zapamiętywany w zewnętrznym pliku, źródle danych.

Jak w prosty i efektywny sposób wykonać w VBA ładowanie i podmienianie danych w takiej zakładce danych z innego arkusza. Excel zawierającego tylko dane?  Czy wystarczy stworzyć makro, które skopiuje do aktywnego skoroszytu zakładkę z danymi, a następnie po zakończeniu pracy skopiuje je z powrotem do zewnętrznego pliku?

Pozdrawiam serdecznie.
Jacek Kotowski.

Jacek_Kotowski
  • Zapytał
  • @ Jacek_Kotowski | 21.07.2014
    • lider
    • laureat
    • ekspert
    • 60
    • 54
    • 94

Odpowiedź (1)

  • 5

Witajcie.

Nie ma odpowiedzi. Ja w tym czasie szukałem różnych rozwiązań i chciałbym rozszerzyć moje pytanie.

Na razie moje rozwiązanie wygląda następująco:

Private Sub Workbook_Open()
    On Error Resume Next
    Application.DisplayAlerts = False


Ustalam, gdzie jest podłączany plik bazy:
 
    x = ActiveWorkbook.Path & "\Baza.xlsx"


Na wszelki wypadek usuwam zakładkę Baza w dokumencie głównym:

    Workbooks("Master.xlsm").Sheets("Baza").Delete


Otwieram plik, z którego skopiuję zawartość do zakładki Baza:

    Workbooks.Open (x)

Kopiuję bazę do dokumentu głównego, do zakładki Baza:

    Workbooks("Baza.xlsx").Sheets("Baza").Copy Before:=Workbooks("Master.xlsm").Sheets(1)

Zamykam bazę:
 
    Workbooks("Baza.xlsx").Close SaveChanges:=False
   
'  Kill x (zastanawiałem się, czy nie trzeba zamknąć procesu)
 
 
  Application.DisplayAlerts = True

End Sub


Private Sub Workbook_BeforeClose(Cancel As Boolean)
        Dim x As String
        On Error Resume Next
        Application.DisplayAlerts = False
 
       
        x = ActiveWorkbook.Path & "\Baza.xlsx"
          
        Application.DisplayAlerts = False


Zapisuję backup bazy, ponieważ użytkownik mógł dokonać zmian:

     Workbooks("Baza.xlsx").Close SaveChanges:=False
        Name x As x & "_bkp_" & Format(Date + Time, "yyMMdd_hhMMss")
 
        With Workbooks("Master.xlsm").Sheets("Baza")

            .SaveAs ActiveWorkbook.Path & "\Baza.xlsx", FileFormat:=xlOpenXMLWorkbook
            .Delete
       
        End With
       
        Workbooks("Baza.xlsx").Close SaveChanges:=False
      
 
    
   
End Sub

Rozwiązanie wstępnie wydaje się działać. Czy Waszym zdaniem można coś ulepszyć?

Czy trzeba to zrobić inaczej? Bardziej efektywnie?

Załączam pliki Master (plik główny) i baza (plik, z którego kopiowane/ładowane są dane do zakładki baza w pliku Master).

Z góry dziękuję za pomoc i wszelkie uwagi,

Jacek.

 

Załączniki

  • xlsm

    Master.xlsm ( 19K )
  • xlsx

    Baza.xlsx ( 9K )
Jacek_Kotowski
  • Odpowiedział
  • @ Jacek_Kotowski | 01.08.2014
    • lider
    • laureat
    • ekspert
    • 60
    • 54
    • 94
Komentarze
No cóż jeżeli działa, to nie ma co się specjalnie męczyć. Ale zadeklarowałbym porządnie wszystkie zmienne, nie tylko x ale i skoroszyt i arkusz.
Skomentował : @ TRENER ALTKOM AKADEMII ,12.01.2015