
こんばんは。
何故このような現象が発生するか判らず、
質問致します。
環境は
・WindowsXP Professional
・Excel2003
・ExcelVBA
・参照設定:Microsoft DAO 3.6 Object Library
です。
下記は抜粋した内容ですが、
レコードセットを配列で宣言し、
関数に配列として受け渡しています。
プログラムを作成途中、テストとして実行した所、
「Call test(dbWS, dbWB, dbRes)」
のdbResの所が黄色になり
「ByRef 引数の型が一致しません」
と表示されました。
初めて発生するまでは問題なく動いており、
そこに関するソースの変更をしたわけではないのに発生しました。
また、ソースを変更せず、Excelのシートの追加や削除を行った後、コンパイルを行うと発生したりもします。
その他、そのコンパイルエラーが発生した後に、ファイルを保存し、再度開くと、
再び同じエラーが出る場合と、出ない場合があり、再現性が難しい状態にあります。
色々試したところ、レコードセットを配列で関数に渡さなければ問題がなさそうで、
現在はdbWS、dbWB、dbRes(2)をグローバル変数で宣言し、
関数の引数としては受け渡さず、直接グローバル変数で値を受け渡す回避方法を取っております。
何かこの現象についてご存知の方がいれば教えて頂きたいと思います。
不足している情報がありましたら指摘下さい。
---------------------------------
Sub main()
Dim dbWS As Workspace
Dim dbWB As Database
Dim dbRes(2) As Recordset
'処理
Call test(dbWS, dbWB, dbRes)
End Sub
---------------------------------
Private Function test(ByRef dbWS As Workspace, ByRef dbWB As Database, ByRef dbRes() As Recordset)
'処理
End Function
---------------------------------
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
戻り値がないんだったら Function でなくSubプロシージャで良いような気もしますけど
いや、そこはあまり関係ないところなんでしょうね。
#1回答の前に簡単なmdb読み込みのテストコードで試してみてはいましたが、やはり現象が確認できないんですよね。
DBの種類と、再現する最低限のテストコードがあれば、試せる環境の方がいらっしゃるかもしれませんが...
どうもお力になれないようです。すみません。
あと、KenKen_SPさんではないんですが、
Newキーワードに関してはひょっとしたらADOとの読み違いではないかと思うんです。
DAOでは New Recordset で新規Recordsetはつくれないのですよね。
もしかすると、DAOではなくADOを使ったほうが良いのではというアドバイスかもしれません?
No.2
- 回答日時:
ぱっと見なのですが、main プロシージャで
Dim dbRes(2) As New Recordset
とか
For i=0 to 2
Set dbRes(i) = new Recordset
Next
とか...してますか?
この回答への補足
回答ありがとうございます。
「New」を使っているか?ということで良いでしょうか?
使っていません。
使う方が正しいのでしょうか?使わない方が正しいのでしょうか?
No.1
- 回答日時:
>初めて発生するまでは問題なく動いており、
>そこに関するソースの変更をしたわけではないのに発生しました。
>また、ソースを変更せず、Excelのシートの追加や削除を行った後、コンパイルを行うと発生したりもします。
>
>その他、そのコンパイルエラーが発生した後に、ファイルを保存し、再度開くと、
>再び同じエラーが出る場合と、出ない場合があり、再現性が難しい状態にあります。
再現性が難しいというのは厄介そうですね。
中間コード?とかが関係してたりするんですかね?
http://www.h3.dion.ne.jp/~sakatsu/Excel_Tips13.htm
取り敢えず新規Bookにコードを移植して作り直しておいたほうが良いような気もします。
>関数の引数としては受け渡さず、直接グローバル変数で値を受け渡す回避方法を取っております。
という事で解決されているようなので、それはそれでいいんじゃないでしょうか。
ちょっと試してみてもいいかなと思えるのは、
Call test(dbWS, dbWB, dbRes())
...としてみたり、Function側をVariantで受けてみたり。(全然自信なし)
この回答への補足
早速のご回答ありがとうございました。
確認に時間を取りました。
> 新規Bookにコードを移植して作り直しておいたほうが良いような気もします。
ソースはそのままで移植しましたが、同じエラーが発生しました。
> Call test(dbWS, dbWB, dbRes())
同じエラーが発生しました。
> Function側をVariantで受けてみたり。
「型が一致しません。配列またはユーザー定義型を指定してください。」
と表示されました。
> という事で解決されているようなので、それはそれでいいんじゃないでしょうか。
現在、運用上のソースは先述のままで使用しております。
特に問題なく動いてるので現実問題としてはこのままで良いと思います。
コーディング規約上グローバル変数を多用しないことが推奨されている、
及び今後のために質問を致しました。
dbresを配列の要素(dbres(0)またはdbres(1)、dbres(2))として渡す部分はエラーが発生していませんでした。
なので、
呼び出す側------------------------
Call test(dbWS, dbWB, dbRes(0), dbRes(1), dbRes(2))
----------------------------------
関数定義側------------------------
Private Function test(ByRef dbWS As Workspace, ByRef dbWB As Database, ByRef dbRes0 As Recordset, ByRef dbRes1 As Recordset, ByRef dbRes2 As Recordset)
---------------------------------
とすれば問題ないのかもしれません。
再現性が難しいので、本当にエラーにならない方法であるのかの証明ができませんが…。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) VBAでのMATCH関数 3 2022/10/17 19:06
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Excel(エクセル) excel vba 参照渡しと値渡し 2 2022/04/27 10:45
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c++ , template , ファイル分割...
-
VBAを何回も作り直して、容量が...
-
「fatal error C1189」を回避す...
-
drand48()が使えない
-
VB6とInputManソフトの関係
-
windowsでLinuxで作成したソー...
-
gdbデバッグのためのmakefile作成
-
デコンパイル?について
-
アクセス2003 ファイルの...
-
PRO*C コンパイルエラー
-
ヘルプましんについて教えて下...
-
ILSpyで、デコンパイルできない。
-
C言語でmからnまでの合計を求め...
-
cc hello.cってやっても、、、
-
【VC++6.0(MFC)】警告「LINK : ...
-
ビルドから除外されたソースの...
-
” OS ビルド ” の意味が分か...
-
サンプルスケッチをそのまま使...
-
C++コンパイル時に『 C1083: in...
-
関数形式マクロ
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAを何回も作り直して、容量が...
-
” OS ビルド ” の意味が分か...
-
「fatal error C1189」を回避す...
-
C言語でヘッダファイルにグロー...
-
エクセルVBAではRound...
-
Makefile作成時の拡張子.oとは?
-
ILSpyで、デコンパイルできない。
-
1 つ以上の複数回定義されてい...
-
マクロ コンパイルがグレーバック
-
セミコロンについて
-
外部シンボル "_main"は未解決です
-
C++コンパイル時に『 C1083: in...
-
ビルドとリビルドの違いを教え...
-
コンパイルエラー:ユーザ定義...
-
「DeclareステートメントにPtrS...
-
戻り値について
-
pyc 編集 閲覧
-
PRO*C コンパイルエラー
-
【VC++6.0(MFC)】警告「LINK : ...
-
漢字のコメントをはずすとコン...
おすすめ情報