Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set...

Post on 05-Jun-2020

1 views 0 download

Transcript of Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set...

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