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

9 myśli w temacie “Jak z VBA wywołać okno dialogowe do pobrania nazwy pliku od użytkownika

  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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *