Czyli trochę o “zabijaniu” plików
Naszym celem jest to, aby za każdym razem, gdy będziemy zamykać plik – zapisywał się on pod nazwą wskazaną w jednej z komórek arkusza. Formatka zawiera więc tylko tę komórkę, która zawiera przyszłą nazwę pliku:

Formatka
Komórkę tę warto nazwać, aby ułatwić namierzanie jej w kodzie VBA, bo taki właśnie będziemy pisać, aby rozwiązać to zadanie. Komórkę nazwałam jako “Komorka” i takiego odwołania do niej będę używała dalej (tutaj, w sekcji Nazywanie komórek, dowiesz się jak nazywać komórki).
Rozwiązanie będzie bazowało na zdarzeniu skoroszytu BeforeClose. Tworzenie zdarzenia skoroszytu (Workbook) opisałam tutaj. W naszym przypadku trzeba będzie tylko wybrać zdarzenie BeforeClose.
Teraz już czas na kod.
Potrzebujemy 3 zmiennych:
- NowaNazwa
- Sciezka
- StaraNazwa
Wszystkie tekstowe, czyli typu String.
Czemu akurat takie? Ponieważ nasze makro będzie działało tak, że przed zamknięciem pliku zapisze go pod nową nazwą (opcja: zapisz jako), a następnie stary plik usunie. Usuwanie oczywiście można pominąć, jeśli chcemy tworzyć backup poprzednich plików – ja osobiście bym tak wolała. Będzie to kwestia jednej linijki kodu i to, czy ją pisać czy nie, zostawię Tobie, drogi Czytelniku :).
Żeby to zapisywanie (w odpowiednim miejscu!) i usuwanie działało, należy znać starą nazwę (aby wiedzieć, co usuwać), nową nazwę – żeby wiedzieć jak nazwać nowy plik, i ścieżkę, aby wiedzieć gdzie to wszystko ma się dziać (oczywiście w bieżącym folderze).
Mamy więc deklarację zmiennych i przypisywanie do nich wartości:
Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim NowaNazwa As String, Sciezka As String, StaraNazwa As String StaraNazwa = ThisWorkbook.Name NowaNazwa = Dane.Range("Komorka") & ".xlsm" Sciezka = ThisWorkbook.Path & "\" End Sub
W sytuacji, gdy nowy i stary plik mają tę samą nazwę (zakładam, że może się zdarzyć taka sytuacja) – nie będziemy wykonywać żadnej operacji, ponieważ nazwa pliku jest poprawna. Przerwiemy wtedy działanie makra. Robi to poniższa linijka:
If NowaNazwa = StaraNazwa Then Exit Sub
Jeśli jednak nazwy się różnią (o to w sumie chodzi), zostaje teraz już zapisanie pliku pod nową nazwą (Zapisz jako):
ThisWorkbook.SaveAs Sciezka & NowaNazwa
… i skasowanie poprzedniego pliku (jeśli nie chcesz kasować – tej linijki nie pisz):
Kill Sciezka & StaraNazwa
Śmieszna instrukcja, prawda? 🙂 Tylko uwaga! Bardzo niebezpieczna, ponieważ ona po prostu usuwa plik z dysku! BTW: dlatego też w pliku do pobrania, który znajdziesz pod koniec artykuły, w kodzie nie ma tej linijki, aby Twój antywirus nie zablokował pobierania ;). Bezpieczeństwo przede wszystkim!
Jeszcze do tego kodu warto dodać wyłączanie komunikatów np. o nadpisaniu pliku (gdy nowy i stary mają tę samą nazwę). Wszystko razem wygląda tak:
Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim NowaNazwa As String, Sciezka As String, StaraNazwa As String StaraNazwa = ThisWorkbook.Name NowaNazwa = Dane.Range("Komorka") & ".xlsm" Sciezka = ThisWorkbook.Path & "\" If NowaNazwa = StaraNazwa Then Exit Sub Application.DisplayAlerts = False ThisWorkbook.SaveAs Sciezka & NowaNazwa Kill Sciezka & StaraNazwa Application.DisplayAlerts = True End Sub
PS W każdym miejscu tego kodu, gdzie występuje ThisWorkbook, można użyć słówka kluczowego me. W tym przypadku będzie ono oznaczało to samo.
Wrzucam jeszcze screen edytora – zwróć szczególną uwagę na zaznaczone fragmenty:

Kod w edytorze
MalinowyExcel Zapisz plik pod nazwą wskazaną w komórce VBA dw.zip
I wideo:
(pojawi się wkrótce)