- 未定義関数'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型