■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(1(左):あまり役立たない - 5(右):大変役立った):
■ ページの共有:
[ サイト内検索 ]
カスタム検索
#4974-0
1フォーム内で複数のプロシージャをCallする時のエラー
ある1つのコマンドボタンをクリックすると、条件別に各ブロックを
処理するようなプログラムを1つのフォームファイルに作りたいのです。
プログラムは以下の通りで、コンパイル後に実行しましたら、
「プロシージャの呼び出し、または引数が不正です」とエラー表示されました。

コールするプロシージャ名は正しいですし、引数は無しです。
(全部を1つのプロシージャに記述すると長くなるため、プロシージャ分割しています)
Callステートメントをリファレンスで読みましたが、
どこをプログラム修正すればいいのか分かりません。
どなたか御教授願います。

Private Sub Command1_Click()
  If 条件1
    Call a_block
  End If
  
  If 条件2
    Call b_block
  End If
  ・・・
End Sub

Private Sub a_block()
  処理A
End Sub

Private Sub b_block()
  処理B
End Sub
・・・
#4975-0
RE#4974:1フォーム内で複数のプロシージャをCallする時のエラー
> コールするプロシージャ名は正しいですし、引数は無しです。
> (全部を1つのプロシージャに記述すると長くなるため、プロシージャ分割しています)
> Callステートメントをリファレンスで読みましたが、
> どこをプログラム修正すればいいのか分かりません。
エラーはどこの行で発生していますか?
また、「条件」には何を記述していますか?
#4978-0
RE#4975:1フォーム内で複数のプロシージャをCallする時のエラー
> > コールするプロシージャ名は正しいですし、引数は無しです。
> > (全部を1つのプロシージャに記述すると長くなるため、プロシージャ分割しています)
> > Callステートメントをリファレンスで読みましたが、
> > どこをプログラム修正すればいいのか分かりません。
>
> エラーはどこの行で発生していますか?

回答の前に、気づいた事を書きます。
Callステートメントの記述部分と、呼ばれるプロシージャの「Private Sub・・・」は変えずに、
呼ばれるプロシージャの内部記述だけ変更して実行したら、うまくCallできました。
内部記述を元に戻して実行すると、やはり同じエラーで呼び出し出来ません。

エラー発生行ですが、「実行時エラー'5';」というのがそれでしょうか?
ですが、5行目(単純にフォームファイルの上から5行目)はコメント文です。
ちなみに、エラー行数というのは、1つのフォームファイルに複数プロシージャがある場合は、
単純に最上段から最下段までプロシージャの数に関係なく通番の行数でしょうか?
それとも、プロシージャ単位での行数でしょうか?(初歩質問で申し訳ありません)

なぜ正常にCallされないのか分かりません。
引き続き、どなたか御教授の程、よろしくお願い致します。m(_ _)m

> また、「条件」には何を記述していますか?

某テキストファイルが空ファイルか否かのチェックです。
具体的には、以下の記述です。
  If FileLen("c:\test\f0502.EDIdat") > 0 Then
    Call Kakutei_Chuumon
  End If
#4980-0
RE#4978:1フォーム内で複数のプロシージャをCallする時のエラー
> Callステートメントの記述部分と、呼ばれるプロシージャの「Private Sub・・・」は変えずに、
> 呼ばれるプロシージャの内部記述だけ変更して実行したら、うまくCallできました。
> 内部記述を元に戻して実行すると、やはり同じエラーで呼び出し出来ません。
> 
> エラー発生行ですが、「実行時エラー'5';」というのがそれでしょうか?
> ですが、5行目(単純にフォームファイルの上から5行目)はコメント文です。
> ちなみに、エラー行数というのは、1つのフォームファイルに複数プロシージャがある場合は、
> 単純に最上段から最下段までプロシージャの数に関係なく通番の行数でしょうか?
> それとも、プロシージャ単位での行数でしょうか?(初歩質問で申し訳ありません)
それは「エラー番号」(エラーの種類)であって、エラー発生個所では有りません。
デバッグ文の挿入、エラートラップ処理の挿入等で
『自分で「エラー発生個所を確認できるような処理」を作り込む』必要が有ります。

