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
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]
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]
a jak z .SelectedItems(1) pobrać nazwe pliku?
pomijając Mid()
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 🙂
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
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?
dodaj referencję do biblioteki Microsoft Office
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.
można spróbować użyć polecenia ChDir
Pingback: Top 46 Vba Okno Dialogowe Otwórz Plik Best 87 Answer