数字を扱う変数needtec.sakura.ne.jp/vba/lesson/excelvba002.pdf『0.1を十回足しても1にならない。...

77
数字を扱う変数

Upload: others

Post on 30-Jan-2021

0 views

Category:

Documents


0 download

TRANSCRIPT

  • 数字を扱う変数

  • 整数の型

    少数点を含む型

    目的

  • 整数の型の種類

    Byte

    Integer

    Long

    LongLong(64bit版のみ)

  • 整数の型の種類

    Byte

    Integer

    Long

    LongLong(64bit版のみ)

    バイト型 サイズ:1バイト 範囲 0~255

  • 整数の型の種類

    Byte

    Integer

    Long

    LongLong(64bit版のみ)

    長整数型 サイズ:4バイト 範囲 -2,147,483,648~2,147.483,647

  • 整数の型の種類

    Byte

    Integer

    Long

    LongLong(64bit版のみ)

    整数型 サイズ:2バイト 範囲 -32,768~32,767

  • 整数の型の種類

    Byte

    Integer

    Long

    LongLong(64bit版のみ)

    長整数型 サイズ:4バイト 範囲 -2,147,483,648~2,147,483,647

  • 整数の型の種類

    Byte

    Integer

    Long

    LongLong(64bit版のみ)

    多倍長整数型 サイズ:8バイト 範囲 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

  • 整数型の使用例

  • 整数型の使用例

  • Public Sub TestIntegerDataType()

    End Sub

    整数型の使用例

  • ‘整数型の使用例

    Public Sub TestIntegerDataType()

    End Sub

    整数型の使用例

  • '整数型の使用例

    Public Sub TestIntegerDataType()

    Dim bytData as Byte

    End Sub

    整数型の使用例

  • '整数型の使用例

    Public Sub TestIntegerDataType()

    Dim bytData as Byte

    End Sub

    整数型の使用例

  • '整数型の使用例

    Public Sub TestIntegerDataType()

    Dim bytData as Byte

    End Sub

    整数型の使用例

  • '整数型の使用例

    Public Sub TestIntegerDataType()

    Dim bytData as Byte

    End Sub

    整数型の使用例

  • '整数型の使用例

    Public Sub TestIntegerDataType()

    Dim bytData as Byte

    Debug.Print "bytDataの内容:" & bytData

    End Sub

    整数型の使用例

  • '整数型の使用例

    Public Sub TestIntegerDataType()

    Dim bytData as Byte

    Debug.Print "bytDataの内容:" & bytData

    End Sub

    整数型の使用例

  • '整数型の使用例

    Public Sub TestIntegerDataType()

    Dim bytData as Byte

    Debug.Print "bytDataの内容:" & bytData

    End Sub

    整数型の使用例

  • '整数型の使用例

    Public Sub TestIntegerDataType()

    Dim bytData as Byte

    Dim lngData as Long

    Debug.Print "bytDataの内容:" & bytData

    Debug.Print "lngDataの内容:" & lngData

    End Sub

    整数型の使用例

  • '整数型の使用例

    Public Sub TestIntegerDataType()

    Dim bytData as Byte

    Dim lngData as Long

    Debug.Print "bytDataの内容:" & bytData

    Debug.Print "lngDataの内容:" & lngData

    End Sub

    整数型の使用例

  • '整数型の使用例

    Public Sub TestIntegerDataType()

    ‘ ~ ( 省略 ) ~

    bytData = 123

    lngData = 8000

    Debug.Print “変更後bytDataの内容:" & bytData

    Debug.Print "変更後lngDataの内容:" & lngData

    End Sub

    整数型の使用例

  • '整数型の使用例

    Public Sub TestIntegerDataType()

    Dim bytData as Byte

    Dim lngData as Long

    Debug.Print "bytDataの内容:" & bytData

    Debug.Print "lngDataの内容:" & lngData

    End Sub

    整数型の使用例

  • '整数型の使用例

    Public Sub TestIntegerDataType()

    ‘ ~ ( 省略 ) ~

    bytData = 110105

    lngData = 8000

    Debug.Print “変更後bytDataの内容:" & bytData

    Debug.Print "変更後lngDataの内容:" & lngData

    End Sub

    整数型の使用例

  • '整数型の使用例

    Public Sub TestIntegerDataType()

    ‘ ~ ( 省略 ) ~

    bytData = 110105

    lngData = 8000

    Debug.Print “変更後bytDataの内容:" & bytData

    Debug.Print "変更後lngDataの内容:" & lngData

    End Sub

    整数型の使用例

  • 小数点を含む型の種類

    固定小数点

    Currency

    浮動小数点

    Single

    Double

  • 小数点を含む型の種類

    固定小数点

    Currency

    浮動小数点

    Single

    Double

    固定小数点とは、ある桁に小数点が固定されている。

    計算誤差をしてはいけないときに使う。

  • 小数点を含む型の種類

    固定小数点

    Currency

    浮動小数点

    Single

    Double

    浮動小数点は一定の範囲内の誤差で近い数値に近似できる。 極端な数値を扱う分野で使う。

  • 小数点を含む型の種類

    固定小数点

    Currency

    浮動小数点

    Single

    Double

    通貨型 サイズ:8バイト 範囲 -922,337,203,685,477.5808 ~922,337,203,685,477.5807

  • 小数点を含む型の種類

    固定小数点

    Currency

    浮動小数点

    Single

    Double

    単精度浮動小数点数型 サイズ:4バイト 負の値の範囲 :-3.402823E38 ~ -1.401298E-45 正の値の範囲 :1.401298E-45 ~ 3.402823E38

  • 小数点を含む型の種類

    固定少数点

    Currency

    浮動小数点

    Single

    Double

    単精度浮動小数点数型 サイズ:4バイト 負の値の範囲 :-3.402823E38 ~ -1.401298E-45 正の値の範囲 :1.401298E-45 ~ 3.402823E38

    1.401298E-45 →1.401298× 10-45

    小数点以下がごく細かい

  • 小数点を含む型の種類

    固定少数点

    Currency

    浮動小数点

    Single

    Double

    単精度浮動小数点数型 サイズ:4バイト 負の値の範囲 :-3.402823E38 ~ -1.401298E-45 正の値の範囲 :1.401298E-45 ~ 3.402823E38

    3.402823E38 →3.402823× 1038

    すごく大きい桁

  • 小数点を含む型の種類

    固定小数点

    Currency

    浮動小数点

    Single

    Double

    単精度浮動小数点数型 サイズ:4バイト 負の値の範囲 :-3.402823E38 ~ -1.401298E-45 正の値の範囲 :1.401298E-45 ~ 3.402823E38

  • 小数点を含む型の種類

    固定小数点

    Currency

    浮動小数点

    Single

    Double

    倍精度浮動小数点数型 サイズ:8バイト 負の値の範囲 :-1.79769313486231E308 E308 ~ -4.94065645841247E-324 正の値の範囲 :4.94065645841247E-324 ~1.79769313486231E308 E308

  • Public Sub TestDoubleDataType()

    Dim data As Double

    Dim i As Long

    data = 0

    For i = 1 To 10

    data = data + 0.1

    Next i

    If data = 1 Then

    Debug.Print "フフフ計画通り..." & data

    Else

    Debug.Print "げせぬ..." & data

    End If

    End Sub

  • Public Sub TestDoubleDataType()

    Dim data As Double

    Dim i As Long

    data = 0

    For i = 1 To 10

    data = data + 0.1

    Next i

    If data = 1 Then

    Debug.Print "フフフ計画通り..." & data

    Else

    Debug.Print "げせぬ..." & data

    End If

    End Sub

  • Public Sub TestDoubleDataType()

    Dim data As Double

    Dim i As Long

    data = 0

    For i = 1 To 10

    data = data + 0.1

    Next i

    If data = 1 Then

    Debug.Print "フフフ計画通り..." & data

    Else

    Debug.Print "げせぬ..." & data

    End If

    End Sub

  • Public Sub TestDoubleDataType()

    Dim data As Double

    Dim i As Long

    data = 0

    For i = 1 To 10

    data = data + 0.1

    Next i

    If data = 1 Then

    Debug.Print "フフフ計画通り..." & data

    Else

    Debug.Print "げせぬ..." & data

    End If

    End Sub

  • Public Sub TestDoubleDataType()

    Dim data As Double

    Dim i As Long

    data = 0

    For i = 1 To 10

    data = data + 0.1

    Next i

    If data = 1 Then

    Debug.Print "フフフ計画通り..." & data

    Else

    Debug.Print "げせぬ..." & data

    End If

    End Sub

  • Public Sub TestDoubleDataType()

    Dim data As Double

    Dim i As Long

    data = 0

    For i = 1 To 10

    data = data + 0.1

    Next i

    If data = 1 Then

    Debug.Print "フフフ計画通り..." & data

    Else

    Debug.Print "げせぬ..." & data

    End If

    End Sub

  • あ…ありのまま今起こったことを話すぜ

    『0.1を十回足しても1にならない。

    でも表示だけは1のふりをする』

    な…なにを言っているのか

    わからねーとおもうが、

    おれも何をされたかわからなかった…

    頭がどうにかなりそうだった…

    計算誤差とか

    チャチナもんじゃあ 断じてねぇ

    もっと恐ろしいものの片鱗を味わったぜ…

  • Public Sub TestDoubleDataType()

    Dim data As Double

    Dim i As Long

    data = 0

    For i = 1 To 10

    data = data + 0.1

    Next i

    If data = 1 Then

    Debug.Print "フフフ計画通り..." & data

    Else

    Debug.Print "げせぬ..." & data

    End If

    End Sub

  • Public Sub TestCurrencyDataType()

    Dim data As Currency

    Dim i As Long

    data = 0

    For i = 1 To 10

    data = data + 0.1

    Next i

    If data = 1 Then

    Debug.Print "フフフ計画通り..." & data

    Else

    Debug.Print "げせぬ..." & data

    End If

    End Sub

  • Public Sub TestCurrencyDataType()

    Dim data As Currency

    Dim i As Long

    data = 0

    For i = 1 To 10

    data = data + 0.1

    Next i

    If data = 1 Then

    Debug.Print "フフフ計画通り..." & data

    Else

    Debug.Print "げせぬ..." & data

    End If

    End Sub

  • 整数の型

    少数点を含む型

    きょう勉強したこと

  • 整数の型

    少数点を含む型

    きょう勉強したこと

  • Interger型さんディスンなよ

    バカなの?

    アホなの?

    ワゴンなの?

    質問1

  • 質問にかこつけて

    神ゲーをディスるとは

    汚いな

    さすがInteger

    汚い

    回答1

  • 俺はこれでInteger型 嫌いになったな

    俺は中立の立場で 見てきたけど、

    やはりLong型中心に いったほうがいい事が

    判明した

    回答1

  • あと、OfficeXP時代の

    ドキュメントに

    Long型の方がちょっと

    効率がいいとあった

    これはもう、Long型が

    いいのは確定的に明か

    回答1

  • The Integer, Long, and Byte Data Types

    http://msdn.microsoft.com/en-us/library/aa164754%28office.10%29.aspx

  • Traditionally, VBA programmers have used integers to hold

    small numbers, because they required less memory.

    The Integer, Long, and Byte Data Types

    http://msdn.microsoft.com/en-us/library/aa164754%28office.10%29.aspx

    伝統的にVBAプログラマは小さい数を保持してInteger型を使った

    なぜならば、(Long型にくらべて)メモリの要求が少なかったからだ。

  • In recent versions, however, VBA converts all integer values

    to type Long, even if they are declared as type Integer.

    The Integer, Long, and Byte Data Types

    http://msdn.microsoft.com/en-us/library/aa164754%28office.10%29.aspx

    しかしながら、最近のバージョンでは、VBAはすべての整数

    の値をLong型に変換する。たとえそれがInteger型で宣言されて

    いたとしてもだ。

  • Therefore, there is no longer a performance advantage to

    using Integer variables

    The Integer, Long, and Byte Data Types

    http://msdn.microsoft.com/en-us/library/aa164754%28office.10%29.aspx

    したがってもはやInteger型の宣言にパフォーマンス上の有利は

    ない。

  • in fact, Long variables might be slightly faster because VBA

    does not have to convert them.

    The Integer, Long, and Byte Data Types

    http://msdn.microsoft.com/en-us/library/aa164754%28office.10%29.aspx

    実際、Long型の変数が多少早いかもしれない。

    なぜならVBAがそれらを変換するような必要がないからだ。

  • Integer vs Long パフォーマンステスト

    参考:

    「VBA性能向上委員会」

    Integer型とLong型はどちらを使うべき?

    http://www.banana-juice.com/VBA/Performance/Statement/IntLong.html

  • 計測方法:

    ・-32,768~32,767までのループで和、差、積、商、余の計算する。

    ・これを100回くりかえした時にかかった時間を出力する。

    ・時間の出力にはTimerを使用する

    ・以上を1セットとして、これを10セット行う。

    ・このアルゴリズムはInteger,Long共有である。

    このプログラムは今回のサンプル用のワークブックにある。

    mdlPerformanceTest. TestPerformance()を参照のこと。

    Integer vs Long パフォーマンステスト

  • 実験環境:

    ・実装メモリ(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ビット)

    Integer vs Long パフォーマンステスト

  • (-) Integer(Sec) Long(Sec)

    (1) 0.7333984 0.7177734

    (2) 0.734375 0.7324219

    (3) 0.7490234 0.7333984

    (4) 0.7490234 0.7333984

    (5) 0.7636719 0.7177734

    (6) 0.7490234 0.7333984

    (7) 0.7324219 0.71875

    (8) 0.7470703 0.734375

    (9) 0.7480469 0.734375

    (10)0.7480469 0.7333984

    (平均) 0.74541015625 0.72890625

    Integer vs Long パフォーマンステスト

    実行結果:

    Long型で

    2.2%程度の

    速度向上

    Long平均 ÷ Integer平均 × 100 ≒97.78%

  • まぁ、Long型さん

    まじぱねぇって

    ことだ

    回答1

  • 変数名の制限ってなぁに?

    質問2

  • Visual Basic Naming Rules

    ってドキュメントに

    書いてある

    回答2

    http://msdn.microsoft.com/en-us/library/office/gg264773%28v=office.14%29.aspx

  • ルール1

    最初は文字ではじめる

    数字とか記号だめよ

    回答2

  • ルール2

    次の記号は使わない

    スペースと

    .!@&$#

    回答2

  • ルール3

    255文字を超えるな

    回答2

  • ルール4

    VBA中の

    関数や命令と

    同じ名前つけない

    ほうがいい

    回答2

  • ルール5

    同じスコープレベル

    で同じ名前使うな

    回答2

  • あれ?

    さっきのルール1で「文字」

    っていったよね。

    質問3

  • もしかして漢字や平仮名もry

    質問3

  • そ、そんな変数名に

    漢字や平仮名なんて

    使うわけないから

    わからないお

    回答3

  • 常識的に考えて

    変数名にそんな物が

    設定できるわけないお

    回答3

  • 数字を扱う変数