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