Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Excel VBA - prosta obsluga bledow, ale nie dla mnie

325 views
Skip to first unread message

zbiniek

unread,
Jan 18, 2005, 9:28:26 AM1/18/05
to
Witam!

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

Tajan

unread,
Jan 19, 2005, 1:55:25 AM1/19/05
to
Witam!

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

Blazey

unread,
Jan 19, 2005, 2:25:27 AM1/19/05
to
zbiniek napisał(a):

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

zbiniek

unread,
Jan 19, 2005, 4:06:55 AM1/19/05
to
Witam serdecznie!

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

Tajan

unread,
Jan 19, 2005, 4:43:49 AM1/19/05
to

Witam!

> 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

zbiniek

unread,
Jan 19, 2005, 5:07:50 AM1/19/05
to
Witam!

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

pxd74

unread,
Jan 19, 2005, 9:58:32 AM1/19/05
to
Użytkownik Blazey <berd...@poczta.fm> w wiadomości do grup dyskusyjnych
napisał:csl22a$6e6$1...@atlantis.news.tpi.pl...

> 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

Tajan

unread,
Jan 19, 2005, 8:35:57 AM1/19/05
to
Witam!

> ' 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

zbiniek

unread,
Jan 19, 2005, 9:01:52 AM1/19/05
to
Witam!

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

Tajan

unread,
Jan 19, 2005, 9:18:45 AM1/19/05
to

Witam!

(.....)

(....)

Z tego bardzo istotny jest cytat:
Microsoft does not guarantee that they will be available in future releases
of Visual Basic


Tajn

zbiniek

unread,
Jan 19, 2005, 9:34:42 AM1/19/05
to
Witam ponownie!

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

Tajan

unread,
Jan 20, 2005, 1:25:06 AM1/20/05
to
Witam!
(....)

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?
(....)

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

zbiniek

unread,
Jan 20, 2005, 3:19:20 AM1/20/05
to
Witam!

>
> 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

Tajan

unread,
Jan 20, 2005, 3:28:55 AM1/20/05
to
Witam!

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

pxd74

unread,
Jan 20, 2005, 6:28:13 AM1/20/05
to
Użytkownik Tajan <ta...@interia.pl> w wiadomości do grup dyskusyjnych
napisał:csnq46$cpl$1...@news.onet.pl...
> Witam!

> 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

Tajan

unread,
Jan 20, 2005, 4:41:10 AM1/20/05
to
Witam!

(....)


> 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

0 new messages