いつもここで勉強させていただいています。
今回、類似した入力フォームが2つあり、入力項目をチェックする
プログラムを共通化したく次のようにしました。
'#### Form1 モジュール
Private Sub Command1_Click()
RTN = COMMON_CHECK("Form1")
If RTN = "ERROR" Then 入力エラー警告
End Sub
'#### Form2 モジュール
Private Sub Command1_Click()
RTN = COMMON_CHECK("Form2")
If RTN = "ERROR" Then 入力エラー警告
End Sub
'#### 標準モジュール
Function COMMON_CHECK(F_NO As String)
With F_NO ←ここが誤り???
'共通チェック処理
'例(数字が入力されていればエラー)
If IsNumeric(.Text1.Text) Then COMMON_CHECK = "ERROR"
End With
End Function
たぶんWith のあとの変数でFormの名前を宣言できないだろうなぐらいは
思っていましたがやっぱり無理でした。
代替案として
'#### 標準モジュール
Function COMMON_CHECK(F_NO As String)
Select Case F_NO
Case "Form1"
With Form1
Case "Form2"
With Form2
End Select
End Function
としてみましたが「Select Case に対応する Case がありません。」
のエラーがでてしまいました。
前半は理解できるのですが後半のエラーが理解できません。
できれば代替案より前半のフォーム名を変数で宣言できる方法がわかれ
ばありがたいのですが・・・ With ○○○
あと後半の方法でCase のあとは、実行文しかダメなのでしょうか。
よろしくお願いします。
渡すのはフォーム名ではなく、フォームを参照しているオブジェクト変数なのでは?
-訂正分-
> RTN = COMMON_CHECK("Form1")
> RTN = COMMON_CHECK("Form2")
これらを、
RTN = COMMON_CHECK(Me)
> Function COMMON_CHECK(F_NO As String)
これを、
Function COMMON_CHECK(F_NO As form)
としてください。
でコンパイルエラーの件ですが、
> '#### 標準モジュール
> Function COMMON_CHECK(F_NO As String)
> Select Case F_NO
> Case "Form1"
> With Form1
> Case "Form2"
> With Form2
> End Select
> End Function
>
> としてみましたが「Select Case に対応する Case がありません。」
> のエラーがでてしまいました。
> 前半は理解できるのですが後半のエラーが理解できません。
With-End With、は制御構造です。
んー…まぁ、
select case ..
case ..
[ここの間に with-end with制御構造を入れる]
case ...
end select
という風にしてください。
簡単に言えば、
・複数行にわたっているFor-Next、Select Case-Case-End Select、Do-Loop、With-End Withなどの
ステートメントは、互いにまたがって使わないようにする。
様にしておけば、とりあえず間違いはありません。(限界に挑戦するとかしない限り、そんな使い方はないでしょう)
※言語仕様がはっきりしているJavaとかだったら、
ブロックステートメント同士はまたがない、という風になるのかなぁ…
ぁぁ、風邪で喉が痛い(orz
ガッさま いつもありがとうございます。
>RTN = COMMON_CHECK(Me)
>Function COMMON_CHECK(F_NO As form)
で解決しました。ありがとうございました。
ちなみに違う処理で、都合上、標準モジュールから
同Function COMMON_CHECKを利用するケースもありま
した。
フォームモジュールからはRTN = COMMON_CHECK(Me)って
ことで、自分なりの応用で標準モジュールからは、
RTN = COMMON_CHECK(Form1)
RTN = COMMON_CHECK(Form2)としてみましたが、
COMMON_CHECK側で、.Text1.tex = ・・・・で
「オブジェクトが必要です」のエラーが出てしまいます。
追加質問で申し訳ありませんがご教授ねがいませんか。
追伸:ガッさま、最近まあるくなってません。
ガッさま独特の痛烈な指導口調がなんかまあるく
なってちょっと寂しく思っていました。
失礼なこと書きましたゴメンなさい。
>>で解決しました
つ【解決】わすれもの
>>「オブジェクトが必要です」のエラーが出てしまいます。
>>渡すのはフォーム名ではなく、フォームを参照しているオブジェクト変数なのでは?
↑読んだ?
ガッさま・通ってみたさま ありがとうございました。
きっとスマートな方法ではないのでしょうが・・・。
'### 標準モジュール
Public F_NAME1 As Form
Public F_NAME2 As Form
'### フォーム1モジュール
Private Sub Form_Load()
Set F_NAME1 = Me
End Sub
'### フォーム2モジュール
Private Sub Form_Load()
Set F_NAME2 = Me
End Sub
どのモジュールでもMeの代わりに利用できる
ようになりました。
素人が一生懸命考えてたどりつきましたが、自慢できる
スマートな方法ではないだろうなってなんとなくそんな
気がします。
これからももっともっと勉強していこうと思いますので
よろしくお願いします。
自信を持って解決とはいきませんが、とりあえず解決と
させていただきます。
解決ですが・・・・、
私と同様の初心者の方、この方法は真似ないでもっとい
い方法を考えられたほうがいいと思います。
失礼しました。
解決済のようですが、私はこんな感じをお勧めします。
フォームまるごとじゃなくて、必要なものだけ渡してやれば良いです。
チェックする項目が多いなら配列で渡してやるのもいいかも。
'#### Form1 モジュール
Private Sub Command1_Click()
RTN = COMMON_CHECK(Me.Text1.Text)
If RTN = "ERROR" Then 入力エラー警告
End Sub
'#### Form2 モジュール
Private Sub Command1_Click()
RTN = COMMON_CHECK(Me.Text1.Text)
If RTN = "ERROR" Then 入力エラー警告
End Sub
'#### 標準モジュール
Function COMMON_CHECK(txt As String) As String
'共通チェック処理
'例(数字が入力されていればエラー)
If IsNumeric(txt) Then COMMON_CHECK = "ERROR"
End Function
ツイート | ![]() |