Jak z VBA wywołać okno dialogowe do pobrania nazwy pliku od użytkownika

Pod Excelem można to zrobić na dwa sposoby:
Korzystając z biblioteki Office (funkcja bardzo podobna do WskazFolder):

Function WskazPlik(TytulOkna As String, TytulPrzycisku As String) As String
    Dim Okno As FileDialog
    Dim Wybrane As String
    Set Okno = Application.FileDialog(msoFileDialogFilePicker)
    Okno.Title = TytulOkna
    Okno.ButtonName = TytulPrzycisku
    If Okno.Show = -1 Then
        WskazPlik = Okno.SelectedItems(1)
    End If
End Function

Lub korzystając z metody Excela:

Function WskazPlik_MetodaExcel() As String
    WskazPlik_MetodaExcel = Excel.Application.GetOpenFilename()
End Function

Pierwsza funkcja jest nieco bardziej skomplikowana ale bardziej uniwersalna, druga jest skrajnie prosta i nie wymaga niczego poza Excelem. Oczywiście obie można rozbudować o możliwość filtrowania plików…

W komentarzach znajduje się dyskusja na temat konstrukcji wiążącej With..End With

  1. Zawsze mnie zastanawia, dlaczego używając zmiennych obiektowych ludzie nie skracają sobie sięgania do właściwości obiektów przez „Width”?

    [cc lang=”vb”]
    Function WskazPlik(TytulOkna As String, TytulPrzycisku As String) As String
    Dim Okno As FileDialog
    Dim Wybrane As String
    Set Okno = Application.FileDialog(msoFileDialogFilePicker)
    With Okno
    .Title = TytulOkna
    .ButtonName = TytulPrzycisku
    If .Show = -1 Then
    WskazPlik = .SelectedItems(1)
    End If
    End With
    End Function
    [/cc]

  2. po pierwsze z lenistwa
    po drugie akurat w tym wypadku chyba to moje jest czytelniejsze, ale to oczywiście kwestia dyskusyjna
    po trzecie – zdarzają się błędy użycia np With Selection, gdzie w konstrukcji With obiekt jest przedefiniowany, np:
    [cc lang=”vb”]
    Sub NieprawidloweUzycieWith()
    With Selection
    .Font.ColorIndex = 33
    .CurrentRegion.Select
    .Font.ColorIndex = 34
    End With
    End Sub
    [/cc]

    • no ale właśnie .SelectedItems(1) to jest wprost nazwa pliku wskazanego w oknie przez uzytkownika, i właśnie ona jest zwracana przez funkcję
      Chyba, że chodzi o samą nazwę pliku a nie pełną (bez foldera), to wtedy oczywiście trzeba użyć funkcji tekstowych np InStrRev, aby odnaleźć ostatni ukośnik, a potem mid, jak najbardziej 🙂

  3. Dlaczego ta funkcja nie działa w Outlooku (2010)? Po wywołaniu dostaję komunikat:
    „Run-time error 438
    Object doesn`t support this property or method”.

    Pozdrawiam!
    Wojtek

  4. Chyba nikt tu nie odpisuje na komentarze?;)

    Przygotowuję formularz w Outlooku, który będzie wysyłał wiadomość na zawsze ten sam adres. Będzie miejsce na dodanie komentarza, ale najistotniejszym elementem będzie możliwość dodawania załączników. Stąd konieczność użycia okna dialogowego wskazującego plik. I tu pojawia się problem. Powyższy kod działa w Word, Excel i pewnie innych programach pakietu Office, ale w Outlook wywala powyższy błąd. Czy ktoś jest w stanie pomóc mi rozwiązać ten problem?

  5. a jak zrobić aby otworzyło domyślnie katalog z lokalizacji sieciowej gdzie trzeba wskazać dany plik.
    Od razu informuje ze zasób nie może być zmapowany gdyż nie ma uprawnień na koncie użytkownika do mapowania.

  6. Pingback: Top 46 Vba Okno Dialogowe Otwórz Plik Best 87 Answer

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *