- 未定義関数'Round'エラー。
SP6をあててないと出る。
VB6をWindowsVistaで動かす
- 通常Visble=Trueだけで前面表示されていたExcelが、exe実行の場合前面に表示されない。
<対応策> API関数のSetWindowsPosを使用
VB6でExcel2007を操作する
- 非表示で操作すると、Excel2007のメッセージも非表示になる。
(互換性チェックメッセージとか。タスクマネージャーを起動するとわかる)
- 互換性チェックメッセージボックスが出ても保存を行うには。
If Val(objXL.Application.Version) > 11 Then 'Excelのバージョン確認
objXL.Application.ActiveWorkbook.CheckCompatibility = False '互換性チェックを外す
End If
objXL.Application.ActiveWorkbook.Save
If Val(objXL.Application.Version) > 11 Then
objXL.Application.ActiveWorkbook.CheckCompatibility = True '互換性チェックを規定値に戻す
End If
- グラフを含んだExcel2000形式のブックをExcel2007で表示し保存するには。
保存時に 「現在の形式では保存できません。変更を保存するには[OK]をクリックし、最新の形式で保存してください。」 と表示される。 VBから非表示でExcel操作を行っている場合はこのメッセージが表示されないので、 Application.DisplayAlert = Falseにして、SaveAs [ファイル形式]=xlExcel8とする。
印刷
- PrtScreenした画像をプリンタに印刷実行させようとするとスプール中のままになる。
Printer.EndDocが実行されない?? 1行ずつコードを実行させると印刷できる <対応策> クリップボードから値をとるときや、EndDocの前にDoEventsやSleep制御を入れる
- UIPI
UIPIとは、アプリケーション実行時の権限(UI特権レベル)を3つに分けて、権限の低いプロセス(※)から、権限の高いプロセスへの操作を防止する機能です。(※プロセスとはアプリケーションの実行単位です。例えばメモ帳を2つ起動すると、メモ帳のプロセスが2つできることになります。)
Vistaにおいて UI特権は以下の3つに分けられます。
高IL 管理者権限 重要なシステムへの変更が許可されたプロセス。起動前にUACにより警告ダイアログが表示される。
中IL 標準権限 一般的なプロセス。通常アプリケーションはこの権限で実行される。
低IL 限られた領域のみに書き込みが制限されたプロセス。Internet Explorer7の保護モードなど。
例えば、標準権限プロセスから、同じく標準権限のプロセスや、低ILのプロセスを操作することはできますが、管理者権限のプロセスを操作することはできません。これによって、悪意をもったソフトが、管理者権限のプロセスにメッセージを送って操作する攻撃等を防止しています。
中IL 標準権限 一般的なプロセス。通常アプリケーションはこの権限で実行される。
低IL 限られた領域のみに書き込みが制限されたプロセス。Internet Explorer7の保護モードなど。
例えば、標準権限プロセスから、同じく標準権限のプロセスや、低ILのプロセスを操作することはできますが、管理者権限のプロセスを操作することはできません。これによって、悪意をもったソフトが、管理者権限のプロセスにメッセージを送って操作する攻撃等を防止しています。
VB6.0の型
integer 整数 (-32768 ~ 32767) S9(04)
long 整数 (-2147483648 ~ 2147483647) S9(09)
single 単精度 (-999999. ~ 999999.) S9(06).
double 倍精度 (-9999999999999999. ~ 9999999999999999.) S9(16).
【浮動小数点】single と double タイプは浮動少数点を持つ。
ここで気をつけるのは、double の有効 16 桁を全て整数で使
用した場合の小数点以下はないと言うこと。
小数点以下 4 桁の精度を確保しようとすると、整数部分は 12
桁以下でなければならない。
boolean (BOOL 値 true か false のみ記憶可能)
byte (1 バイト) X(01)
string 文字 (1 ~ 32767 文字) X(??)
string *文字 (1 ~ 32767 文字固定長) X(??)
【可変長文字変数】string は基本的に渡される文字の長さによって可変長の
長さを持つ。
dim a as string * 6
と長さを指定したときは、固定長文字変数となる。
currency 通貨型 (-922,337,203,685,477.5808 ~ 922,337,203,685,477.5807)
【固定小数点】通貨型は、64 bits で記憶される整数部 15 桁、小数部 4 桁
固定の変数である。
数値計算
電卓と基本的に違うのが、パソ系は数値演算を 2 進演算でやると言うことで
す。10 進演算、BCD 演算などと明記されてない場合は、すべて 2 進演算が使
用されています。
この場合、整数の演算においてはなんらの問題も出ないのですが、小数点を含
む演算において微妙な誤差が出て来ます。
(例: 0.01 を単精度変数に 10 回足すと、9.999999E-02 となって、0.1 には
ならない。9.999999E-02 = 0.09999999)
【コツ1】
小数点同士の計算は行わない。
一度整数にした後、計算し、最後に少数に戻す。
但し、完全には回避できない場合があります。
dim a as long
dim b as long
dim c as double
dim i as integer
a = 0.01 * 100
b = 0
for i = 1 to 10
b = b + a
next
c = b / 100
【コツ2】
VB6 では、variant で 10 進数を保持できます。
cdec() をうまく利用すると、誤差のない数値計算が可能です。
Currency型
たとえば、「Currency型 + Currency型」の演算結果は Currency型ですが、
「Currency型 / Currency型」の演算結果は、Double型となるため、
単純に割り算などを行ってしまうと、結局は誤差を生じる可能性があります。
「Currency型 * Currency型」の演算結果はCurrency型
「Currency型 / Currency型」の演算結果は、Double型となるため、
単純に割り算などを行ってしまうと、結局は誤差を生じる可能性があります。
「Currency型 * Currency型」の演算結果はCurrency型