Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
Set II, ByRef/ByVal, Tablice dynamiczne,błędy i zewnętrzne pliki
Rafał Zduńczyk
Programowanie arkuszy kalkulacyjnych2019
Po co jest Set?
Po co jest Set?Napiszemy program, który
1.
2.
3.
4.
Po co jest Set?Napiszemy program, który
1. zapamiętuje zaznaczoną komórkę
2.
3.
4.
Po co jest Set?Napiszemy program, który
1. zapamiętuje zaznaczoną komórkę
2. daje użytkownikowi wybrać wektor przesunięcia
3.
4.
Po co jest Set?Napiszemy program, który
1. zapamiętuje zaznaczoną komórkę
2. daje użytkownikowi wybrać wektor przesunięcia
3. zaznacza nową komórkę i pokazuje w MsgBoksie jej adres
4.
Po co jest Set?Napiszemy program, który
1. zapamiętuje zaznaczoną komórkę
2. daje użytkownikowi wybrać wektor przesunięcia
3. zaznacza nową komórkę i pokazuje w MsgBoksie jej adres
4. pozwala użytkownikowi wybrać powrót do starej komórki
Po co jest Set?Napiszemy program, który
1. zapamiętuje zaznaczoną komórkę
2. daje użytkownikowi wybrać wektor przesunięcia
3. zaznacza nową komórkę i pokazuje w MsgBoksie jej adres
4. pozwala użytkownikowi wybrać powrót do starej komórki
Użyjemny własności address, która ma następujące argumenty:
Po co jest Set?Napiszemy program, który
1. zapamiętuje zaznaczoną komórkę
2. daje użytkownikowi wybrać wektor przesunięcia
3. zaznacza nową komórkę i pokazuje w MsgBoksie jej adres
4. pozwala użytkownikowi wybrać powrót do starej komórki
Użyjemny własności address, która ma następujące opcjonalne argumenty:
• RowAbsolute, dolar przed wierszem (:=True/False)
• ColumnAbsolute, dolar przed kolumną (:=True/False)
Po co jest Set?Napiszemy program, który
1. zapamiętuje zaznaczoną komórkę
2. daje użytkownikowi wybrać wektor przesunięcia
3. zaznacza nową komórkę i pokazuje w MsgBoksie jej adres
4. pozwala użytkownikowi wybrać powrót do starej komórki
Użyjemny własności address, która ma następujące opcjonalne argumenty:
• RowAbsolute, dolar przed wierszem (:=True/False)
• ColumnAbsolute, dolar przed kolumną (:=True/False)
• ReferenceStyle, domyślnie xlA1, inna możliwość xlR1C1 bez cudzysłowu!
• External, zewnętrzny, czyli z nazwą skoroszytu i arkusza (:=True/False)
• RelativeTo, względem komórki, np. RelativeTo:=Worksheets(1).Cells(3, 3)
Po co jest Set?Napiszemy program, który
1. zapamiętuje zaznaczoną komórkę
2. daje użytkownikowi wybrać wektor przesunięcia
3. zaznacza nową komórkę i pokazuje w MsgBoksie jej adres
4. pozwala użytkownikowi wybrać powrót do starej komórki
Sub testset()Dim old As Range, new1 As Range, r As Integer, c As IntegerSet old = Selectionr = InputBox("Ile wierszy?")c = InputBox("Ile kolumn?")Set new1 = old.Offset(r, c)new1.SelectIf MsgBox(new1.Address & ": Wracamy? ", vbYesNo) = vbYes Then old.Select: _MsgBox old.Address & " selected"End Sub
Sub z parametramiSub imieplusnazwisko(imie As String, nazwisko As String)Dim result As Stringresult = imie + " " + nazwiskoMsgBox resultEnd Sub
Sub pokaz()imieplusnazwisko nazwisko:="Wielki", imie:="Aleksander"End Sub
Własności MsgBox i InputBox z przypisaniem „:=”Sub msg()MsgBox Title:="tytuł", Buttons:=vbExclamation, Prompt:="Nic"End Sub
Sub msg()a = MsgBox(Title:="tytuł", Buttons:=vbExclamation + vbYesNoCancel, Prompt:="Nic")MsgBox Prompt:=aEnd Sub
Funkcje i ByVal/ByRefSub boxes2()Dim x As Longx = InputBox("x=?")MsgBox "squarebyval(x): " & squarebyval(x) & Chr(10) & " x : " & xMsgBox "squarebyref(x): " & squarebyref(x) & Chr(10) & " x : " & xEnd Sub
Function squarebyval(ByVal x As Long)x = x * xsquarebyval = xEnd Function
Function squarebyref(ByRef x As Long)x = x * xsquarebyref = xEnd Function
Domyślnie: ByRef
Suby i ByVal/ByRefSub outer()Dim A As Long, B As LongA = 2B = 3inner X:=A, Y:=BMsgBox "A=" & A & Chr(10) & "B=" & B & Chr(10) & "X=" & X & Chr(10) & "Y=" & YEnd Sub
Sub inner(ByRef X As Long, ByVal Y As Long)X = X + 1Y = Y + 1End Sub
Widać: inner zmieniło A, ale nie zmieniło B. X i Y w ogóle nie są widziane przez outer.Można wymusić ByVal:
Sub outer2()Dim A As Long, B As LongA = 2B = 3inner (A), (B)MsgBox "A=" & A & Chr(10) & "B=" & B & Chr(10) & "X=" & X & Chr(10) & "Y=" & YEnd Sub
Tablice dynamiczneTablica statyczna nie zmienia rozmiaru:
Sub tablica1()Dim ta(1 To 2, 2 To 3) As IntegerFor i = 1 To 2
For j = 2 To 3ta(i, j) = i ^ j
Next jNext iActiveCell.Range("A1:B2") = ta()End Sub
Musi mieć rozmiar podany jako liczbę:
Sub tablica1()Dim m As Integer, n As Integerm = InputBox("Wiersze:")n = InputBox("Kolumny:")Dim ta(1 To m, 1 To n) As Integer...End Sub
Tylko z tablicami dynamicznymi takmożna:
Sub tablica1()Dim ta() As IntegerDim m As Integer, n As Integerm = InputBox("Wiersze:")n = InputBox("Kolumny:")ReDim ta(1 To m, 1 To n) As IntegerFor i = 1 To m
For j = 1 To nta(i, j) = i ^ j
Next jNext iActiveCell.Range(Cells(1, 1), Cells(m, n)) _= ta()End Sub
Trzeba uważać ze zmianą rozmiaru:
Sub tablica1()Dim ta() As IntegerDim m As Integer, n As Integerm = InputBox("Wiersze:")n = InputBox("Kolumny:")ReDim ta(1 To m, 1 To n) As IntegerFor i = 1 To m
For j = 1 To nta(i, j) = i ^ j
Next jNext iReDim ta(1 To m, 1 To n-1)ActiveCell.Range(Cells(1, 1), Cells(m, n)) = ta()End Sub
Zmiana nieostatniego wymiaru tablicySub tablica1()Dim ta() As Double, ta1() As DoubleDim m As Integer, n As Integerm = InputBox("Wiersze:")n = InputBox("Kolumny:")ReDim ta(1 To m, 1 To n) As DoubleFor i = 1 To m
For j = 1 To nta(i, j) = i ^ j
Next jNext iMsgBox "1. ta: m x n"ReDim Preserve ta(1 To m, 1 To n + 1)For i = 1 To mta(i, n + 1) = i ^ (-j)NextMsgBox "2. ta: m x n+1"
ReDim ta1(1 To m + 1, 1 To n + 1)For i = 1 To m
For j = 1 To n + 1ta1(i, j) = ta(i, j)
Next jNext iMsgBox "3. ta1: m x n+1"For j = 1 To n + 1
ta1(m + 1, j) = 10 ^ (-j)NextMsgBox "4. ta1: m+1 x n+1"ReDim ta(1 To m + 1, 1 To n + 1)For i = 1 To m + 1
For j = 1 To n + 1ta(i, j) = ta1(i, j)
Next jNext iMsgBox "5. ta: m+1, n+1"ActiveCell.Range(Cells(1, 1), _Cells(m + 1, n + 1)) = ta()End Sub
Zmiana nieostatniego wymiaru tablicySub tablica1()Dim ta() As Double, ta1() As DoubleDim m As Integer, n As Integerm = InputBox("Wiersze:")n = InputBox("Kolumny:")ReDim ta(1 To m, 1 To n) As DoubleFor i = 1 To m
For j = 1 To nta(i, j) = i ^ j
Next jNext iMsgBox "1. ta: m x n"ReDim Preserve ta(1 To m, 1 To n + 1)For i = 1 To mta(i, n + 1) = i ^ (-j)NextMsgBox "2. ta: m x n+1"
ReDim ta1(1 To n + 1, 1 To m)For i = 1 To m
For j = 1 To n + 1ta1(j, i) = ta(i, j)
Next jNext iMsgBox "3. ta1: n+1 x m"ReDim Preserve ta1(1 To n + 1, 1 To m + 1)For j = 1 To n + 1
ta1(j, m + 1) = 10 ^ (-j)NextMsgBox "4. ta1: n+1 x m+1"ReDim ta(1 To m + 1, 1 To n + 1)For i = 1 To m + 1
For j = 1 To n + 1ta(i, j) = ta1(j, i)
Next jNext iMsgBox "5. ta: m+1, n+1"ActiveCell.Range(Cells(1, 1), _Cells(m + 1, n + 1)) = ta()End Sub
Użycie ReDim do zmiany typu zmiennej
Użycie ReDim do zmiany typu zmiennejSub redim1()Dim varXReDim varX(1 To 1) As LongMsgBox TypeName(varX(1))varX(1) = 1234MsgBox varX(1)ReDim varX(1 To 1) As StringMsgBox TypeName(varX(1))varX(1) = "I hate MS"MsgBox varX(1)End Sub
Wyłapanie błęduSub error1()
Dim x, y, zx = InputBox("x:")y = InputBox("y:")
On Error GoTo handler1’ On Error poprzedza komendę mogącą dawać błądz = x / yMsgBox z’ reszta kodu
Exit Sub’ wyjście przed kodem obługującym błądhandler1: ’ kod obsługujący błąd
MsgBox "Division by 0"End Sub
Rozróżnianie błędówSub error1()
Dim x, y, zx = InputBox("x:")y = InputBox("y:")
On Error GoTo handler1’ On Error poprzedza komendę mogącą dawać błądz = x / yMsgBox z’ reszta kodu
Exit Sub’ wyjście przed kodem obługującym błądhandler1: ’ kod obsługujący błąd
MsgBox "Division by 0", , Err.Number ’ dzielenie przez zero i przez stringEnd Sub
Rozróżnianie błędówWłasności Number oraz Description pozwalają lepiej zidentyfikować i opisać błąd:
Rozróżnianie błędówWłasności Number oraz Description pozwalają lepiej zidentyfikować i opisać błąd:
Sub error2()Dim x, y, zx = InputBox("x:")y = InputBox("y:")
On Error GoTo handler1z = x / yMsgBox z
Exit Subhandler1:
Select Case Err.NumberCase 11
MsgBox "Division by 0", , Err.Number & " " & Err.DescriptionCase 13
MsgBox "Can’t be a string!", , Err.Number & " " & Err.DescriptionEnd Select
End Sub
Źle wyłapany błądOn Error działa aż do kolejnego On Error lub wyłączenia błędów komendą On Error GoTo 0
Źle wyłapany błądOn Error działa aż do kolejnego On Error lub wyłączenia błędów komendą On Error GoTo 0
Sub error3()Dim x, y, z, a, b, cx = InputBox("x:")y = InputBox("y:")
On Error GoTo handler1z = x / yMsgBox za = InputBox("a:")b = InputBox("b:")c = a / b
Exit Subhandler1:Select Case Err.Number
Case 11MsgBox "y can’t be 0", , Err.Number
Case 13MsgBox "y can’t be a string!", , Err.Number
End SelectEnd Sub
Źle wyłapany błądOn Error działa aż do kolejnego On Error lub wyłączenia błędów komendą On Error GoTo 0
Sub error3()Dim x, y, z, a, b, cx = InputBox("x:")y = InputBox("y:")
On Error GoTo handler1z = x / yMsgBox za = InputBox("a:")b = InputBox("b:")c = a / b
Exit Subhandler1:Select Case Err.Number
Case 11MsgBox "y can’t be 0", , Err.Number
Case 13MsgBox "y can’t be a string!", , Err.Number
End SelectEnd Sub
Błąd jest źle wyłapany (np. x = y = a = 1, b = 0). Program „nie wie” o co chodzi.
Źle wyłapany błądOn Error działa aż do kolejnego On Error lub wyłączenia błędów komendą On Error GoTo 0
Sub error3()Dim x, y, z, a, b, cx = InputBox("x:")y = InputBox("y:")
On Error GoTo handler1z = x / yMsgBox za = InputBox("a:")b = InputBox("b:")
c = a / bExit Subhandler1:Select Case Err.Number
Case 11MsgBox "y can’t be 0", , Err.Number
Case 13MsgBox "y can’t be a string!", , Err.Number
End SelectEnd Sub
Źle wyłapany błądOn Error działa aż do kolejnego On Error lub wyłączenia błędów komendą On Error GoTo 0
Sub error3()Dim x, y, z, a, b, cx = InputBox("x:")y = InputBox("y:")
On Error GoTo handler1z = x / yMsgBox za = InputBox("a:")b = InputBox("b:")
’ Domyślamy się, że tu jest pies pogrzebanyc = a / bExit Subhandler1:Select Case Err.Number
Case 11MsgBox "y can’t be 0", , Err.Number
Case 13MsgBox "y can’t be a string!", , Err.Number
End SelectEnd Sub
Źle wyłapany błądOn Error działa aż do kolejnego On Error lub wyłączenia błędów komendą On Error GoTo 0
Sub error3()Dim x, y, z, a, b, cx = InputBox("x:")y = InputBox("y:")
On Error GoTo handler1z = x / yMsgBox za = InputBox("a:")b = InputBox("b:")
On Error GoTo 0c = a / b
Exit Subhandler1:Select Case Err.Number
Case 11MsgBox "y can’t be 0", , Err.Number
Case 13MsgBox "y can’t be a string!", , Err.Number
End SelectEnd Sub
Źle wyłapany błądOn Error działa aż do kolejnego On Error lub wyłączenia błędów komendą On Error GoTo 0
Sub error3()Dim x, y, z, a, b, cx = InputBox("x:")y = InputBox("y:")
On Error GoTo handler1z = x / yMsgBox za = InputBox("a:")b = InputBox("b:")
On Error GoTo 0 ’ Roboczo wyłączmy obsługę błędow, żebyc = a / b ’ zobaczyć w czym problem
Exit Subhandler1:Select Case Err.Number
Case 11MsgBox "y can’t be 0", , Err.Number
Case 13MsgBox "y can’t be a string!", , Err.Number
End SelectEnd Sub
Źle wyłapany błądOn Error działa aż do kolejnego On Error lub wyłączenia błędów komendą On Error GoTo 0
Sub error3()Dim x, y, z, a, b, c[...]
On Error GoTo handler2c = a / b
Exit Subhandler1:Select Case Err.Number
Case 11MsgBox "y can’t be 0", , Err.Number
Case 13MsgBox "y can’t be a string!", , Err.Number
End Selecthandler2:Select Case Err.Number
Case 11MsgBox "b can’t be 0", , Err.Number
Case 13MsgBox "b can’t be a string!", , Err.Number
End SelectEnd Sub
Naprawa błędu: Resume oraz Resume NextResume Next powoduje powrót do linii następnej po generującej błąd:
Sub error2()Dim x, y, zx = InputBox("x:")y = InputBox("y:")
On Error GoTo handler1z = x / yMsgBox "x/y = " & x & "/" & y & " = " & z
Exit Subhandler1:Select Case Err.Number
Case 11MsgBox "Division by 0", , Err.Number & " " & Err.Description
Case 13MsgBox "Can’t be a string!", , Err.Number & " " & Err.Description
End Selecty = 1: z = xResume Next
End Sub
Naprawa błędu: Resume oraz Resume NextResume powoduje powrót do linii generującej błąd:
Sub error2()Dim x, y, zx = InputBox("x:")y = InputBox("y:")
On Error GoTo handler1z = x / yMsgBox "x/y = " & x & "/" & y & " = " & z
Exit Subhandler1:Select Case Err.Number
Case 11MsgBox "Division by 0", , Err.Number & " " & Err.Description
Case 13MsgBox "Can’t be a string!", , Err.Number & " " & Err.Description
End Selecty = InputBox("Podaj y nie równe zero i nie tekst")Resume
End Sub
Ignorowanie błędówMożna użyć On Error Resume Next, by zignorować błąd:
Sub error4()Dim x, y, z, a, b, cx = InputBox("x:")y = InputBox("y:")
On Error Resume Nextz = x / yMsgBox "x/y = " & x & "/" & y & " = " & z
End Sub
Ignorowanie błędówMożna użyć On Error Resume Next, by zignorować błąd:
Sub error4()Dim x, y, z, a, b, cx = InputBox("x:")y = InputBox("y:")
On Error Resume Nextz = x / yMsgBox "x/y = " & x & "/" & y & " = " & z
End Sub
Przeskakiwanie bloku instrukcjiJeśli po obsłudze błędu chcemy wrócić do jakiejś dalszej linii, można użyć Resume następu-
jąco
On Error Goto handler1[komenda genrująca błąd][inne komendy]
...[ inne komendy]comeback1: ’ Stąd chcemy kontynuować
[komendy]...
[komendy]
Ignorowanie błędówMożna użyć On Error Resume Next, by zignorować błąd:
Sub error4()Dim x, y, z, a, b, cx = InputBox("x:")y = InputBox("y:")
On Error Resume Nextz = x / yMsgBox "x/y = " & x & "/" & y & " = " & z
End Sub
Przeskakiwanie bloku instrukcjiJeśli po obsłudze błędu chcemy wrócić do jakiejś dalszej linii, można użyć Resume następu-
jąco
On Error Goto handler1[komenda genrująca błąd][inne komendy]
...[inne komendy]
comeback1: ’ Stąd chcemy kontynuować[komendy]
...[komendy]
Exit Subhandler1:
[naprawa błędu]Resume comeback1End Sub
Ignorowanie błędówMożna użyć On Error Resume Next, by zignorować błąd:
Sub error4()Dim x, y, z, a, b, cx = InputBox("x:")y = InputBox("y:")
On Error Resume Nextz = x / yMsgBox "x/y = " & x & "/" & y & " = " & z
End Sub
Przeskakiwanie bloku instrukcjiJeśli po obsłudze błędu chcemy wrócić do jakiejś dalszej linii, można użyć Resume następu-
jąco
On Error Goto handler1[komenda genrująca błąd][inne komendy]
...[inne komendy]
comeback1: ’ Stąd chcemy kontynuować[komendy]
...[komendy]
Exit Subhandler1:
[naprawa błędu]Resume comeback1End Sub
Uwaga! Etykieta comeback1 jest poniżejOn Error Goto handler1
Błąd w błędzieSub error5()
Dim xOn Error GoTo handler1
x = 1 / 0Exit Subhandler1:
MsgBox "Handler1 entered"On Error GoTo handler2
x = 1 / 0Exit Subhandler2:
MsgBox "Handler2 entered"End Sub
Błąd w błędzieSub error5()
Dim xOn Error GoTo handler1
x = 1 / 0Exit Subhandler1:
MsgBox "Handler1 entered"
On Error GoTo handler2x = 1 / 0
Exit Subhandler2:
MsgBox "Handler2 entered"End Sub
Błąd w błędzieSub error5()
Dim xOn Error GoTo handler1
x = 1 / 0Exit Subhandler1:
MsgBox "Handler1 entered"On Error GoTo -1On Error GoTo handler2
x = 1 / 0Exit Subhandler2:
MsgBox "Handler2 entered"End Sub
Celowe wywoływanie błędówKomenda Error 13 genruje błąd o podanym numerze (tu: 13).
Celowe wywoływanie błędówKomenda Error 13 genruje błąd o podanym numerze (tu: 13). Odradza się jej stosowanie.
Jest lepsza alternatywa:Err.Raise numer, źródło, opis
Celowe wywoływanie błędówKomenda Error 13 genruje błąd o podanym numerze (tu: 13). Odradza się jej stosowanie.
Jest lepsza alternatywa:Err.Raise numer, źródło, opisWolne numery są od 513 do 65535.
Celowe wywoływanie błędówKomenda Error 13 genruje błąd o podanym numerze (tu: 13). Odradza się jej stosowanie.
Jest lepsza alternatywa:Err.Raise numer, źródło, opisWolne numery są od 513 do 65535. Jako źródło można podać nazwę makra lub dokład-
niejsze „współrzędne”.
Celowe wywoływanie błędówKomenda Error 13 genruje błąd o podanym numerze (tu: 13). Odradza się jej stosowanie.
Jest lepsza alternatywa:Err.Raise numer, źródło, opisWolne numery są od 513 do 65535. Jako źródło można podać nazwę makra lub dokład-
niejsze „współrzędne”. Będzie to przypisane do własności Source, zatem można się do niejodwołać przez Err.Source
Celowe wywoływanie błędówKomenda Error 13 genruje błąd o podanym numerze (tu: 13). Odradza się jej stosowanie.
Jest lepsza alternatywa:Err.Raise numer, źródło, opisWolne numery są od 513 do 65535. Jako źródło można podać nazwę makra lub dokład-
niejsze „współrzędne”. Będzie to przypisane do własności Source, zatem można się do niejodwołać przez Err.Source, zaś do opisu — przez Err.Description
Error — szybki powrót
Error — szybki powrótSub errtest()Dim a As Integeron error resumea = InputBox("")End Sub
Error — szybki powrótSub errtest()Dim a As Integeron error resumea = InputBox("")End Sub
Tak się niestety nie da.
Error — szybki powrótSub errtest()Dim a As Integeron error resumea = InputBox("")End Sub
Tak się niestety nie da. Trzeba użyć pełnej wersji:
Sub errtest()Dim a As IntegerOn Error GoTo hdl1a = InputBox("")Exit Subhdl1:ResumeEnd Sub
Właściwości błędówŻeby mieć do nich dostęp trzeba się upewnić, że błąd nie został wyzerowany.
Właściwości błędówŻeby mieć do nich dostęp trzeba się upewnić, że błąd nie został wyzerowany.
Sub errtest1()On Error GoTo hdl1Err.Raise 404, "Tu", "Coś nie tak z liczbą"MsgBox "Nigdy mnie nie zobaczysz"
koniec:Exit Sub
hdl1:On Error GoTo 0MsgBox "Błąd: " & vbCr & Err.Description & vbCr & Err.Number & vbCr & _
Err.SourceErr.Raise 666, "W środku hdl1", "Cholerny błąd"Resume Next
End Sub
Właściwości błędówŻeby mieć do nich dostęp trzeba się upewnić, że błąd nie został wyzerowany.
Sub errtest1()On Error GoTo hdl1Err.Raise 404, "Tu", "Coś nie tak z liczbą"MsgBox "Nigdy mnie nie zobaczysz"
koniec:Exit Sub
hdl1:On Error GoTo 0MsgBox "Błąd: " & vbCr & Err.Description & vbCr & Err.Number & vbCr & _
Err.SourceErr.Raise 666, "W środku hdl1", "Cholerny błąd"Resume Next
End Sub
Po zakomentowaniu On Error GoTo 0 widać właściwości błędu.
Err.Raise vs Resume
Err.Raise vs ResumeWypróbujmy kod:
Sub errtest2()Dim a As Integer
On Error GoTo hdl10a = InputBox("Podaj liczbę dodatnią")If a < 0 Then Err.Raise 1000, , "Miała być dodatnia"Exit Subhdl10:Select Case Err.Number
Case 1000MsgBox Err.Description, vbCritical, "Źle"
Case ElseMsgBox Err.Description, vbExclamation
End SelectResumeEnd Sub
Err.Raise vs ResumeWypróbujmy kod:
Sub errtest2()Dim a As Integer
On Error GoTo hdl10a = InputBox("Podaj liczbę dodatnią")If a < 0 Then Err.Raise 1000, , "Miała być dodatnia"Exit Subhdl10:Select Case Err.Number
Case 1000MsgBox Err.Description, vbCritical, "Źle"
Case ElseMsgBox Err.Description, vbExclamation
End SelectResumeEnd Sub
Po wpisaniu nie liczby jest ok . . .
Err.Raise vs ResumeWypróbujmy kod:
Sub errtest2()Dim a As Integer
On Error GoTo hdl10a = InputBox("Podaj liczbę dodatnią")If a < 0 Then Err.Raise 1000, , "Miała być dodatnia"Exit Subhdl10:Select Case Err.Number
Case 1000MsgBox Err.Description, vbCritical, "Źle"
Case ElseMsgBox Err.Description, vbExclamation
End SelectResumeEnd Sub
Po wpisaniu nie liczby jest ok . . . ale po wpisaniu liczby ujemnej, trzeba się ratować Ctrl+ Break
Err.Raise vs ResumeWypróbujmy kod:
Sub errtest2()Dim a As Integer
On Error GoTo hdl10a = InputBox("Podaj liczbę dodatnią")If a < 0 Then Err.Raise 1000, , "Miała być dodatnia"Exit Subhdl10:Select Case Err.Number
Case 1000MsgBox Err.Description, vbCritical, "Źle"
Case ElseMsgBox Err.Description, vbExclamation
End SelectResumeEnd Sub
Po wpisaniu nie liczby jest ok . . . ale po wpisaniu liczby ujemnej, trzeba się ratować Ctrl+ Break (w niektórych laptopach jeszcze jest Fn potrzebne)
Err.Raise vs ResumeTeraz jest ok:
Sub errtest2()Dim a As Integerbefore:On Error GoTo hdl10a = InputBox("Podaj liczbę dodatnią")If a < 0 Then Err.Raise 1000, , "Miała być dodatnia"Exit Subhdl10:Select Case Err.Number
Case 1000MsgBox Err.Description, vbCritical, "Źle"
Case ElseMsgBox Err.Description, vbExclamation
End SelectResume beforeEnd Sub
Zewnętrzne pliki — otwieranie daną aplikacjąOtwieranie pliku tekstowego notatnikiem:
Sub OpenInNotepad()Dim MyTxtFile
MyTxtFile = Shell("C:\WINDOWS\notepad.exe C:\...\file.txt", 1)End Sub
Zewnętrzne pliki — otwieranie daną aplikacjąOtwieranie pliku tekstowego notatnikiem:
Sub OpenInNotepad()Dim MyTxtFile
MyTxtFile = Shell("C:\WINDOWS\notepad.exe C:\...\file.txt", 1)End Sub
Dostępne opcje:
0. vbHide (jako proces w tle)
Zewnętrzne pliki — otwieranie daną aplikacjąOtwieranie pliku tekstowego notatnikiem:
Sub OpenInNotepad()Dim MyTxtFile
MyTxtFile = Shell("C:\WINDOWS\notepad.exe C:\...\file.txt", 1)End Sub
Dostępne opcje:
0. vbHide (jako proces w tle)
1. vbNormalFocus (otwiera się domyślnie)
Zewnętrzne pliki — otwieranie daną aplikacjąOtwieranie pliku tekstowego notatnikiem:
Sub OpenInNotepad()Dim MyTxtFile
MyTxtFile = Shell("C:\WINDOWS\notepad.exe C:\...\file.txt", 1)End Sub
Dostępne opcje:
0. vbHide (jako proces w tle)
1. vbNormalFocus (otwiera się domyślnie)
2. vbMinimizedFocus (zminimalizowana, ale aktywna)
Zewnętrzne pliki — otwieranie daną aplikacjąOtwieranie pliku tekstowego notatnikiem:
Sub OpenInNotepad()Dim MyTxtFile
MyTxtFile = Shell("C:\WINDOWS\notepad.exe C:\...\file.txt", 1)End Sub
Dostępne opcje:
0. vbHide (jako proces w tle)
1. vbNormalFocus (otwiera się domyślnie)
2. vbMinimizedFocus (zminimalizowana, ale aktywna)
3. vbMaximizedFocus (zmaksymalizowan, aktywna)
Zewnętrzne pliki — otwieranie daną aplikacjąOtwieranie pliku tekstowego notatnikiem:
Sub OpenInNotepad()Dim MyTxtFile
MyTxtFile = Shell("C:\WINDOWS\notepad.exe C:\...\file.txt", 1)End Sub
Dostępne opcje:
0. vbHide (jako proces w tle)
1. vbNormalFocus (otwiera się domyślnie)
2. vbMinimizedFocus (zminimalizowana, ale aktywna)
3. vbMaximizedFocus (zmaksymalizowan, aktywna)
4. vbNormalNoFocus (otwarta normalnie, nieaktywna)
Zewnętrzne pliki — otwieranie daną aplikacjąOtwieranie pliku tekstowego notatnikiem:
Sub OpenInNotepad()Dim MyTxtFile
MyTxtFile = Shell("C:\WINDOWS\notepad.exe C:\...\file.txt", 1)End Sub
Dostępne opcje:
0. vbHide (jako proces w tle)
1. vbNormalFocus (otwiera się domyślnie)
2. vbMinimizedFocus (zminimalizowana, ale aktywna)
3. vbMaximizedFocus (zmaksymalizowan, aktywna)
4. vbNormalNoFocus (otwarta normalnie, nieaktywna)
6. vbMinimizedNoFocus (sensowniejsze niż 2)
Zewnętrzne pliki — otwieranie daną aplikacjąOtwieranie pliku tekstowego notatnikiem:
Sub OpenInNotepad()Dim MyTxtFile
MyTxtFile = Shell("C:\WINDOWS\notepad.exe C:\...\file.txt", 1)End Sub
Dostępne opcje:
0. vbHide (jako proces w tle)
1. vbNormalFocus (otwiera się domyślnie)
2. vbMinimizedFocus (zminimalizowana, ale aktywna)
3. vbMaximizedFocus (zmaksymalizowan, aktywna)
4. vbNormalNoFocus (otwarta normalnie, nieaktywna)
6. vbMinimizedNoFocus (sensowniejsze niż 2)
Otwieranie samej aplikacjiSub LaunchNotepad()Call Shell("Explorer.exe C:\Windows\system32\notepad.exe", vbNormalFocus)End Sub
Pliki CSV
Pliki CSV (Comma Separated Value)
Pliki CSV (Comma Separated Value)Następująca komenda służy do otwierania plikówOpen [co] For [po co] As [Nr pliku]
Pliki CSV (Comma Separated Value)Następująca komenda służy do otwierania plikówOpen [co] For [po co] As [Numer pliku]przy czym:
[co] musi zawierać pełną ścieżkę z nazwą pliku i rozszerzeniem (.txt lub .csv)
[po co] może przyjąć wartości:
Pliki CSV (Comma Separated Value)Następująca komenda służy do otwierania plikówOpen [co] For [po co] As [Nr pliku]przy czym:
[co] musi zawierać pełną ścieżkę z nazwą pliku i rozszerzeniem (.txt lub .csv)
[po co] może przyjąć wartości:
– Append — dopisywanie na końcu pliku– Ouptut — nadpisywanie– Input — odczyt– Binary, Random — nie będą nam potrzebne na razie.
Pliki CSV (Comma Separated Value)Następująca komenda służy do otwierania plikówOpen [co] For [po co] As [Nr pliku]przy czym:
[co] musi zawierać pełną ścieżkę z nazwą pliku i rozszerzeniem (.txt lub .csv)
[po co] może przyjąć wartości:
– Append — dopisywanie na końcu pliku– Ouptut — nadpisywanie– Input — odczyt– Binary, Random — nie będą nam potrzebne na razie.
[Nr pliku] musi być w formacie #5
Pliki CSV (Comma Separated Value)Następująca komenda służy do otwierania plikówOpen [co] For [po co] As [Nr pliku]przy czym:
[co] musi zawierać pełną ścieżkę z nazwą pliku i rozszerzeniem (.txt lub .csv)
[po co] może przyjąć wartości:
– Append — dopisywanie na końcu pliku– Ouptut — nadpisywanie– Input — odczyt– Binary, Random — nie będą nam potrzebne na razie.
[Nr pliku] musi być w formacie #5 (5 to oczywiście tylko przykład)
Uwaga! Po zakończeniu pracy z plikiem koniecznie pamiętaj o zamknięciu goClose #5
Operacje na otwartym plikuJeśli plik otwarty For Input dostępne są
• funkcja EOF End of File, zmienną jest numer pliku bez #, wartości to True oraz False
• komenda LineInput z dwoma parametrami: nr pliku poprzedzony # oraz zmienna,pod którą będzie podstawiony odczytany tekst
Najprostszy schemat (przepisanie pliku do arkusza)
Open ... For Input As #1row = 0Do Until EOF(1)
Line Input #1, lineActiveCell.Offset(row,0).value = linerow = row +1
LoopClose #1
Operacje na otwartym plikuJeśli plik otwarty For Input dostępne są
• funkcja EOF End of File, zmienną jest numer pliku bez #, wartości to True oraz False
• komenda LineInput z dwoma parametrami: nr pliku poprzedzony # oraz zmienna,pod którą będzie podstawiony odczytany tekst
Najprostszy schemat (przepisanie pliku do arkusza)
Open ... For Input As #1row = 0Do Until EOF(1)
Line Input #1, lineActiveCell.Offset(row,0).value = linerow = row +1
LoopClose #1
Jeśli plik otwary For Output lub For Append, to dostępna jest komendaWrite też z dwoma parametrami: nr pliku (poprzedzony #) oraz co zapisać, czyli odwołanie
do zmiennej lub tekst wprost (w cudzysłowie)Uwaga! Zapis do pliku otwartego For Output wykasuje bez ostrzeżenia dane z tego
pliku!
Pliki CSV IINapiszemy program, który
Pliki CSV IINapiszemy program, który
1.
2.
3.
4.
5.
6.
7.
Pliki CSV IINapiszemy program, który
1. weźmie od użytkownika nazwę pliku .csv
2.
3.
4.
5.
6.
7.
Pliki CSV IINapiszemy program, który
1. weźmie od użytkownika nazwę pliku .csv
2. otworzy plik
3.
4.
5.
6.
7.
Pliki CSV IINapiszemy program, który
1. weźmie od użytkownika nazwę pliku .csv
2. otworzy plik
3. odczyta plik linia po linii
4.
5.
6.
7.
Pliki CSV IINapiszemy program, który
1. weźmie od użytkownika nazwę pliku .csv
2. otworzy plik
3. odczyta plik linia po linii
4. rozdzili każdą linię na przecinkach
5.
6.
7.
Pliki CSV IINapiszemy program, który
1. weźmie od użytkownika nazwę pliku .csv
2. otworzy plik
3. odczyta plik linia po linii
4. rozdzili każdą linię na przecinkach
5. wybierze n-tą wartość z n-tej linii
6.
7.
Pliki CSV IINapiszemy program, który
1. weźmie od użytkownika nazwę pliku .csv
2. otworzy plik
3. odczyta plik linia po linii
4. rozdzili każdą linię na przecinkach
5. wybierze n-tą wartość z n-tej linii
6. obliczy tym sposobem ślad macierzy z pliku (sumę wyrazów na głównej przekątnej)
7.
Pliki CSV IINapiszemy program, który
1. weźmie od użytkownika nazwę pliku .csv
2. otworzy plik
3. odczyta plik linia po linii
4. rozdzili każdą linię na przecinkach
5. wybierze n-tą wartość z n-tej linii
6. obliczy tym sposobem ślad macierzy z pliku (sumę wyrazów na głównej przekątnej)
7. co zrobi na końcu?
Pliki CSV IINapiszemy program, który
1. weźmie od użytkownika nazwę pliku .csv
2. otworzy plik
3. odczyta plik linia po linii
4. rozdzili każdą linię na przecinkach
5. wybierze n-tą wartość z n-tej linii
6. obliczy tym sposobem ślad macierzy z pliku (sumę wyrazów na głównej przekątnej)
7. zamknie plik
Pliki CSV IINapiszemy program, który
1. weźmie od użytkownika nazwę pliku .csv
2. otworzy plik
3. odczyta plik linia po linii
4. rozdzili każdą linię na przecinkach
5. wybierze n-tą wartość z n-tej linii
6. obliczy tym sposobem ślad macierzy z pliku (sumę wyrazów na głównej przekątnej)
7. zamknie plik
Co nam będzie potrzebne?
Pliki CSV IINapiszemy program, który
1. weźmie od użytkownika nazwę pliku .csv
2. otworzy plik
3. odczyta plik linia po linii
4. rozdzili każdą linię na przecinkach
5. wybierze n-tą wartość z n-tej linii
6. obliczy tym sposobem ślad macierzy z pliku (sumę wyrazów na głównej przekątnej)
7. zamknie plik
Co nam będzie potrzebne?
•
•
•
•
Pliki CSV IINapiszemy program, który
1. weźmie od użytkownika nazwę pliku .csv
2. otworzy plik
3. odczyta plik linia po linii
4. rozdzili każdą linię na przecinkach
5. wybierze n-tą wartość z n-tej linii
6. obliczy tym sposobem ślad macierzy z pliku (sumę wyrazów na głównej przekątnej)
7. zamknie plik
Co nam będzie potrzebne?
• Open/Close
•
•
•
Pliki CSV IINapiszemy program, który
1. weźmie od użytkownika nazwę pliku .csv
2. otworzy plik
3. odczyta plik linia po linii
4. rozdzili każdą linię na przecinkach
5. wybierze n-tą wartość z n-tej linii
6. obliczy tym sposobem ślad macierzy z pliku (sumę wyrazów na głównej przekątnej)
7. zamknie plik
Co nam będzie potrzebne?
• Open/Close
• Line Input
• pętla z testem . . .
•
Pliki CSV IINapiszemy program, który
1. weźmie od użytkownika nazwę pliku .csv
2. otworzy plik
3. odczyta plik linia po linii
4. rozdzili każdą linię na przecinkach
5. wybierze n-tą wartość z n-tej linii
6. obliczy tym sposobem ślad macierzy z pliku (sumę wyrazów na głównej przekątnej)
7. zamknie plik
Co nam będzie potrzebne?
• Open/Close
• Line Input
• pętla z testem EOF
•
Pliki CSV IINapiszemy program, który
1. weźmie od użytkownika nazwę pliku .csv
2. otworzy plik
3. odczyta plik linia po linii
4. rozdzili każdą linię na przecinkach
5. wybierze n-tą wartość z n-tej linii
6. obliczy tym sposobem ślad macierzy z pliku (sumę wyrazów na głównej przekątnej)
7. zamknie plik
Co nam będzie potrzebne?
• Open/Close
• Line Input
• pętla z testem EOF
• Funkcja do rozdzielenia tekstu:
Pliki CSV IINapiszemy program, który
1. weźmie od użytkownika nazwę pliku .csv
2. otworzy plik
3. odczyta plik linia po linii
4. rozdzili każdą linię na przecinkach
5. wybierze n-tą wartość z n-tej linii
6. obliczy tym sposobem ślad macierzy z pliku (sumę wyrazów na głównej przekątnej)
7. zamknie plik
Co nam będzie potrzebne?
• Open/Close
• Line Input
• pętla z testem EOF
• Funkcja do rozdzielenia tekstu: Split