With のあとを変数で

解決


もこ  2005-08-14 17:48:48  No: 124086

いつもここで勉強させていただいています。
今回、類似した入力フォームが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 のあとは、実行文しかダメなのでしょうか。
よろしくお願いします。


ガッ  2005-08-14 18:38:00  No: 124087

渡すのはフォーム名ではなく、フォームを参照しているオブジェクト変数なのでは?

-訂正分-
> 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


もこ  2005-08-14 20:24:58  No: 124088

ガッさま  いつもありがとうございます。

>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 = ・・・・で
「オブジェクトが必要です」のエラーが出てしまいます。
追加質問で申し訳ありませんがご教授ねがいませんか。

追伸:ガッさま、最近まあるくなってません。
      ガッさま独特の痛烈な指導口調がなんかまあるく
      なってちょっと寂しく思っていました。
      失礼なこと書きましたゴメンなさい。


通ってみた  2005-08-15 02:43:46  No: 124089

>>で解決しました
つ【解決】わすれもの

>>「オブジェクトが必要です」のエラーが出てしまいます。

>>渡すのはフォーム名ではなく、フォームを参照しているオブジェクト変数なのでは?
↑読んだ?


もこ  2005-08-16 05:12:28  No: 124090

ガッさま・通ってみたさま  ありがとうございました。
きっとスマートな方法ではないのでしょうが・・・。

'### 標準モジュール
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の代わりに利用できる
ようになりました。
素人が一生懸命考えてたどりつきましたが、自慢できる
スマートな方法ではないだろうなってなんとなくそんな
気がします。
これからももっともっと勉強していこうと思いますので
よろしくお願いします。
自信を持って解決とはいきませんが、とりあえず解決と
させていただきます。

解決ですが・・・・、
私と同様の初心者の方、この方法は真似ないでもっとい
い方法を考えられたほうがいいと思います。
失礼しました。


LESIA  2005-08-16 20:05:59  No: 124091

解決済のようですが、私はこんな感じをお勧めします。
フォームまるごとじゃなくて、必要なものだけ渡してやれば良いです。
チェックする項目が多いなら配列で渡してやるのもいいかも。

'#### 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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加