また、コンパイルしないでVBの開発環境で実行した場合も同じエラーになるのでしょうか?
#まず、それを確認してください。

> なぜ正常にCallされないのか分かりません。
> 引き続き、どなたか御教授の程、よろしくお願い致します。m(_ _)m
これだけでは何と言えません。

以下は単なる思い付きです。
・分割した、最初のブロックで設定した内容を次のブロックで使用する様な分割になっていませんか?
  (要するに2番目のブロックにデータがわたっていないのでは?と言う事です)
#4981-0
RE#4980:1フォーム内で複数のプロシージャをCallする時のエラー
> それは「エラー番号」(エラーの種類)であって、エラー発生個所では有りません。
> デバッグ文の挿入、エラートラップ処理の挿入等で
> 『自分で「エラー発生個所を確認できるような処理」を作り込む』必要が有ります。

ええ〜っ、そうなんですか???
同じマイクロソフトのVisual InterDevというソフトで簡単なASPを作った経験が少々ありますが、
エラー時はその行数を表示してくれたので、VBでも表示してくれると思っていました・・・

では、仰せの「エラー発生個所確認処理」を一番簡単に作るには、どうすればよいのでしょうか?
(主題から話がソレて申し訳ありません)

> また、コンパイルしないでVBの開発環境で実行した場合も同じエラーになるのでしょうか?
> #まず、それを確認してください。

それはエラーになりません。
コンパイル後にexeファイルを実行してコマンドボタンを押した時だけエラーになります。

> ・分割した、最初のブロックで設定した内容を次のブロックで使用する様な分割になっていませんか?
>  (要するに2番目のブロックにデータがわたっていないのでは?と言う事です)

具体的な現在のソースは以下のようになっています。
呼ばれるa_blockで使う変数AやBらは、このプロシージャで初めて使う変数であり、
呼び出すメインプロシージャから値を受け取る必要は全然ありません。
それでも呼び出し側で引数として全変数を記述するのでしょうか?
(呼ばれるプロシージャで使う変数全部を、呼び出し側の引数欄に書かなければ、正しくCallされませんか?)
この辺のところがよく分かりませんし、本件のカギかもしれません・・・

ちなみに、メインプロシージャでは変数を一切使いません。
プロシージャを分割して必要に応じてCallしている理由は、
全ての記述をメインプロシージャに書くとプログラムが長すぎてしまうからです。
それでは、御回答、よろしくお願いします。

Private Sub Command1_Click() 'メインプロシージャ
  '条件A
  If FileLen("c:\test\f0502.EDIdat") > 0 Then
    Call a_block
  End If

  '条件B
  (以下同様のIFステートメント)
  ・・・   
End Sub

Private Sub a_block
  Dim 変数A,変数B,・・・As String
  ・・・処理内容・・・
End Sub

・・・以下同様なプロシージャが続く
#4992-0
RE#4981:1フォーム内で複数のプロシージャをCallする時のエラー
> ええ〜っ、そうなんですか???
> 同じマイクロソフトのVisual InterDevというソフトで簡単なASPを作った経験が少々ありますが、
> エラー時はその行数を表示してくれたので、VBでも表示してくれると思っていました・・・
> 
> では、仰せの「エラー発生個所確認処理」を一番簡単に作るには、どうすればよいのでしょうか?
> (主題から話がソレて申し訳ありません)
簡単かどうかは置いておいて・・・

−−−−−−−−−−−−−−−−−−
Private Sub Command1_Click() 'メインプロシージャ
  On Error GoTo E   ' エラートラップ定義
  '条件A
1:     ' ラベル1
  If FileLen("c:\test\f0502.EDIdat") > 0 Then
2:     ' ラベル2
    Call a_block
  End If
