Quantcast
Channel: Malinowy Excel
Viewing all articles
Browse latest Browse all 291

Zapisz plik pod nazwą wskazaną w komórce (VBA)

$
0
0

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

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:

  1. NowaNazwa
  2. Sciezka
  3. 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

Kod w edytorze

Mam nadzieję, że opisane powyżej makro ułatwi Ci pracę. Jeśli znajdziesz w nim wartość – miło mi będzie, jak udostępnisz ten wpis innym. Może im też się przyda? Może spędzili dużo czas i przeszukali pół Internetu, żeby znaleźć takie rozwiązanie? A może tak było w Twoim przypadku, to wiesz o co chodzi 😉 Tym bardziej więc udostępnij proszę ten wpis! Razem możemy im ułatwić innym życie 🙂
A oto plik do pobrania (nie zawiera instrukcji kasującej plik!):
MalinowyExcel Zapisz plik pod nazwą wskazaną w komórce VBA dw.zip

I wideo:

(pojawi się wkrótce)

 

 

 


Viewing all articles
Browse latest Browse all 291

Trending Articles


TRX Antek AVT - 2310 ver 2,0


Автовишка HAULOTTE HA 16 SPX


POTANIACZ


Zrób Sam - rocznik 1985 [PDF] [PL]


Maxgear opinie


BMW E61 2.5d błąd 43E2 - klapa gasząca a DPF


Eveline ➤ Matowe pomadki Velvet Matt Lipstick 500, 506, 5007


Auta / Cars (2006) PLDUB.BRRip.480p.XviD.AC3-LTN / DUBBING PL


Peugeot 508 problem z elektroniką


AŚ Jelenia Góra