• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:excelvbaでCreateThreadの動作)

excelvbaでCreateThreadの動作

このQ&Aのポイント
  • Excel2007で、VBAを利用した簡単なデータエントリ、管理ソフトを作成しています。ACCESSが無いため、データベースもExcelファイルを使用しています。ADODBで、データベース用のExcelファイルを開くのですが、エントリ数が増えるに従い、openに時間がかかるようになってきました。
  • CreateThreadでスレッドを作成して、connectionOpenのスレッドと、プログレスバーのコントロールを分離しようと作成してみましたが、CreateThreadで作成した方のプログラムがうまいこと動作してくれません。ConnectionOpenをメイン、プログレスバーを別スレッドにしたもの、プログレスバーをメイン、ConnectionOpenを別スレッドにしたものを両方作成してみましたが、どちらも別スレッドにした方がうまく動きません。
  • もしかして、CreateThreadは割り込みがかけられないような状況では別のスレッドは動作しないのでしょうか?また、CreateThreadで作成されたスレッドは、重たい処理は無理なのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • yorozu_ya
  • ベストアンサー率54% (76/140)
回答No.2

> ACCESSが無いため、データベースもExcelファイルを使用しています。 ACCESSが無くてもMDBファイルをデータベースとして扱えますよ。 データ量が多いなら、MDBファイルを使うことを検討してはいかがでしょう。

takotako_agare
質問者

お礼

返信が遅くなりました。 結局、Excelファイルをデータベースファイルとして利用することをあきらめました。 ExcelでMDBを作成し、今までのデータをインポートして利用することができました。 adoで作成していたため、変更箇所も少なく、スムーズに移行しました。 ありがとうございました。

その他の回答 (1)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

先ずCreateThreadで指定するメソッドは 整数のパラメータを1個持ち、整数の値を 返すpascal型でなければなりません。 VBAの関数はpascal型なので無意識でも よいのですが、掲題のCounter2はパラ メータが無く、戻り値がVARIANT型です。 VARIANT型を返す関数は内部的には 戻り値ではなく、値をセットするポインタを パラメータに持つので、形式はたまたま合い ますが、「運よく動いている」だけであり、 好ましい状態ではありません。 VBAおよびオブジェクトの大半はスレッド セーフではありません。よって、VBAを使う マルチスレッドは実行不可能といってよいと 思います。 C言語でDLLを作り、その中でマルチスレッドに することはできます。但し、オブジェクトを スレッド間で使うのはできないと思った方が よいでしょう。スレッド内でオブジェクトの インスタンス化~解放までするなら使用でき ます。しかし、C言語でCOMオブジェクトを扱う のはとても面倒で、VBでやるようなものとは ワケが違います。 MySQLやPostgreSQLなどを使ってDBを構築し、 マルチプロセスでデータをロードすることを 考えてみてはいかがでしょうか。

takotako_agare
質問者

お礼

Excelファイルでデータベースはあきらめました。 他の方の意見を参考に、MDBファイルに移行することにどうにか成功しました。 ありがとうございました。

takotako_agare
質問者

補足

nda23様 早速の回答ありがとうございます。 やはり、VBAでマルチスレッドは難しいのですね。 MySQLなどのフリーソフトや自作Cなどは、会社のセキュリティポリシーの関係で自由な取り扱いができないんです。 業務に必要だからと本社のシステムグループに使用許可をもらうにしても、他のインストール済みソフト(業務用の基幹システム等)への影響や、複数のソフトの組み合わせによる著作権等への影響がないか、あらゆるチェックをしなければ許可は出せないそうです。(実際には影響範囲がチェックしきれないため許可はでない) そのため、VBAであれば前述の問題が発生しないため、VBAのみでどこまでできるかに執着していた次第です。 CounterStartから、Counter2を別スレッドで呼び出すのは、戻り値が整数値ではないためだめなのですね。まぁ、connectionを開くのだからそうですよね。 実際、プログレスバーが動いてもconnectionが開かないので、Counter2が止まっているのは間違いないと思います。 AdoOpenから、Counterを別スレッドで呼び出す方のは、戻り値がVARIANT型ではないですけど、やはり難しいのでしょうか。 ネットで調べた中に、VBですが、フォームに配置したラベルのバックカラーを別スレッドで変更するっていうのがあって、それはExcelVBAでも問題なく動きました。 しかし、質問に記載したもの(フォームに配置したプログレスバーを別スレッドで操作する)を実行すると、メインスレッドのADOCon.openまで来ると、open処理が終了するまで別スレッドに処理がいかないようなんですが。

関連するQ&A