3:     ' ラベル3
  '条件B
  (以下同様のIFステートメント)
  ・・・   
  Exit Sub   ' 正常処理の終わり
E: ' エラー処理
    MsgBox "[" & Err.Number & "][" & Err.Description & "]Label=[" & Erl & "]"

End Sub

Private Sub a_block
  Dim 変数A,変数B,・・・As String

  On Error GoTo E   ' エラートラップ定義
101: ' ラベル101
  ・・・処理内容・・・

  Exit Sub   ' 正常処理の終わり
E: ' エラー処理
    MsgBox "[" & Err.Number & "][" & Err.Description & "]Label=[" & Erl & "]"

End Sub
−−−−−−−−−−−−−−−−−−
とか適当な間隔でラベルを入れてみるとか・・・
#4994-0
RE#4992:1フォーム内で複数のプロシージャをCallする時のエラー
> > では、仰せの「エラー発生個所確認処理」を一番簡単に作るには、どうすればよいのでしょうか?
> > (主題から話がソレて申し訳ありません)
> 簡単かどうかは置いておいて・・・

ご丁寧な具体例を有り難うございました。

以下は自己レスです。f^_^;  いろいろやっているうちに原因等わかりました。
皆様、どうもお騒がせしました。m(_ _)m

> 呼ばれるa_blockで使う変数AやBらは、このプロシージャで初めて使う変数であり、
> 呼び出すメインプロシージャから値を受け取る必要は全然ありません。
> それでも呼び出し側で引数として全変数を記述するのでしょうか?
> (呼ばれるプロシージャで使う変数全部を、呼び出し側の引数欄に書かなければ、正しくCallされませんか?)
> この辺のところがよく分かりませんし、本件のカギかもしれません・・・ちなみに、メインプロシージャでは変数を一切使いません。
> プロシージャを分割して必要に応じてCallしている理由は、全ての記述をメインプロシージャに書くとプログラムが長すぎてしまうからです。

値を渡さない変数であれば、Callの引数指定をしなくていいみたいですね。
つまり、呼ばれるプロシージャで使う変数全部を、呼び出し側の引数欄に書く必要がないことが分かりました。

最後に、発端となったエラー原因が解明したことを書きます。
Set ot = fs.OpenTextFile("c:\test\f0502.EDIdat", ForReading, False)
の記述で「ForReading」を変数として定義していなかったからです。
(変数定義せずにデフォルトで使えると思い込んでいました。f^_^;)
ForReadingを「1」に変更して実行したら、プログラムは成功しました。
つまり、エラー原因は、ForReadingを変数定義していなかったために
OpenTextFileメソッドがプロシージャ名と認識されてしまったことによるエラーでした。
このページと関連する記事:
#4874-01つのコマンドボタンで複数ブロックを処理する方法は?1999-12-06(月) 15:02
#418-0コールバックとは・・・。2001-07-19(木) 10:30
#21732-0大雑把すぎてすみません2002-07-25(木) 13:52
#16052-0SubプロシージャのCall2000-11-08(水) 12:36
#10058-0RE#10055:早速質問ですが2000-05-02(火) 03:01
#1269-0引数のない Functionプロシージャの呼出について1999-09-04(土) 23:54
#1146-0コンパイル時のメモリ不足エラー2004-02-02(月) 11:41
#8462-0標準モジュールの使い方(制限について)2000-06-01(木) 14:26
#2480-3スタック領域不足を解消するには?2002-08-26(月) 01:50
#44645-0インスタンスの破棄について2001-07-03(火) 14:44
お探しの情報は見つかりましたか?お困りの問題は解決しましたか?
サイト内検索, 似た記事検索で見つからなくてもあきらめずに掲示板で質問してみましょう。
VB初心者友の会があなたのお役に立てれば幸いです。また、本ページの投稿者の方々にこの場を借りて感謝致します。
本ページは過去ログを集めて自動構成しています。よろしければこのページに関するフィードバックをお願いします。
(※ 構成の誤り、広告等の不適切な記事、リンク切れ、読めないページの報告など)