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

94
Set II, ByRef/ByVal, Tablice dynamiczne, blędy i zewnętrzne pliki Rafal Zduńczyk Programowanie arkuszy kalkulacyjnych 2019

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

Page 1: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

Set II, ByRef/ByVal, Tablice dynamiczne,błędy i zewnętrzne pliki

Rafał Zduńczyk

Programowanie arkuszy kalkulacyjnych2019

Page 2: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

Po co jest Set?

Page 3: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

Po co jest Set?Napiszemy program, który

1.

2.

3.

4.

Page 4: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

Po co jest Set?Napiszemy program, który

1. zapamiętuje zaznaczoną komórkę

2.

3.

4.

Page 5: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

Po co jest Set?Napiszemy program, który

1. zapamiętuje zaznaczoną komórkę

2. daje użytkownikowi wybrać wektor przesunięcia

3.

4.

Page 6: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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.

Page 7: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 8: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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:

Page 9: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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)

Page 10: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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)

Page 11: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 12: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 13: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 14: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 15: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 16: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 17: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 18: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 19: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

Użycie ReDim do zmiany typu zmiennej

Page 20: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 21: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 22: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 23: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

Rozróżnianie błędówWłasności Number oraz Description pozwalają lepiej zidentyfikować i opisać błąd:

Page 24: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 25: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

Źle wyłapany błądOn Error działa aż do kolejnego On Error lub wyłączenia błędów komendą On Error GoTo 0

Page 26: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

Ź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

Page 27: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 28: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

Ź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

Page 29: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

Ź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

Page 30: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

Ź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

Page 31: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

Ź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

Page 32: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

Ź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

Page 33: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 34: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 35: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 36: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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]

Page 37: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 38: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 39: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 40: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 41: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 42: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

Celowe wywoływanie błędówKomenda Error 13 genruje błąd o podanym numerze (tu: 13).

Page 43: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 44: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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.

Page 45: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 46: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 47: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 48: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

Error — szybki powrót

Page 49: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

Error — szybki powrótSub errtest()Dim a As Integeron error resumea = InputBox("")End Sub

Page 50: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

Error — szybki powrótSub errtest()Dim a As Integeron error resumea = InputBox("")End Sub

Tak się niestety nie da.

Page 51: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 52: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

Właściwości błędówŻeby mieć do nich dostęp trzeba się upewnić, że błąd nie został wyzerowany.

Page 53: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 54: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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.

Page 55: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

Err.Raise vs Resume

Page 56: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 57: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 58: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 59: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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)

Page 60: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 61: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 62: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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)

Page 63: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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)

Page 64: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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)

Page 65: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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)

Page 66: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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)

Page 67: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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)

Page 68: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 69: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

Pliki CSV

Page 70: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

Pliki CSV (Comma Separated Value)

Page 71: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

Pliki CSV (Comma Separated Value)Następująca komenda służy do otwierania plikówOpen [co] For [po co] As [Nr pliku]

Page 72: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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:

Page 73: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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.

Page 74: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 75: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 76: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 77: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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!

Page 78: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

Pliki CSV IINapiszemy program, który

Page 79: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

Pliki CSV IINapiszemy program, który

1.

2.

3.

4.

5.

6.

7.

Page 80: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

Pliki CSV IINapiszemy program, który

1. weźmie od użytkownika nazwę pliku .csv

2.

3.

4.

5.

6.

7.

Page 81: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

Pliki CSV IINapiszemy program, który

1. weźmie od użytkownika nazwę pliku .csv

2. otworzy plik

3.

4.

5.

6.

7.

Page 82: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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.

Page 83: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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.

Page 84: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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.

Page 85: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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.

Page 86: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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?

Page 87: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 88: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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?

Page 89: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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?

Page 90: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 91: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 92: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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

Page 93: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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:

Page 94: Set II, ByRef/ByVal, Tablice dynamiczne, błędy i ...math.uni.lodz.pl/~rafal/pak1819-4.pdf · Set II, ByRef/ByVal, Tablice dynamiczne, błędy i zewnętrzne pliki Rafał Zduńczyk

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