• ベストアンサー

frm型への代入の仕方について

仕事でVisual Basicをつかっているのですが、一点質問があります。 frm型で宣言されたfrmTestに実際VBPに存在するForm1というのは、 Dim frmTest As Form Set frmTest = Form1 でセットすることができたのですが、 私がしたいことは、 Form1の部分を流動的に変更できるように、文字型の変数に置き換えたいのです。 Dim strForm As String Dim frmTest As Form strForm = "Form1" Set frmTest = strForm といったような事をしたいのですが、うまくいきません。 何か良い方法をご存知の方がいらっしゃいましたら、教えてください。よろしくお願いいたします。

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

  • ベストアンサー
noname#22222
noname#22222
回答No.5

s_husky です。 VB6.0をインストールして動作確認しております。 GetForm()->FromIndex()と名前を変更しましたが、役割りは同じです。 <使用例1> Forms (FormIndex("Form1")) <使用例2> Public Const conFORM = "Form2" Forms (FormIndex(conFORM)) ※記号定数を利用する手もありそうです。 <文字列で指定されたFormのIndexを取得する関数> Public Function FormIndex(ByVal frmName As String) As Integer   Dim I As Integer   Dim J As Integer      J = Forms.Count - 1   For I = 0 To J     If Forms(I).Name = frmName Then       FormIndex = I       Exit For     End If   Next I End Function ※該当するフォームが見つからない場合は0が戻ります。 ※該当するフォームが見つからない場合は-1を返す必要があれば修正して下さい。

stucklife554
質問者

お礼

遅くなりました。親切丁寧なご回答をありがとうございました。早速試してみます。

その他の回答 (4)

noname#22222
noname#22222
回答No.4

s_husky です。 判りました。思いもよらないことでした。 問題は、関数化にあるり、Access2003との差異は問題ではないというのは乱暴でした。不遜な回答をしたことを謝っておきます。「文字列でAccess2003みたいに宣言したい」というのが主旨ですね。VBとExcel、Accessの差を無くせば済むだけのようですね! Set frm = Forms(GetForm("Form2")) GetForm関数の作成要領を示せ! と解釈しました。 この解釈に間違いがなければ補足は不要です。 なお、ここまでで回答内容が推測されて、「もっといい手がある」という方は、アドバイスしてやって下さい。 少々、お待ち下さい。 只今、酒が入っています。 遅くとも、明日、10時には回答します。

noname#22222
noname#22222
回答No.3

s_husky です。 関数の意図が伝わらなかったようですね!そこで、質問です。 (1)何がしたいのですか? ・オープン済みのフォームのインスタンスを宣言したい。 ・オープンしていないフォームをオープンしたい。 (2)フォームもVBからみたらオブジェクトである点は理解していますか? (3)オブジェクトの構造とメソッド等の知識はありますか? *補足を受けて、VBでテスト関数を作成します。

stucklife554
質問者

補足

たびたび、お手数かけます。 質問に答えさせていただきます。 4つのVBPで使う共通の標準モジュールを作成しているのですが、それぞれのVBPで使うフォームは異なります。 ですので、VBPに存在しないフォーム名をSetするとエラーで落ちるので、String型の変数でフォーム名をSetしたいという話になりました。 また最近、VBをはじめたもので知識に欠ける部分が多々あります。 ご面倒おかけします。 よろしくお願いします。

noname#22222
noname#22222
回答No.2

Public Function OpenForm(ByVal frmName As String) As Boolean Dim frm As Form Set frm = Forms(frmName) MsgBox frm.Caption End Function プログラムコードにフォーム名を埋め込むのではなく、フォーム名を指定したら対応するインスタンスを作成する汎用のルーチン=関数を作成するには?と問題を立て直すと質問者の実力では、即、解決するはずですが? もちろん、 Public Function OpenForm(ByVal frm As Form) As Boolean End Function とフォームそのものを渡せば、Set文そのものが省けます。 なお、Access2003でテストしていますのでVBではしかるべく!

stucklife554
質問者

補足

ご回答ありがとうございます。 試してみたのですが、 Set frm = Forms(frmName)  ← この部分で、「型が一致しません」となってしまいます。 この関数だと返り値がBoolean型となってしまうと思うのですが、Form型では受け取れないのでしょうか?? よろしかったらご回答お願いいたします。

  • dee_honda
  • ベストアンサー率53% (26/49)
回答No.1

VB6.0であれば、 strForm = "Form1" Set frmTest = Forms.Add("strForm") ではどうですか?

stucklife554
質問者

補足

ご解答ありがとうございます。 早速試してみたのですが、この場合だとstrFormのForm_Loadがはじまってしまいました・・・ これだとまずいですね。

関連するQ&A