ボンジュール・マドモアゼル

本サイトの情報は自己責任にてご利用下さい。

[Visual Basic] VBScript 文字列の繰り返し

 
よくある手だが

Replace(String(10,"@"), "@", "Hoge")

[Visual Basic] VBA, VBの Enum 定数の大文字, 小文字の綴りをIDEに認識させる

 
VBA の IDE では Enum 定数の定数名を直打ちすると、
Enumステートメントで定義された通りに大文字・小文字が変換されることはなく、
Enum 定数の定義が、直打ちされた大文字、小文字で上書きされてしまう。
リンク先の方法が使えば、これを防げる。

http://www.geocities.jp/teio_n1976/vb101/001.html
VisualBasic 怒涛のTips101 — 1. Enumで大文字小文字の区別を強制する

リンク先では、IDEの為の変数定義をパブリック変数としているが、
Enum 定数自体パブリックでも、下のようにプライベート変数としても有効。
Public Enum MyEnum

EnumOne = 1
EnumTwo = 2
EnumThree = 3
End Enum

'IDEにEnum定数名の大文字・小文字を認識させる為の対処
#If False Then
Private EnumOne
Private EnumTwo
Private EnumThree
#End If

[Visual Basic] VBバグ? 倍精度浮動小数点数 Double

 
環境 Excel VBA 2000

Public Sub testForNextWithDouble()
    Dim d As Double
    For d = 1000000000.00199 To 1000000000.002 Step 0.000001
        Debug.Print d
    Next
End Sub



結果(イミディエイト・ウィンドウ):
1000000000.00199
1000000000.00199
1000000000.00199
1000000000.00199
1000000000.00199
1000000000.00199
1000000000.002
1000000000.002
1000000000.002
1000000000.002
1000000000.002


おかしいぞ、おかしいぞ。
これがいわゆる「拡張倍精度」という内部表現がなせる技か。
拡張形式絡みの問題は、バグ扱いされてしまうケースがよくある。

[Visual Basic] 銀行家丸め (Banker's Rounding)

 
VBA では、CByte()、CInt()、CLng()、CCur()、Round() の端数処理は、四捨五入ではなく、銀行型丸めとなるそうだ。

銀行家の丸めは、端数が0.5未満なら切り捨て、端数が0.5超なら切り上げ、端数がちょうど 0.5 なら偶数の方に丸められることをいう。

ほかにも、五捨六入, 四捨六入, スウェディッシュ・ラウンディング, 乱数丸めなど様々な端数処理があるようだ。

参考:
Wikipedia
端数処理
1.2.2 最近接偶数への丸め

文書番号: 196652 - 最終更新日: 2004年11月17日 - リビジョン: 3.2
丸めを行うカスタム プロシージャを実装する方法
銀行型丸め
http://support.microsoft.com/default.aspx?scid=kb;ja;196652

[Visual Basic] vb 単精度浮動小数点型 と 倍精度浮動小数点型 の 比較

 
倍精度の値を代入した Variant 型の変数と、単精度の値と比較する際、
どうやら、Variant 型の変数 は、Single型にダウンキャストされるようだ。
以下は、Access 2000 のVBE でテスト。

Public Sub test()
    Dim d As Double
    Dim v As Variant
    Dim s As Single

    d = 1E-40
    v = 1E-40
    s = 9.999946E-41!

    Debug.Print TypeName(v) & vbCrLf

    Debug.Print d = v
    Debug.Print d = s
    Debug.Print v = s
    Debug.Print v = 9.999946E-41!
    Debug.Print v = 9.999946E-41

End Sub


結果(イミディエイ トウィンドウ)
Double


True d = v
False d = s
True v = s
True v = 9.999946E-41!
False v = 9.999946E-41