• ベストアンサー

ユーザフォームの入力結果の受け取り

VB6でMsgBoxやInputBoxのフォントを変えたいので、それらしきサブルーチンを作成しました。そのサブルーチンはユーザフォームへの表示内容を設定した後、それを呼び出し(Show method)、押されたコントロールボタンの番号やテキストをパブリック変数に入れて戻っています(Show methodの次のステップに戻りました)。これを引数で受け取るにはどうすればよいのでしょうか(パブリック変数を使いたくないので)。よろしくお願いします。

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

  • ベストアンサー
  • NNori
  • ベストアンサー率22% (377/1669)
回答No.1

自分の知る限りできない。 MsgBoxだと整数を返せるけど、所望のことをやりたければ、自分で作ったユーザーフォームで構造体を返さないといけない。 では、その構造体を返す関数を親フォームが呼ぶとして、呼ばれた関数がフォームを作ってフォームの中身を親フォームへ構造体に入れて返してやればよいことになる。 ところが、この呼ばれる関数へ値をセットするために、同じこと(パブリック変数に値を書き込む)が起こってしまう。 すげえいやだけど、私は親フォームの方に値をセットするための関数を用意しておいて、子フォームはその関数を呼び出して親フォームに値を渡してから自分を消すようにしています。

yharapan
質問者

お礼

素早い回答ありがとうございました。当面、MsgBoxの方はパブリック変数のままにしておきます。N88BASIC世代の、VB初心者ですので、ユーザフォームがどのように呼び出され、戻ってくるよく分からず、ブラックボクスのようで、こんな質問をしました。構造体のことは十分理解できませんが、後段の対処法は私にも出来そうですので、試してみます。

その他の回答 (1)

回答No.2

ダイアログ自体を自作するなら、.NETのShowDialogのようなメソッドを実装すればよいかと。 [ Form2(ダイアログ用フォーム) ] コントロール:Text1(テキストボックス)、Command1,Command2(ボタン) Dim DialogResult As VbMsgBoxResult ' フォームをダイアログとして表示。 ' 押されたボタンを戻り値で、入力文字列をInputTextへ格納して返します。 Public Function ShowDialog(ByVal Owner As Form, ByRef InputText As String) As VbMsgBoxResult DialogResult = vbCancel Me.Show vbModal, Owner ShowDialog = DialogResult If DialogResult = vbOK Then InputText = Text1.Text End Function ' OKボタン Private Sub Command1_Click() DialogResult = vbOK Me.Hide End Sub ' キャンセルボタン Private Sub Command2_Click() Me.Hide End Sub [ Form1(メインフォームからの呼び出し例) ] Private Sub Command1_Click() Dim frm2 As New Form2 Dim strInput As String If frm2.ShowDialog(Me, strInput) = vbOK Then Debug.Print strInput End If Unload frm2 End Sub

yharapan
質問者

お礼

回答ありがとうございました。流れはおおよそ分かりました。VB6でさえ初心者の私には、NETではそんなこともできるのかという状態です。今回はRS232Cで機械を制御する必要上、VB6でプログラミングしていますが、私用のプログラミングにはNETを始めようと思っていますので、利用させていただきます。

