• 検索結果がありません。

PowerPoint プレゼンテーション

N/A
N/A
Protected

Academic year: 2021

シェア "PowerPoint プレゼンテーション"

Copied!
91
0
0

読み込み中.... (全文を見る)

全文

(1)
(2)

 Subプロシージャ

 Functionプロシージャ

 Propertyプロシージャ

(3)

 Subステートメント~End Subステートメントで囲ま れる  実行はするけど、値は返さない  途中で抜けたいときはExit Sub を行なう  Public Subはマクロの実行候補に表示される

Subプロシージャ

(4)

Public Sub TestSubProc()

Call ShowElShadaiMsg("まだ死ぬ定めではない") End Sub

Private Sub ShowElShadaiMsg(ByVal msg As String) Msgbox "神はいっている" & msg & "・・・と"

End Sub

(5)

Public Sub TestSubProc()

Call ShowElShadaiMsg("まだ死ぬ定めではない") End Sub

Private Sub ShowElShadaiMsg(ByVal msg As String) Msgbox "神はいっている" & msg & "・・・と"

End Sub

Subプロシージャの例

Subの前に

PublicまたはPrivateを指定できる 省略した場合はPublicとされる

(6)

Public Sub TestSubProc()

Call ShowElShadaiMsg("まだ死ぬ定めではない") End Sub

Private Sub ShowElShadaiMsg(ByVal msg As String) Msgbox "神はいっている" & msg & "・・・と"

End Sub

Subプロシージャの例

Subの前に

PublicまたはPrivateを指定できる 省略した場合はPublicとされる

(7)

Option Private

Public Sub TestSubProc()

Call ShowElShadaiMsg("まだ死ぬ定めではない") End Sub

Subプロシージャの例

モジュールの先頭にOption Private がある場合は、別のプロジェクトか らは実行できなくなる

(8)

Public Sub TestSubProc()

Call ShowElShadaiMsg("まだ死ぬ定めではない") End Sub

Private Sub ShowElShadaiMsg(ByVal msg As String) Msgbox "神はいっている" & msg & "・・・と"

End Sub

(9)

Private Sub ShowElShadaiMsg(ByVal msg As String) If msg = “神はしんだ” Then

Exit Sub End If

Msgbox "神はいっている" & msg & "・・・と" End Sub

(10)

 Functionステートメント~End Functionステートメ ントで囲まれる  値を返せる  途中で抜けたいときはExit Functionを行なう  標準モジュールで作成したPublic Functionは数式と して使える

Functionプロシージャ

(11)

Public Function TestFuncProc(ByRef rng As Range) _ As String

TestFuncProc = "神はいっている" _

& rng.Value & "・・・と" End Function

(12)

Public Function TestFuncProc(ByRef rng As Range) _ As String

TestFuncProc = "神はいっている" _

& rng.Value & "・・・と" End Function

Functionプロシージャの例

Functionの前に

PublicまたはPrivateを指定できる 省略した場合はPublicとされる

(13)

Public Function TestFuncProc(ByRef rng As Range) _ As String

TestFuncProc = "神はいっている" _

& rng.Value & "・・・と" End Function

Functionプロシージャの例

Functionの前に

PublicまたはPrivateを指定できる 省略した場合はPublicとされる

(14)

Public Function TestFuncProc(ByRef rng As Range) _ As String

TestFuncProc = "神はいっている" _

& rng.Value & "・・・と" End Function

(15)

Public Function TestFuncProc(ByRef rng As Range) _ As String

TestFuncProc = "神はいっている" _

& rng.Value & "・・・と" End Function

(16)

Public Sub TestFuncProcCaller() Dim rng As Range

Call Msgbox(TestFuncProc(Sheet1.Cells(2, 2))) End Sub

(17)

Public Function TestFuncProc(ByRef rng As Range) As String

TestFuncProc = "神はいっている" _

& rng.Value & "・・・と" End Function

(18)

Public Function TestFuncProc(ByRef rng As Range) As String

TestFuncProc = "神はいっている" _

& rng.Value & "・・・と" End Function

(19)

(20)

Public Function TestFuncProc(ByRef rng As Range) As String

TestFuncProc = "神はいっている" _

& rng.Value & "・・・と" End Function

(21)

Public Function TestFuncProc(ByRef rng As Range) As String

