Pobranie nazwy pliku – funkcja InStrRev lub Split lub DIR

Omówimy sposób pobierania nazwy pliku ze ścieżki z wykorzystaniem różnych opcji.

W ostatnim wpisie poruszyliśmy kwestię pobierania ścieżki za pomocą metod: GetOpenFilename oraz GetSaveAsFilename, ale co zrobić jeśli następnie chcemy pobrać samą nazwę pliku?

Link do poprzedniego wpisu: https://heap.pl/pobieranie-sciezki-pliku/

Istnieje kilka możliwości, aby pobrać nazwę pliku ze ścieżki. Proponowane przeze mnie w tym wpisie to:

1) użycie funkcji InStrRev, wyszukanie za jej pomocą ukośnika (ostatniego od prawej strony)
2) wykorzystanie funkcji Split (podział po ukośnikach) a następnie znalezienie ostatniego elementu
3) użycie funkcji DIR

W naszym przykładzie wpisaliśmy ścieżkę do pliku postaci: „C:\Users\Documents\makro\makro.xlsx”.


1) – użycie funkcji InStrRev

Sub PobierzNazwePliku()
    Dim NazwaPliku As String
    Dim Sciezka As String
    Sciezka = "C:\Users\Documents\makro\makro.xlsx"
    NazwaPliku = Right(Sciezka, Len(Sciezka) - InStrRev(Sciezka, "\"))
End Sub

Funkcja Right() zwraca określoną liczbę znaków od końca ciągu tekstowego. Jako argument podajemy ścieżkę, oraz wykorzystujemy funkcję InStrRev, aby określić liczbę znaków od prawej strony. InStrRev zwraca pozycję na której znajduje się ostatni ukośnik.

Jeśli chcemy usunąć rozszerzenie, to wystarczy użyć funkcji Mid()

Sub PobierzNazwePliku()
    Dim NazwaPliku As String
    Dim Sciezka As String
    Sciezka = "C:\Users\Documents\makro\makro.xlsx"
    NazwaPliku = Mid(Sciezka, InStrRev(Sciezka, "\") + 1, InStrRev(Sciezka, ".") - InStrRev(Sciezka, "\") - 1)
End Sub


opcja 2) – wykorzystanie funkcji Split

Funkcja VBA Split jest funkcją rozdzielającą łańcuch znaków.

Argumenty wejściowe Split() to:

  • Expression – wyrażenie do rozdzielenia
  • Delimiter – separator – znak rozdzielający (argument opcjonalny, wartość domyślna to spacja).
  • Limit – ilość pojedynczych łańcuchów wydzielonych z wyrażenia. Argument opcjonalny (wartość domyślna -1, zwracając wszystkie).
  • Compare – tryb porównania ciągów. Dla porównania tekstowego – wartość 1. (dla wartości domyślnej 0 – porównanie binarne).

Funkcja zwraca wartość tablicową. Poszczególne elementy tablicy indeksowane są począwszy od wartości. Podobny efekt jak funkcja

Zwracana przez funkcję Split wartość jest wartością tablicową. Poszczególne elementy są indeksowane począwszy od wartości zero.

Sub PobierzNazwePliku()
    Dim NazwaPliku As String
    Dim TabElementy() As String
    Dim Sciezka As String
    Sciezka = "C:\Users\Documents\makro\makro.xlsx"
    
    TabElementy() = Split(Sciezka, "\")
    NazwaPliku = TabElementy(UBound(TabElementy()))
End Sub

W powyższym przykładzie funkcja split() rozdziela ścieżkę po ukośniku. W efekcie zwraca nam tablicę, gdzie ostatnim elementem jest nazwa pliku wraz z rozszerzeniem. Dlatego użyliśmy polecenia Ubound() aby sprawdzić wielkość tablicy i zwrócić jej ostatni element.


opcja 3) – użycie funkcji DIR.

Jest jedną z bardziej popularnych metod, ale nie jest to wcale najlepszy sposób. Dlaczego?
1. Działa wolno, bo zawsze przeszukuje dysk.
2. Plik musi istnieć, aby działała poprawnie.
3. Jest niestabilna (jeśli tworzymy pętlę po wszystkich plikach danego folderu, to takie wywołanie dir zniszczy tę pętle)
4. Nie zadziała poprawnie jeśli plik jest ukryty

Jako argument funkcji Dir wpisujemy ścieżkę do pliku.
Przykład:

Sub PobierzNazwePliku()
    Dim NazwaPliku As String
    NazwaPliku = Dir("C:\Users\Documents\makro\makro.xlsx")
End Sub

Co ważne polecenie Dir zwróci nazwę pliku wraz z rozszerzeniem tylko wtedy gdy plik istnieje w podanym katalogu. Dlatego aby powyższy przykład zadziałał musimy najpierw stworzyć plik makro.xlsx w katalogu makro (C:\Users\Documents\makro\). Wtedy funkcja zwróci łańcuch marko.xlsx. Jeżeli plik nie istnieje lub w podanej ścieżce jest błąd to funkcja zwróci pusty łańcuch znaków.

Przykład z poprzedniego wpisu
Link do poprzedniego wpisu: https://heap.pl/pobieranie-sciezki-pliku/

Poniżej prezentujemy przykład z poprzedniego wpisu, ale tym razem dodamy linijkę gdzie wykorzystany będzie sposób 1 aby pobrać nazwę pliku.

Sub PobierzNazwePliku4()
    Dim NazwaPliku As Variant
    Dim FileFilter  As String
    Dim FilterIndex  As Integer
    Dim Title As String
    
    FileFilter = "Pliki Excel (*.xlsx;*.xls),*xlsx;*.xls," & _
    "Pliki Excel XLSX (*.xlsx),*.xlsx," & _
    "Pliki Excel 97-2003 (*.xls),*.xls," & _
    "Wszystkie pliki (*.*),*.*"
    
    FilterIndex = 4 'Wybieramy domyślny filtr. 4 oznacza że domyślnie wybieramy filtr Wszystkie pliki (*.*)
    Title = "Otwórz plik Excela"
    
    NazwaPliku = Application.GetOpenFilename(FileFilter, FilterIndex, Title)
    
    'Wyświetlenie  MessageBox, jeśli w oknie dialogowym zostanie naciśnięty przycisk Anuluj
    If NazwaPliku = False Then
        MsgBox "Nie wybrano żadnego plikU."
        Exit Sub
    End If
    
    NazwaPliku = Right(NazwaPliku, Len(NazwaPliku) - InStrRev(NazwaPliku, "\"))
End Sub

To tyle na dziś. 🙂

20 października 2015