関連するQ&A

  • EXCEL VBAのユーザーフォームに引数を渡す方法について

    すいません、EXCEL VBAのユーザーフォームに引数を渡す方法についてご質問があります。 シート上にコマンドボタンを2つ用意する。 コマンドボタン1を押すと変数mは1 コマンドボタン2を押すと変数mは2 としてユーザーフォームを呼び出す。 Public m As Integer Private Sub CommandButton1_Click()  m = 1  Call フォーム呼び出し(m) End Sub Private Sub CommandButton2_Click()  m = 2  Call フォーム呼び出し(m) End Sub Sub フォーム呼び出し(m As Integer)  UserForm1.Show End Sub 次にユーザフォームにコマンドボタンを1個置き、 ボタンを押したとき、mが1であれば「ボタン1」 mが2であれば「ボタン2」 とメッセージボックスを出し、ユーザーフォームを閉じる。 Private Sub CommandButton1_Click()   If m = 1 Then    MsgBox "ボタン2"   ElseIf m = 2 Then    MsgBox "ボタン2"   End If  Unload UserForm1 End Sub プロシージャ間の引数渡しは色々なテキストに載っているのですが ユーザーフォームに引数を渡す方法はどうも見つからず、 Private Sub CommandButton1_Click(m) としても、コンパイルエラーとなってしまいます。 よろしくご教示をお願いいたします。

  • フォームのキャプションのフォント

    1、VB6のウーザーフォームでInputBOXのようなものを作り、このフォームのキャプションの所にタイトルを表示しています。この、フォントが変えられるないものでしょうか。 2、また、このフォームを呼び出して、テキストボックスに入力してから呼び出しもとに戻り、そのテキストボックスのテキストを読み出してみると、呼び出し前の値しか読み出せません。 いずれも別の方法で対処していますが、上記の方法で出来ないものでしょうか。宜しくお願いします。

  • ユーザーフォームのコピー?

    エクセルのVBでユーザーフォームをコピーしたいのですが。 例えば、「ユーザーフォーム1」と「ユーザーフォーム2」を同じ形式で作成し、リンクするセルのみを変えたいのです。 今は、それぞれのコントロールをコピーしてます。 いい方法ありますか?というか可能ですか?

  • フォームの表示位置

    いつも拝見させていただき勉強しています。 VB初心者です。 親フォームから子フォームを、 loadメソッドとshowメソッドで、 よびだして表示させようとしているのですが、 フォームの位置をコントロールすることは できるのでしょうか? 画面中央に表示させたいのですが、 左上のほうに表示されてしまいます。

  • ユーザーフォームの表示

    マクロでユーザーフォームを作成しました それをワークシート上に表示させたいのですが方法がわかりません ネットで調べてみるとShowメソッドを使うとありますがやり方がイマイチわからないのです。 どなたかわかりやすく解説して下さい

  • エクセルのユーザーフォームについて

    パスワード入力用のしかけです。 ワークシートに配置したコマンドボタンを押してユーザーフォームを呼び出します。 Private Sub CommandButton1_Click() UserForm1.Show End Sub ユーザーフォームにはテキストボックスとコマンドボタンを配置しております。 テキストボックスのPasswordCharには * を設定しました。 Private Sub CommandButton1_Click() If StrConv(TextBox1.Text, vbLowerCase) = "abcd" Then MsgBox "OK!" Unload Me Else TextBox1.Text = "" TextBox1.SetFocus End If End Sub これで、ABCDまたはabcdと入力され、ユーザーフォーム上のコマンドボタンをクリックすれば、ユーザーフォームは消えます。 でも、いちいちマウスでクリックするのが面倒なのでEnterキー1回でユーザーフォームを消したいのです。 今でも、一度Enterキーを押すと、ボタンにフォーカスが移動するので、さらにEnterで消えますが、二度ではなくEnterキー1回でユーザーフォームを消すにはどうすればよいのでしょうか? ユーザーフォームは使ったことがないのでわかりません。 よろしくお願いします。

  • ユーザーフォームのHide,showメソッド

    ExcelのVBAでユーザーフォームをHideメソッドで非表示にして、 showで再表示すれば、状態が保存されたまま表示されるはずですが、 ユーザーフォーム表示中またはHideメソッドで隠した後に コマンドボタン等が配置されたシートを削除したときは、showで再表示しても、 ユーザーフォームの状態が保存されていません。 これはどうしてでしょうか? また解決策等ありましたら、教えてください。

  • Excel2007 VBA シートとユーザーフォームの値のやり取り

    1.シートからユーザーフォームを呼び出す。 2.シートからユーザーフォームへ値を渡す。 3.ユーザーフォームからシートへ値を返す。 この一連の処理を行いたいのですが。 TestSheet----------- Dim oForm As TestForm Set oForm = New TestForm oForm.SetData("渡す値") Call oForm.Show Dim Result As String 'Result = oForm.GetResult Set、GetメソッドはTestForm内に存在します。 しかし、ユーザーフォームでUnloadを行った時点でoFormが破棄されるらしく、Result = oForm.GetResultでエラーとなります。 変数とSet、Getメソッドを標準モジュールに記述すれば解決するのですが、スコープ範囲がこのシートとユーザコントロールに限定できないのでなるべく記述したくありません。 他にユーザフォームから値を受け取る方法はありませんでしょうか。

  • エクセルVBAのユーザーフォーム上のテキストボックスについての質問です

    エクセルVBAのユーザーフォーム上のテキストボックスについての質問です。 Aのユーザーフォームの内容をBのユーザーフォームのテキストボックスへ引き継いで、Bのユーザーフォーム上で内容を編集するという仕組みにしたいのです。 Bのユーザーフォームは新規入力もかねたユーザーフォームなので、テキストボックスのイベントにAfterUpdateを使用して、テキストボックスの内容が書き換えられるとデータベースから検索して新規か既存か判断させています。 AのユーザーフォームからBのユーザーフォームのテキストボックスへ引継ぎさせるときにこのAfterUpdateを発生させたくないのですが、Application.EnableEvents=Falseなどを使ってもイベントが発生してしまいます。 また、イベントがどのタイミングで発生するかと、コードをステップで実行させると、このイベントは発生しません。そのために、いきづまってしまいました。 AのユーザーフォームからBに引き継ぐ処理  ユーザーフォームB.Load ---ユーザーフォームBのイニシャライズが実行される  ユーザーフォームB.テキストボックス = ユーザーフォームA.テキストボックス  ユーザーフォームB.Show ちょっと簡単に書きすぎですがこんな感じです。 コードをステップで実行するとユーザーフォームBのAfterUpdateは実行されません。(VBAエディタのバグ?) どなたか回答お願いします。

  • MDIフォームとユーザコントロール

    VB.Netでの質問です。 ウィンドウメッセージを受け取りイベントを起こすユーザーコントロールクラス Class UserCtl Private Event MyKeyDown() Private Sub UserCtl_KeyDown() as Handels MyBase.KeyDown RaiseEvent MyKeyDown End Sub End Class プロセスA MDI子フォームにユーザーコントロールを追加し、子フォームにて、UserCtl.MyKeyDownイベントプロシージャでユーザーコントロールがウィンドウメッセージを受け取ったと認識し処理をします。 MDI子フォームはMDI親フォームより、CloseメソッドでしかCloseしません。 プロセスB FindWindowでMDI親フォーム, FindWindowExでMDI子フォーム、ユーザーコントロールハンドルを確認した上で、ユーザーコントロールにウィンドウメッセージをPostMessageします。 質問1 プロセスBからハンドルを探していますが、ウィンドウハンドル,ユーザーコントロールハンドルはいつまで有効なハンドルなのでしょうか? Closeでしょうか、それとも、Disposeでしょうか? 質問2 MDI親フォームでMDI子フォームをCloseした後でも、UserCtl.MyKeyDownは発生できるものなのでしょうか? 質問3 ユーザーコントロールで親フォーム(MDI子フォーム)がCloseされた事を認識する方法はないでしょうか? Me.Parent.IsDisposeでできるかなぁと考えているのですが。 よろしくお願いいたします。

専門家に質問してみよう