TestFuncProc = "神はいっている" _

& rng.Value & "・・・と" End Function

(22)

Public Function TestFuncProc(ByRef rng As Range) _ As String

TestFuncProc = "神はいっている" _

& rng.Value & "・・・と" End Function

(23)

Public Function TestFuncProc(ByRef rng As Range) _ As String * 1024

End Function

Functionプロシージャの例

固定文字列は返せない この例はエラーになる

(24)

Public Function TestFuncProc(ByRef rng As Range) _ As String(0 to 10)

End Function

Functionプロシージャの例

固定配列は返せない この例はエラーになる

(25)

Private Function TestFuncArray() As String() Dim tmp(0 To 2) As String tmp(0) = "1" tmp(1) = "2" tmp(2) = "abc" TestFuncArray = tmp End Function

Functionプロシージャの例

可変配列は返せる。 以下のような記述はできない TestFuncArray(1) = “2”

(26)

Private Type typCat

strName As String '* 名前 lngAge As Long '* 年齢 kCatChr As eCatChar '* 性格 End Type

Private Function TestFuncType() As typCat With TestFuncType .strName = "マイケル" .lngAge = 2 .kCatChr = eCatChar_Freedom End With End Function

(27)

Private Enum eCatChar

eCatChar_Baby '* 子供っぽい eCatChar_Boss '* 親分肌

eCatChar_LoneWolf '* 一匹狼 eCatChar_Freedom '* フリーダム End Enum

Private Function TestFuncEnum() As eCatChar TestFuncEnum = eCatChar_Boss

(28)

'* コレクション

Private Function TestFuncCollection() As Collection Set TestFuncCollection = New Collection

Call TestFuncCollection.add("アカギ") Call TestFuncCollection.add("カイジ") End Function ‘ オブジェクトの呼び出し例 Dim cll as Collection Set cll = TestFuncCollection()

(29)

Public Function TestFuncProc(ByRef rng As Range) End Function

Functionプロシージャの例

戻り値の型は省略できる その場合はVariant型になる

けどやるな

(30)

Public Function TestFuncProc(ByRef rng As Range) Exit Function Debug.print “以降は実行されない” End Function

Functionプロシージャの例

Exit Functionでプロシージャをぬけ ることができる

(31)

 Public変数の代わりに使用できる  途中で抜けたいときはExit Propertyを行なう  Get,Let,Setの3種類がある  「4変数のスコープと生存期間」で説明済み

Propertyプロシージャ

(32)

Public Property Get Name() As String Name = "TEST"

End Property

Public Sub TestProperty() Dim ret As String

ret = mdlSample.Name End Sub

(33)

Public Property Get Name() As String Name = "TEST"

End Property

Public Sub TestProperty() Dim ret As String

ret = mdlSample.Name End Sub

(34)

Public Property Get Name() As String Name = "TEST"

End Property

Public Sub TestProperty() Dim ret As String

ret = mdlSample.Name End Sub

(35)

Public Property Get Name() As String Name = "TEST"

End Property

Public Sub TestProperty() Dim ret As String

ret = mdlSample.Name End Sub

(36)

Public Property Get Name() As String Name = "TEST"

End Property

Public Sub TestProperty() Dim ret As String

ret = mdlSample.Name End Sub

(37)

Public Property Let Name(ByVal v As String) Debug.Print "Property Let"

End Property

Public Sub TestProperty()

mdlSample.Name = "ゆっくり“ End Sub

(38)

Public Property Let Name(ByVal v As String) Debug.Print "Property Let"

End Property

Public Sub TestProperty()

mdlSample.Name = "ゆっくり“ End Sub

(39)

Public Property Let Name(ByVal v As String) Debug.Print "Property Let"

End Property

Public Sub TestProperty()

mdlSample.Name = "ゆっくり“ End Sub

(40)

Public Property Set MyRange(ByRef rng As Range) Debug.Print "MyRange Set:" & rng.Address

End Property

Public Sub TestProperty()

Set mdlSample.MyRange = Sheet1.Cells(2, 2) End Sub

(41)

Public Property Set MyRange(ByRef rng As Range) Debug.Print "MyRange Set:" & rng.Address

End Property

Public Sub TestProperty()

Set mdlSample.MyRange = Sheet1.Cells(2, 2) End Sub

(42)

