2009/05/24
Excel VBA の ADO で、メモリリークが発生する
Excel をデータベースとして使用すると、VBA の ADO や DAO でデータを操作した方が便利なことがあります。
例えば、単純にデータの集計をしたり、特定の列のある値の行を選択したい場合は、ADO や DAO で SQL 操作すると結構便利だったりします。
しかしながら、すでに開いている Excel ファイルに対し ADO や DAO による操作をすると、メモリリークが発生するバグがあるようです。
Microsoft ActiveX データ オブジェクト (ADO) を取得すると Excel プロセスで、メモリ リークが Excel で開いている Excel ワークシートから Recordset が発生します。 反復クエリ、最終的に Excel にメモリ不足のため実行しでエラーが発生するか応答を停止したように Excel があります。
[BUG]: ActiveX データ オブジェクト (ADO) を使用して、開いている Excel ワークシートをクエリすると、メモリ リークが発生します。
数回の使用ならば気付かないかもしれませんが、繰り返し UPDATE などで更新をかけたりしていると、ものすごい勢いで使用メモリが増加していきます。
ADO や DAO を使用して Excel を操作する場合は、データファイルを別に用意するなどして、開いている Excel ファイルに対して操作しないように注意する必要がありますね。
2007/11/30
VBAのReplace
VBAには、指定された文字列の一部を、別の文字列で指定された回数分で置換した文字列を返す、Replace 関数があります。
先日、ユーザから入力された文字を、日本語:全角、英数字:半角に整形するモジュールで、「う」が「ウ」に変換されてしまう不具合が見つかりました。
このモジュールではReplace関数を使い、以下のように置換している箇所がありました。
formatString = Replace(strResult, "ウ", "ウ")
指定しているのは半角の「ウ」なのですが、なぜか「う」も置換されてしまいます。
ですので、以下のように、文字列式を評価するときに使用する文字列比較のモードをバイナリ モードで比較するようにして対処しました。
formatString = Replace(strResult, "ウ", "ウ", Compare:=vbBinaryCompare)ラベル: vba
2007/02/06
ExcelVBAでRoundUp、RoundDown
Excelでは、切り捨て、切り上げ、そして四捨五入といったことを、それぞれ、=ROUNDUP()、=ROUNDDOWN()、=ROUND()といった関数を利用して簡単にできます。
これらの関数は非常に便利で、よく利用します。
しかし、VBAでRoundUp(切り上げ)や、RoundDown(切り捨て)をする場合、VBAの標準関数にはこれらの関数はありません。
ですので、Excelのワークシート関数をVBAから呼び出して利用すると良いです。
Application.WorksheetFunction.RoundUp(y, -1)注:ROUND(四捨五入)関数については、ワークシート関数とVBAとで、動作が異なるようです。
詳しくは、[XL2000]VBA の Round とワークシート関数 Round の違いをご覧下さい。
ラベル: vba
