Bez Was jednak sie nie obejdzie!!
Mam takie makro, ktore po podaniu nazwy pliku otwiera ten plik:
Option Explicit
Sub Plik()
Dim Sciezka As String
Dim NazwaPliku As String
Dim NazwaPlikuZeSciezka As String
Application.DisplayAlerts = False
' okreslenie biezacej sciezki
Sciezka = ThisWorkbook.path & "\"
TenPlik = ThisWorkbook.Name
' podanie nazwy pliku do otwarcia
NazwaPliku = InputBox("Podaj nazwe pliku:", Default:="adresy
050115.xls")
' jesli nie podano nazwy to wyjdz
If NazwaPliku = "" Then Exit Sub
NazwaPlikuZeSciezka = Sciezka & NazwaPliku
If CzyJestPlik(NazwaPlikuZeSciezka) = True Then
MsgBox "Znaleziono... Nastapi otwarcie"
'otwiera NazwaPliku w biezacej lokalizacji
Workbooks.Open FileName:=ThisWorkbook.path & "\" & NazwaPliku
'wpisuje do B2 NazwaPliku
Worksheets("Arkusz1").Range("B2").Value = NazwaPliku
Else
MsgBox "W biezacym katalogu nie znaleziono szukanego pliku: "
& _ NazwaPliku
End If
Application.DisplayAlerts = True
End Sub
Function CzyJestPlik(nazwa) As Boolean
CzyJestPlik = Dir(nazwa) <> ""
End Function
Jednak mam maly problemik z obsluga bledow, a mianowicie: w momencie
gdy nie podam nazwy i wcisne [Enter] lub wcisne od razu [Cancel], to
program sie konczy. A taka forma nie konca mi odpowiada - brak
informacji o nie wpisaniu nazwy pliku do otwarcia. Chcialbym, aby
wygladalo to mniej wiecej tak:
a) jesli wcisne [Cancel], to zakoncz,
b) jesli nie podam nazwy, a wcisne [Enter], to komunikat "Nie podano
nazwy pliku do otwarcia",
c) jesli podam nazwe i wcisne [Enter], to CzyJestPlik:
- jesli True, to otworz itd,
- jesli False, to komunikat "W biezacym katalogu nie znaleziono
szukanego pliku: " & NazwaPliku.
Jak widac pkt c) mam zrobiony, a) czesciowo, a b) nie.
Licze na Wasza pomoc
Dzieki i pzdr
Zbiniek
W takim przypadku zamiast funkcji InputBox lepiej uzyc metody
Application.InputBox, gdyz zwraca ona wartosc False, w przypadku gdy
nacisnieto ESC lub "krzyzyk".
Twoja funkcja moze wtedy wygladac tak:
Sub Plik()
Dim Sciezka As String
Dim NazwaPliku As Variant
Dim NazwaPlikuZeSciezka As String
Dim NazwaDefault As String
Application.DisplayAlerts = False
' okreslenie biezacej sciezki
Sciezka = ThisWorkbook.Path & "\"
TenPlik = ThisWorkbook.Name
' podanie nazwy pliku do otwarcia
NazwaPliku = ""
NazwaDefault = "adresy050115.xls"
Do While NazwaPliku = ""
NazwaPliku = Application.InputBox("Podaj nazwe pliku:", _
Default:=NazwaDefault)
If TypeName(NazwaPliku) = "Boolean" Then Exit Sub
If NazwaPliku <> "" Then
NazwaPlikuZeSciezka = Sciezka & NazwaPliku
If Dir(NazwaPlikuZeSciezka) = "" Then
MsgBox "W biezacym katalogu nie znaleziono" & _
"szukanego pliku: " & NazwaPliku
NazwaDefault = NazwaPliku
NazwaPliku = ""
End If
End If
Loop
'otwiera NazwaPliku w biezacej lokalizacji
Workbooks.Open FileName:= NazwaPlikuZeSciezka
'wpisuje do B2 NazwaPliku
Worksheets("Arkusz1").Range("B2").Value = NazwaPliku
Application.DisplayAlerts = True
End Sub
Jak widzisz, pracuje ona w petli do chwili podania poprawnej nazwy pliku lub
nacisniecia Esc.
Powodzenia
Tajan
Funkcja inputbox nie daje mozliwosci wyroznienia, czy mamy do czynienia
ze zdarzeniem z przycisku anuluj czy ok, funkcja zwraca pusty ciag, w
przypadku nie wprowadzenia danych lub anulowania.
Masz kilka rozwiazan:
1. dla offica 97 cos musisz wlaczyc cos w dodatkach, (teraz nie pamietam
ale jak znajde to dam znac.)
stala = "c:\tmp\lista.xls"
With Application.FileDialog(msoFileDialogOpen)
.AllowMultiSelect = False
.InitialFileName = stala
.Show
End With
2.
fileToOpen = Application.GetOpenFilename("Text Files (*.xls), *.xls", ,
, , False)
If VarType(fileToOpen) = 11 Then
'...
End If
sa to standardowe okienka otwierania plikow.
w tych dwoch przypadkach nie pozwoli Ci na zamkniecie formularza
przyciskiem Otworz jezeli nie wybrano nazwy, lub podano nazwe pliku,
ktory nie istnieje.
3. stworzyc wlasny formularz, w ktorzym wedlug uznania mozesz
oprogramowac przycisk Ok i Anuluj i to jest najblizsze twojej koncepcji.
pozdrawiam
No i dzieki za odpowiedzi.
Skorzystam raczej z rozwiazania Tajana - przyklad dziala rewelacyjnie.
Zmienilem jedynie wyjscie z petli w przypadku nie znalezienia pliku -
po prostu makro konczy prace.
Rozwiazanie Blazeya przetestuje pozniej.
Mam tylko jedno pytanie. Ja korzystam z Office'a 2003 i metoda
Application.InputBox jest tam dostepna. Makro, ktore pisze, byc moze
bedzie uzywane w starszych wersjach Office'a. I wlasnie nie wiem czy
metoda ta rowniez jest dostepna w tych wersjach?
pzdr
Zbiniek
> Mam tylko jedno pytanie. Ja korzystam z Office'a 2003 i metoda
> Application.InputBox jest tam dostepna. Makro, ktore pisze, byc moze
> bedzie uzywane w starszych wersjach Office'a. I wlasnie nie wiem czy
> metoda ta rowniez jest dostepna w tych wersjach?
>
Jest dostepna od Excela 97 wzwyz !
W Excel 95 pewnie tez, ale nie mam gdzie sprawdzic.
Tajan
Nie spodziewalem sie tak szybkiej reakcji - dotychczas odpowiedz
przychodzila na drugi dzien. Wersja 95 raczej mnie nie interesuje -
chyba juz nikt tego nie uzywa.
Jeszcze raz serdecznie dziekuje i zapewne "do uslyszenia".
pzdr
Zbiniek
> Funkcja inputbox nie daje mozliwosci wyroznienia, czy mamy do czynienia
> ze zdarzeniem z przycisku anuluj czy ok, funkcja zwraca pusty ciag, w
> przypadku nie wprowadzenia danych lub anulowania.
Tutaj się mylisz :-)
Dla zainteresowanych:
Istnieje możliwość określenia czy użytkownik wcisnął OK czy Anuluj
NazwaPliku = InputBox("Podaj nazwe pliku:", Default:="adresy 050115.xls")
' jesli nie podano nazwy to wyjdz
If StrPtr(NazwaPliku) = 0 Then Exit Sub
--
Pozdrowienia
pxd74
> ' jesli nie podano nazwy to wyjdz
> If StrPtr(NazwaPliku) = 0 Then Exit Sub
Sprawdziles, od której wersji Excela jest dostępna funkcja StrPtr ?
W 97 i 2000 jej nie ma.
Tajan
To bardzo ciekawe rozwiazanie. Rozwijajac temat podaje co znalazlem w
necie na ten temat:
1. http://www.republika.pl/bbastek/vbcpp/vbcpp.htm
"StrPtr jest nieudokumentowaną funkcją Visual Basic'a i zwraca
znacznik początku ciągu znaków."
2. http://www.access.vis.pl/af0812.htm
"12. Funkcja InputBox - jak wykryć, że naciśnięto Anuluj?
Metodę podał Krzysztof Naworyta (k.naw...@datacomp.com.pl).
Wydaje się, że tematu jeszcze nie było, a skoro wygrzebałem:
a = InputBox("Wpisz coś")
if a = "" then
Msgbox "Uzytkownik nacisnął Anuluj albo nic nie wpisał i
nacisnął OK"
End if
No właśnie - "pusty" OK i Anuluj dają taki sam efekt (i zwykle to
wystarcza, bo nikt nie oczekuje, że "" ma coś znaczyć). A jednak ...
wyobraźmy sobie, że wyzwalamy serię InputBox, gdzie "" znaczy "weź
pusty i idź dalej" a "anuluj" znaczy "przerwij przerabianie" ...
Rozwiązanie:
Private Sub Command1_Click()
Dim s As String
s = InputBox("Wpisz coś")
If StrPtr(s) Then
Msgbox "wpisano: """ & s & """"
Else
Msgbox "Wciśnięto Anuluj"
End If
End Sub
Opis StrPtr() i innych:
http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q199824
KN"
pzdr
Zbiniek
(.....)
Opis StrPtr() i innych:
http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q199824
(....)
Z tego bardzo istotny jest cytat:
Microsoft does not guarantee that they will be available in future releases
of Visual Basic
Tajn
U mnie w Office 2003 jest i działa.
Piszac, ze w 97 i 2000 jej nie ma masz na mysli, ze nie ma helpa do
niej, czy ze nie dziala?
pzdr
Zbiniek
W 97 i 2000 pewnie tez jest, ale nieudokumentowana (nigdy nie mialem
potrzeby jej wykorzystania). Natomiast, jezeli jest w 2003, to wcale nie
znaczy, ze bedzie np. w 2005 :-)
Tajan
>
> W 97 i 2000 pewnie tez jest, ale nieudokumentowana (nigdy nie mialem
> potrzeby jej wykorzystania). Natomiast, jezeli jest w 2003, to wcale
nie
> znaczy, ze bedzie np. w 2005 :-)
>
> Tajan
Mi chodzi o to czy na pewno jest w starszych wersjach Office'a. Boje
sie, ze piszac makro w Office 2003 nie bedzie ona dzialac w starszych
wersjach (nie mam mozliwosci sprawdzenia tego), a do konca nie wiem
jaka wersje maja koncowi uzytkownicy. Jak wspomnialem u mnie funkcja ta
dziala, ale oczywiscie nie jest udokumentowana.
Moze uzytkownicy innych wersji to sprawdza!
pzdr
Zbiniek
W 97 dziala, wiec w innych wersjach na pewno też. Tylko nie rozumiem, po co
masz stosowac tego typu rozwiazanie, skoro Application.InputBox zalatwia to
bez takich "kombinacji alpejskich". Sporo juz lat programuje w VBA i nigdy
nie zdarzylo mi sie aby funkcji typu StrPtr mi brakowalo.
Tajan
> W 97 dziala, wiec w innych wersjach na pewno też. Tylko nie rozumiem, po
co
> masz stosowac tego typu rozwiazanie, skoro Application.InputBox zalatwia
to
> bez takich "kombinacji alpejskich". Sporo juz lat programuje w VBA i nigdy
> nie zdarzylo mi sie aby funkcji typu StrPtr mi brakowalo.
Podałem to rozwiązanie jako ciekawostkę.
Czasami ktoś może chcieć programować w VBA dla Corela czy AutoCada albo w
prawdziwym VB a tam niestety nie będzie można wykorzystać
Application.InputBox.
W dodatku funkcja StrPtr jest składową języka VBA. Ostatnia wersja VBA to
bodajże 6.3, a wyższej na pewno nie będzie - nadchodzi era języka VB.Net, a
to zmienia całkowicie podejście do programowania. Swoją drogą ciekaw jestem
kiedy Edytor VB.Net będzie dostępny w pakiecie Office'a.
--
Pozdrowienia
pxd74
(....)
> W dodatku funkcja StrPtr jest składową języka VBA. Ostatnia wersja VBA to
> bodajże 6.3, a wyższej na pewno nie będzie - nadchodzi era języka VB.Net,
a
> to zmienia całkowicie podejście do programowania. Swoją drogą ciekaw
jestem
> kiedy Edytor VB.Net będzie dostępny w pakiecie Office'a.
(....)
Wydaje mi sie, ze Mirosoft zastosuje jakies mechnizmy pozwalające na
uruchamianie kodu VBA równolegle z VB.Net. Zauwaz, ze nadal w Excelu mozna
uruchamiac makra Excel 4.
Ale wtedy StrPtr moze juz nie byc dostepna :-)
Tajan