Public Property Set MyRange(ByRef rng As Range) Debug.Print "MyRange Set:" & rng.Address

End Property

Public Sub TestProperty()

Set mdlSample.MyRange = Sheet1.Cells(2, 2) End Sub

(43)

Public Property Get PropArgs(ByVal x As Long, _ ByVal y As Long) As String PropArgs = "PropArgs Get" & x & " " & y

End Property

(44)

Public Property Get PropArgs(ByVal x As Long, _ ByVal y As Long) As String PropArgs = "PropArgs Get" & x & " " & y

End Property

Public Sub TestProperty() Dim ret As String

ret = mdlSample.PropArgs(1, 2) End Sub

(45)

Public Property Let PropArgs(ByVal x As Long, _ ByVal y As Long, ByVal msg As String) Debug.Print "PropArgs Let" & x & _

" " & y & " " & msg End Property

(46)

Public Property Let PropArgs(ByVal x As Long, _ ByVal y As Long, ByVal msg As String) Debug.Print "PropArgs Let" & x & _

" " & y & " " & msg End Property

Public Sub TestProperty()

mdlSample.PropArgs(1, 2) = "ゆっくり" End Sub

(47)

Public Property Let PropArgs(ByVal x As Long, _ ByVal y As Long, ByVal msg As String) Debug.Print "PropArgs Let" & x & _

" " & y & " " & msg End Property

Public Sub TestProperty()

mdlSample.PropArgs(1, 2) = "ゆっくり" End Sub

(48)

Public Property Let PropArgs(ByVal x As Long, _ ByVal y As Long, ByVal msg As String) Debug.Print "PropArgs Let" & x & _

" " & y & " " & msg End Property

Public Sub TestProperty()

mdlSample.PropArgs(1, 2) = "ゆっくり" End Sub

(49)

Public Property Let PropArgs(ByVal x As Long, _ ByVal y As Long, ByVal msg As String) Debug.Print "PropArgs Let" & x & _

" " & y & " " & msg End Property

Public Sub TestProperty()

mdlSample.PropArgs(1, 2) = "ゆっくり" End Sub

(50)

 ByValとByRef

 省略可能な引数

 可変引数

(51)

 ByValは値渡し  引数をコピーして渡している  ユーザー定義型はByValで渡せない  配列はByValで渡せない  ByRefは参照渡し  プロシージャの中で値を変更すると呼び出し元の変数 の中身がかわる  省略された場合はByRefになる  パフォーマンスはByValより良い

ByValとByRefの違い

(52)

Public Sub TestByValByRef() Dim v As Long

v = 1

Call TestByValProc(v) Debug.Print v

End Sub

Private Sub TestByValProc(ByVal v As Long) v = v + 1

End Sub

(53)

Public Sub TestByValByRef() Dim v As Long

v = 1

Call TestByValProc(v) Debug.Print v

End Sub

Private Sub TestByValProc(ByVal v As Long) v = v + 1

End Sub

(54)

Public Sub TestByValByRef() Dim v As Long

v = 1

Call TestByValProc(v) Debug.Print v

End Sub

Private Sub TestByValProc(ByVal v As Long) v = v + 1

End Sub

(55)

Public Sub TestByValByRef() Dim v As Long

v = 1

Call TestByValProc(v) Debug.Print v

End Sub

Private Sub TestByValProc(ByVal v As Long) v = v + 1

End Sub

(56)

Public Sub TestByValByRef() Dim v As Long

v = 1

Call TestByValProc(v) Debug.Print v

End Sub

Private Sub TestByValProc(ByVal v As Long) v = v + 1

End Sub

(57)

Public Sub TestByValByRef() Dim v As Long

v = 1

Call TestByValProc(v) Debug.Print v

End Sub

Private Sub TestByValProc(ByVal v As Long) v = v + 1 End Sub

ByValの例

ByValを引数とするプロシージャを 実行しても呼び出し元は影響を受け ない この例ではvは1になる

(58)

Public Sub TestByValByRef() Dim v As Long

v = 1

Call TestByRefProc(v) Debug.Print v

End Sub

Private Sub TestByRefProc(ByRef v As Long) v = v + 1

End Sub

(59)

Public Sub TestByValByRef() Dim v As Long

v = 1

Call TestByRefProc(v) Debug.Print v

End Sub

Private Sub TestByRefProc(ByRef v As Long) v = v + 1

