ラベル vba の投稿を表示しています。 すべての投稿を表示
ラベル vba の投稿を表示しています。 すべての投稿を表示

2009/05/24

Excel VBA の ADO で、メモリリークが発生する

BUG: Memory leak occurs when you query an open Excel worksheet by using ActiveX Data Objects (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 ファイルに対して操作しないように注意する必要がありますね。

参考:■ADOのメモリリーク - 半角チルダ

2007/11/30

VBAのReplace

VBAには、指定された文字列の一部を、別の文字列で指定された回数分で置換した文字列を返す、Replace 関数があります。



先日、ユーザから入力された文字を、日本語:全角、英数字:半角に整形するモジュールで、「う」が「ウ」に変換されてしまう不具合が見つかりました。

このモジュールではReplace関数を使い、以下のように置換している箇所がありました。


formatString = Replace(strResult, "ウ", "ウ")


指定しているのは半角の「ウ」なのですが、なぜか「う」も置換されてしまいます。



ですので、以下のように、文字列式を評価するときに使用する文字列比較のモードをバイナリ モードで比較するようにして対処しました。


formatString = Replace(strResult, "ウ", "ウ", Compare:=vbBinaryCompare)

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 の違いをご覧下さい。