End Sub

(60)

Public Sub TestByValByRef() Dim v As Long

v = 1

Call TestByRefProc(v) Debug.Print v

End Sub

Private Sub TestByRefProc(ByRef v As Long) v = v + 1

End Sub

(61)

Public Sub TestByValByRef() Dim v As Long

v = 1

Call TestByRefProc(v) Debug.Print v

End Sub

Private Sub TestByRefProc(ByRef v As Long) v = v + 1

End Sub

(62)

Public Sub TestByValByRef() Dim v As Long

v = 1

Call TestByRefProc(v) Debug.Print v

End Sub

Private Sub TestByRefProc(ByRef v As Long) v = v + 1

End Sub

(63)

Public Sub TestByValByRef() Dim v As Long

v = 1

Call TestByRefProc(v) Debug.Print v

End Sub

Private Sub TestByRefProc(ByRef v As Long) v = v + 1 End Sub

ByRefの例

ByRefを引数とするプロシージャを 実行すると呼び出し元は影響を受け てしまう この例ではvは2になる

(64)

Public Sub TestByValByRef() Dim v As Long

v = 1

Call TestNoByValByRefProc (v) Debug.Print v

End Sub

Private Sub TestNoByValByRefProc(v As Long) v = v + 1

End Sub

(65)

VBAはデフォルトは値渡しかと思った?

ざーんねん。

参照渡し

でした

(66)
(67)
(68)

Public Sub TestByValByRef() Dim v As Long

v = 1

Call TestNoByValByRefProc (v) Debug.Print v

End Sub

Private Sub TestNoByValByRefProc(v As Long) v = v + 1

End Sub

(69)

計測方法: a.Long型のByValの引数を持つ関数 b.Long型のByRefの引数を持つ関数 c.String型のByValの引数を持つ関数を1024文字の文字を指定 して実行 d.String型のByRefの引数を持つ関数を1024文字の文字を指定 して実行 ・上記関数をそれぞれ10万回実行した場合の時間を取得 ・これを10回計測する ・テスト用プロシージャは TestPerformValAndRef

ByVal vs ByRef

パフォーマンステスト

(70)

実験環境:

・実装メモリ(RAM) 4.00GB

・プロセッサ:

Intel® Core™ i5 CPU M450 @2.40GHz 2.40GHz ・OS:

Windows 7 Home Premium 64Bit オペレーティングシステム

・Microsoft Office Home and Business2010 バージョン 14.0.6129.5000 (32ビット)

ByVal vs ByRef

(71)

ByVal vs ByRef

パフォーマンステスト

Long型 String型(1024文字)

ByVal ByRef ByVal ByRef

1 0.015625 0.0078125 0.0859375 0.015625 2 0.015625 0.0078125 0.0859375 0.015625 3 0.0234375 0.0078125 0.0859375 0.015625 4 0.0234375 0.0078125 0.0859375 0.015625 5 0.0234375 0.0078125 0.0859375 0.015625 6 0.015625 0.0078125 0.0859375 0.015625 7 0.0234375 0.0078125 0.0859375 0.0234375 8 0.015625 0.0078125 0.0859375 0.015625 9 0.015625 0.0078125 0.09375 0.015625 10 0.015625 0.0078125 0.078125 0.015625 平均 0.01875 0.0078125 0.0859375 0.01640625 最大 0.0234375 0.0078125 0.09375 0.0234375 最小 0.015625 0.0078125 0.078125 0.015625 Long型 ByValは2.4倍 String型 ByValは5.2倍

(72)

・基本はByValを使う ・ユーザー定義型、オブジェクト、配列の場合は ByRefとする ・何千文字も格納されるような文字列な場合は ByRefにしておく ・速度をちょっとでもあげたい場合はByRef ・どっちにしろByVal,ByRefの省略は絶対しない

どちらを使うべきか?

(73)

 Optionalを使用することで引数を省略できる  IsMissing関数は省略しているかどうか判定できる  呼び出し時に名前を指定してプロシージャを実行で きる

省略可能な引数

(74)

Private Sub TestOptionalParam(ByVal p1 As Long, _ Optional ByVal p2 As Long = 5, _ Optional ByVal p3 As Variant) End Sub

(75)

Private Sub TestOptionalParam(ByVal p1 As Long, _ Optional ByVal p2 As Long = 5, _ Optional ByVal p3 As Variant) End Sub

(76)

Private Sub TestOptionalParam(ByVal p1 As Long, _ Optional ByVal p2 As Long = 5, _ Optional ByVal p3 As Variant) End Sub

呼び出し例:

Call TestOptionalParam(1,,”TEST”)

(77)

Private Sub TestOptionalParam(ByVal p1 As Long, _ Optional ByVal p2 As Long = 5, _ Optional ByVal p3 As Variant) End Sub

呼び出し例:

Call TestOptionalParam(1,p3:=”TEST”)

(78)

Private Sub TestOptionalParam(ByVal p1 As Long, _ Optional ByVal p2 As Long = 5, _ Optional ByVal p3 As Variant) If IsMissing(p3) Then Debug.Print "p3は省略" End If End Sub

省略可能な引数の例

IsMissing関数で初期値のないバリア ント型の引数が省略されているかし らべることができる

(79)

Private Sub TestOptionalParam(ByVal p1 As Long, _ Optional ByVal p2 As Long = 5, _ ByVal p3 As Variant) End Sub

省略可能な引数の例

Optionalを指定した後の引数はかな らずOptionalを指定する必要がある この例ではエラーになる

(80)

 呼び出し元ですきな数の引数を指定する  C言語のprintf  ParamArrayキーワードを使用する。  この配列はVariant型  この配列は最後の引数でのみ使用できる  ByVal,ByRef,Optionと共には使用できない

可変引数

(81)

実行例:

Call TestParamArray("ゆっくり", 100, 200, 300) Call TestParamArray("オプーナ", 100, 200)

(82)

Private Sub TestParamArray(ByVal name As String, _ ParamArray vals() As Variant)

Debug.Print name Dim i As Long

For i = LBound(vals) To UBound(vals) Debug.Print vals(i)

Next i End Sub

(83)

Private Sub TestParamArray(ByVal name As String, _ ParamArray vals() As Variant)

Debug.Print name Dim i As Long

For i = LBound(vals) To UBound(vals) Debug.Print vals(i)

Next i End Sub

(84)

実行例:

Call TestParamArray("ゆっくり", 100, 200, 300) Call TestParamArray("オプーナ", 100, 200)

(85)

実行例:

Call TestParamArray("ゆっくり", 100, 200, 300) Call TestParamArray("オプーナ", 100, 200)

(86)

Private Sub TestParamArray(ByVal name As String, _ ParamArray vals() As Variant)

Debug.Print name Dim i As Long

For i = LBound(vals) To UBound(vals) Debug.Print vals(i)

Next i End Sub

(87)

 文字列でプロシージャ名を指定して実行できる

 Applicationオブジェクトが提供している

(88)

Call Application.Run("TestOptionalParam", 1, 2) Dim cll As Collection

Set cll = Application.Run("TestFuncCollection")

(89)

Call Application.Run("TestOptionalParam", 1, 2) Dim cll As Collection

Set cll = Application.Run("TestFuncCollection")

(90)

 Subプロシージャ  Functionプロシージャ  Propertyプロシージャ  引数の指定方法  ByVal,ByRef  省略可能な引数  可変引数

今日勉強したこと

(91)

参照

関連したドキュメント

前章 / 節からの流れで、計算可能な関数のもつ性質を抽象的に捉えることから始めよう。話を 単純にするために、以下では次のような型のプログラム を考える。 は部分関数 (

が前スライドの (i)-(iii) を満たすとする.このとき,以下の3つの公理を 満たす整数を に対する degree ( 次数 ) といい, と書く..

心係数指環の自己同型について 18 国士館大・工 関ロ 勝右 (Ka tsus uke Sekiguchi) Dihedral defect group をもつ integral block に属する p-adic lattice

奥付の記載が西暦の場合にも、一貫性を考えて、 []付きで元号を付した。また、奥付等の数

奥付の記載が西暦の場合にも、一貫性を考えて、 []付きで元号を付した。また、奥付等の数

ここで, C ijkl は弾性定数テンソルと呼ばれるものであり,以下の対称性を持つ.... (20)

“〇~□までの数字を表示する”というプログラムを組み、micro:bit

捕獲数を使って、動物の個体数を推定 しています。狩猟資源を維持・管理してい くために、捕獲禁止・制限措置の実施又