[[20100212100043]] 『シートマクロからフォームを立ち上げ、再度シート』(まき) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『シートマクロからフォームを立ち上げ、再度シートマクロに戻る』(まき)

Excel2003、Vista

いつも色々参考にさせて頂いております。

さて、現在シートにボタンを配置し途中でフォームを立ち上げ、各種設定値を入力or確認

を行ったのち、シートのマクロに戻したいと考えております。この様なコマンドは、GoSub

Returnが使えるのかなぁ?と思っていますが、Helpを見ても詳しい明記が無いので、何か

方法が有ればご伝授願います。現在のVBAは次の通りです。

 Private Sub グラフ_Click()

	・
	・	'フォームに渡すdata算出
	・
   グラフ条件.Show	'フォームにて各種の入力
 'フォームにて入力後、ここに戻したい→入力した値を使用する

以上よろしくお願いします。


 >ここに戻したい→入力した値を使用する
フォーム側で処理してはいかがですか?
(もしくはフォームから標準モジュールの関数に引数としてフォームの値を与える)
フォームを閉じる前に処理したほうがらくだと思われます。
 
ユーザーフォームを閉じた後に利用する場合はシート上に値を転記するか、
グローバル変数に値を渡すことになります。
(みやほりん)(-_∂)b


みやほりん 様

敏速なご連絡頂き有り難うございました。みやほりん様が言われる通り、フォームで処理後シートに戻す

のが楽なのですが。現在シートの各行に(A列)チェックBOXを配置し、処理したい項目のみレ点を入

れて次の処理(ボタンを押す)に進める様にしております。また、チェックBOXで値を入

れた後に、このシートのrangeに値を代入します。(フォームに渡す値もシートに入れてあります→グローバル変数ではなく)

よってフォームで処理出来ない為に(既に運用されている物に、新たなVBAの追記の為)、シート→

フォーム→シートと言う形になってしまいました。。。。

以上よろしくお願い致します。


 >シートに戻す
という表現が私のVBAのボキャブラリにはありませんので、
フォームにデータを渡すために、シートに値を残している部分はできているようなので、
ユーザーフォームで設定した内容をシートに値として転記して残すことも、
ほとんど同じ技術ですので、問題はないはずです。
「グラフ条件.Show」という部分はユーザーフォームが閉じるまでこの行で
グラフ_Click()マクロはとまっています。ユーザーフォームが開いている間は
ユーザーフォームに書かれているコードか、ユーザーフォームから呼び出した
コードが有効です。
ユーザーフォームを閉じる(Unload)と「グラフ条件.Show」の次の行の
ステートメントが実行されますが、フォームで設定した内容はユーザーフォームが
閉じている以上、呼び出すことはできません。
したがって、グローバル変数なり、シートのセルなりにユーザーフォームで設定した内容を
保持することで「グラフ条件.Show」の次の行以降のステートメントに値を渡すことになります。
通常はユーザーフォームをUnloadする時にユーザーフォームのコントロールの値を
標準モジュールのSubプロシージャに引き渡して実行します。
つまり、手順としては、
 
1.「ここに戻したい→入力した値を使用する」 この部分以降のコードを
  独立したSubプロシージャにする。
2.(1)のSubプロシージャをユーザーフォームから値が渡せるように、
  引数設定をする。
3.ユーザーフォームのボタンコントロールなどで(2)のSubプロシージャを呼び出し、
  またコントロールの値を渡すようなコード構造にする。
  
 Private Sub グラフ_Click()
 
	・
	・	'フォームに渡すdata算出
	・
   グラフ条件.Show	'フォームにて各種の入力
 End Sub
 
Rem 標準モジュールに
Sub test20100212(ByVal aaa as String)
Msgbox aaa
End Sub
 
Rem ユーザーフォームモジュールにコマンドボタンとテキストボックスを配置して
Private Sub CommandButton1_Click()
Call test20100212(TextBox.Value)
Unload Me
End Sub
 
こんな感じで。
test20100212にユーザーフォームに入力した値を使用するコードを書きます。
引数で値渡ししなくても、この時点ではユーザフォームは生きているので、
各コントロールの値を直接使用することもできますね。
(みやほりん)(-_∂)b


 状況が良くわかっていませんけど、大雑把にこういうのもあり?

 Private Sub Worksheet_Change(ByVal Target As Range)
  UserForm1.Show
  MsgBox UserForm1.TextBox1
  Unload UserForm1
 End Sub

 Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  Cancel = True
  Me.Hide
 End Sub
 (Jaka)

 なるほど。呼び出し側で最後にUnloadすれば
それまでにコントロールの値は取得できますね。
(みやほりん)(-_∂)b

Jaka様、 みやほりん様

ご連絡頂き有り難うございました。

Jaka様の記述を行ってみた所、何故だかフォームを立ち上げる前のVBA部の処理がスルーされてしまい、

cancelをすると、フォームを開く前の動かない所が1stepずつ処理されてゆきます。

	・
	・	'フォームに渡すdata算出→ *代入処理が行えない
	・

みやほりん様の記述を行ってみました。私の説明不足でしたが、TextBoxが数個あったので、TextBox"aaa"

と言う物を作りsheet1のあるセルに代入する様にしました。このフォームはシートでレ点を入れた行から

数点の値を取り、フォームのラベルに代入しています。この値で満足出来ない場合、数個のTextBoxに

入力させて、同値をsheet1の読み込んだ先に戻す様にしております。よって、必ずしもフォームからsheet1

にdataを戻すとは限りません。(逆に手入力で代入する方がまれかも)デバッグでは値を戻して行った

所、「実行時エラー'424'オブジェクトが必要です」となりフォームでの記述の

 Call test20100212(TextBox.Value)

で反転しています。

お手数をおかけ致しますが、よろしくお願い致します。


 >Jaka様の記述を行ってみた所、何故だかフォームを立ち上げる前のVBA部の処理が
 >スルーされてしまい、 
 >cancelをすると、フォームを開く前の動かない所が1stepずつ処理されてゆきます。 
 ちょっと意味が良くわかりません。
 たぶん、フォーム起動時のタイミングなんだろうと思います。

 Unload と Hide の違いがわかりますか?
 解っていれば、そういったことにはならないと思います。
 Unload と Hide の意味をヘルプで確認してみてください。
 (Jaka)


 実行時エラー'424'オブジェクトが必要です・・・テキストボックスのオブジェクト名は
そちらでマッチさせてください。どんなオブジェクト名がつけられているかまでは、
こちらでは感知できません。
 
>必ずしもフォームからsheet1 にdataを戻すとは限りません。
あらら、誤解されちゃいましたね。
 
私が言いたいのは、ユーザーフォームで入力した内容を
一時的にでも「メモ」として決まった適当なセルに値を代入していけば、
その後のコードでも、「メモ」を参照すればよいので、
シート操作のコードで処理できるのではないですか、ということです。
「本番のセル」に直接書き戻せ、ということではありません。
 
シート、セルレベルのコードは理解していらっしゃるのなら、
理解しているレベルで処理ができるようにしてはどうですか、ということです。
VBAは「自己メンテナンスできるレベルで目的の処理が果たせるかどうか」が重要で、
高度な処理が礼賛されるわけではありません。
 
(みやほりん)(-_∂)b

Jaka様、 みやほりん様

色々ご指導頂き有り難うございました。

Jaka様からご指摘の有りました「Unload と Hide の意味」ですが、Unloadは理解しておりましたが、

Hideは分かりませんでした。2003のHelpでは、フォームの切り替えの例が有りました。今回特にシートを

隠す必要性が無い為に(逆にシートを出してその画面上でフォームを見せたい)、Jaka様、 みやほりん様

の2人の内容から次の通り記述した所、実行したい内容は確認出来ました。

*シートのVBA

        グラフ条件.Show   '各LOTの最大値からグラフ条件のX軸、Y軸×4項目の設定値確認
        Unload グラフ条件   'グラフ条件のUserFormを閉じるとココに戻る
        If 戻り処理 = 0 Then  'グラフ条件でOKボタンが押された際の処理

*グラフ条件のUserFormのVBA

 Private Sub ok_Button_Click()

    戻り処理 = 0
    Sheets("一覧表").Select
    Sheets("一覧表").Range("U3") = 時間Box 'X軸の決定
     ・(その他数TextBoxのシートへの代入)
    Unload Me

 End Sub

 Private Sub キャンセルButton_Click()

    戻り処理 = 1
    Sheets("一覧表").Select
    Sheets("一覧表").Range("A1").Select
    Application.Visible = True         '画面を表示する

    'シートを保護する
    Worksheets("一覧表").Protect "****"

    Unload Me

 End Sub

*グローバル変数

 Public 戻り処理 As Long

取りあえず今の所、問題無く動作しております。この度は有り難うございました。今回実施したい事は

(追加で入れるVBA)まだ途中(4軸以上の折れ線グラフ)ですので、また何か壁に当たり過去例で見当

たらない際には、よろしくご指導の程お願い申し上げます。(本業は営業職で、手の空いた時に行ってい

ますので超初心者です。)

以上よろしくお願い申し上げます。


 解決後ですが・・・・。
 まず、拝見したような変数設定は、今後見直された方が良いと思いますよ!!
 現状が正常に作動していたとしてもです。理由は、このような変数配置をしているとメンテナンスが
 しづらくなると思うからです。

 今回の主役となる変数は、

Public 戻り処理 As Long

 ↑これです。
 Jakaさんの投稿が生かされていないことは、この変数を標準モジュールに宣言したことに集約されています。

 この「戻り処理」という変数、コードを拝見する限りは、標準モジュールに宣言しているのですよね?

 処理コードは、シートモジュールとユーザーフォームに記述されていて、ユーザーフォーム内で
 クリックされたボタンの種類を表す変数が処理とは関係ない標準モジュールに宣言されている。
 こういうコードにしてしまうとご自分で作っても時間たってコードを読み返すと、
 何でいきなりこの変数???   ってことに成りがちなんです、私の経験上・・・。
 まだ、この手の変数が一つならまだしも、処理が拡張され、増えてくれば、もう何がどの変数なんだか・・・。

ところで、

 Excel/VBA内で便利に使用しているオブジェクトという存在、

 私は、初心者には プログラムを作成するのに使う便利な道具と説明します。

 ちょっと覚えてきた人には、 データとアルゴリズムのなんたらこうたらと・・・。

 そして、部品を使うためのインターフェースにプロパティとメソッドがあるという説明をします。

 例えばと、例をあげて

 sub test()
    dim bk as workbook
  Set bk=workbooks.open("d:\aaa.xls")
    msgbox bk.name
 end sub

 この例だと「ブックの名前という情報は、bk.name というオブジェクト(bk)のプロパティ(name)を使うと
 取得できます。」 というようにしてオブジェクトの使い方を説明します。

ユーザーフォームは、VBAプログラマが作成するフォーム付のオブジェクト なんです。

 よって、どのボタンが押されたのかという情報は、そのユーザーフォームの
 プロパティとして取得できるような構造にするべきなのです。

 こういう考え方でコード作成にあたると、Jakaさんの投稿が意味を持ってきます。

*グラフ条件のUserFormのVBA

  Public 戻り処理 As Long 'この変数は、ユーザーフォームモジュールに宣言
 >Private Sub ok_Button_Click() 

  >  戻り処理 = 0
  >  Sheets("一覧表").Select
  >  Sheets("一覧表").Range("U3") = 時間Box 'X軸の決定
     ・(その他数TextBoxのシートへの代入)
    me.hide
 >End Sub 

 >Private Sub キャンセルButton_Click()

  >  戻り処理 = 1
  >  Sheets("一覧表").Select
  >  Sheets("一覧表").Range("A1").Select
  >  Application.Visible = True         '画面を表示する

  >  'シートを保護する
  >  Worksheets("一覧表").Protect "****"

    me.hide
 >End Sub 

 '以下の追加

  Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
     If CloseMode = 0 Then '閉じるボタンが押されたら、キャンセルと同じ
        Cancel = True
        Call キャンセルButton_Click
     End If
  End Sub

*シートのVBA

 Sub test()
   Dim result As Long
   With グラフ条件
      .Show      '各LOTの最大値からグラフ条件のX軸、Y軸×4項目の設定値確認
      result = .戻り処理
   End With
   Unload グラフ条件      'グラフ条件のUserFormを閉じるとココに戻る
   If result = 0 Then  'グラフ条件でOKボタンが押された際の処理
   '・
  '・
 End Sub

 ほら、.戻り処理 という変数がユーザーフォームのプロパティになっているでしょう?
 ユーザーフォームに関連するデータということがわかりやすいと思いますが・・・・。

 検討してみてください。

 ichinose


 追伸 

 戻り処理 というプロパティ名もユーザーフォームから考えると、もうちょっと適切な命名がある思います。

 これも合わせて検討してみてください。

 ichinose


ichinose 様

こんにちは、まきです。ichinose様ご指摘有り難うございました。

 > この「戻り処理」という変数、コードを拝見する限りは、標準モジュールに宣言しているのですよね?
 →はい、言われる通りです。今までグローバル変数と言うのは使った事無かったのですが、みやほりん様
 が「グローバル変数」と書かれていたので使ってみまし。しかし、どこに表記するのか?と言う所から始まり
 アクセスでは、「グローバル変数」を標準モジュールに宣言すると聞いた記憶があるのでそこに表記しました。
 本当はSheet("1")の未使用のセルに明記しようと思ったのですが(簡単なので)。。。

 ichinose様の例からよく理解出来ておりません。試しに新規BOOKに表記したり、同シート上にボタンを
 配置してみましたが(ファイル名は、D:\aaa.xls)何もMsgBoxが出ませんでした。また、今回のVBAに
 記述して動かした所、400と出て来ました。→このbook名ではありませんが

 初心者なので分からないついでに教えて下さい。このグラフ条件と言うFormには閉じるや最大/最小の
 ボタンを配置していません。Formには、OKとキャンセルの2つのボタンのみでも、
  Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
     If CloseMode = 0 Then '閉じるボタンが押されたら、キャンセルと同じ
        Cancel = True
        Call キャンセルButton_Click
     End If
  End Sub
 この表記でいいのでしょうか?また、画面のキャンセルボタン時の記述は??どうすればいいのか分かりません。

 ichinose様の文面で
 >ほら、.戻り処理 という変数がユーザーフォームのプロパティになっているでしょう?
 の意味もよく理解出来ておりません。ちなみにデバッグ時に次のBoxを配置して確認してみました。
 このBoxでは、期待値と同じ番号が出ていましたが。。。言われている点が違うのでしょうか?

 *シートのVBA

        グラフ条件.Show   '各LOTの最大値からグラフ条件のX軸、Y軸×4項目の設定値確認
        Unload グラフ条件   'グラフ条件のUserFormを閉じるとココに戻る
   MsgBox "処理コードは「" & 戻り処理 & "」番です。"   'デバッグの為追加
        If 戻り処理 = 0 Then  'グラフ条件でOKボタンが押された際の処理

私の環境では、VBAを分かっている人が全くいなく聞く事も出来ません。お恥ずかしい質問となってしま

いましたが、教えて頂ければ幸いです。。。(分からない事を偉そうに言ってしまい、すいません)

以上よろしくお願い致します。


 だめだめな、例題を載せちゃったので全部消しちゃったけど、
 この分↓は使えましたね。

 >「Unload と Hide の意味」ですが、Unloadは理解しておりましたが、 
 >Hideは分かりませんでした。2003のHelpでは、フォームの切り替えの例が有りました。今回特にシートを 
 >隠す必要性が無い為に(逆にシートを出してその画面上でフォームを見せたい)、
 ええっと、着眼点は、隠すだけじゃないです。
 両者の挙動の違いです。
 一方は、メモリ上から消えてなくなる。
 もう片方は、メモリ上に残っている。
 (特殊な場合以外は、そっくり同じ状態で残っているから、値はいつでも取得できる。)
 (うまく表現できないけど。)
 この違いなんだけど。
 (Jaka)


 理解していただいていないようなので、再度、理解していただくための私の挑戦です。

 >しかし、どこに表記するのか?と言う所から始まり
 >アクセスでは、「グローバル変数」を標準モジュールに宣言すると聞いた記憶があるのでそこに表記しました。

結論は、

 今回のユーザーフォームの関連のデータは、ユーザーフォームモジュール内に記述した方がよいですよ 
 ということです。現状の標準モジュールにPublic変数を宣言することで正常に作動していても、こういうコードにしない方がよいですよ、
 というのが私の前回の投稿内容なんです。

 標準モジュールにPublic変数が宣言して、簡単にどこのモジュールからも参照や設定が出来てしまうこと
 簡単に出来てしまい、これを多用する癖がついてしまうことを問題視しています。

 GOTO文というステートメントがありますが、この手の掲示板ではあまり見かけません。
 実は、これを使った方がコードの行数は、少なくてすむ場合の方が多いはずです。
 それでもGOTO文は使わないコードを私は書きます(構造化プログラミング可能言語で
 Goto文を使った記憶はありません、なかったと思います)。
 何故か、自分の作ったコードでも後で読み返したりする場合、非常に理解しづらいからです。
 標準モジュールにPublic変数を使わないのも同じ理由なんです。

 特にプログラミング初心者が、最初からこの二つを使ってしまうともう理解しがたいプログラムを
 作ってしまう例を散々見てきました。

 前回の投稿の
 >処理コードは、シートモジュールとユーザーフォームに記述されていて、ユーザーフォーム内で
 >クリックされたボタンの種類を表す変数が処理とは関係ない標準モジュールに宣言されている。

 ↑こういう構造がおかしいなあ と感じるようになっていただきたいがための再度の投稿です。

 >同シート上にボタンを
 >配置してみましたが(ファイル名は、D:\aaa.xls)何もMsgBoxが出ませんでした

 本題とは、ずれますが、今度は、このようにしてください。

 新規ブックの標準モジュールに

 '========================================================
 sub mybookuname()
     dim bk as workbook
     set bk=thisworkbook
     msgbox bk.name
 end sub    

 これを実行してみてください。このVBAコードを記述したブック名が表示されませんか?
 このようにオブジェクト(Workbook)と関連性のある情報(name)は、オブジェクト内にあった方が
 コ−ドもわかりやすいくないですか? という例を上記コードで言いたいのです。

 Workbookというオブジェクトは、Excelに元々ある既成のオブジェクトです。
 このオブジェクトを使うには、このように bk. と入力すれば、使えるプロパティやメソッドの一覧が
 表示されて使いやすいですよね!!

 次に例です。VBAにMsgboxという関数があります。
 新規ブックの標準モジュールに
 '===================================================
 Sub sample1()
    Dim Man_or_Woman As Long
    Man_or_Woman = MsgBox("あなたは、男ですか?", vbYesNo)
    If Man_or_Woman = vbYes Then
       MsgBox "あなたは、男性です"
    Else
       MsgBox "あなたは、女性です"
    End If
 End Sub

 このMsgbox関数のほんの一部の機能をユーザーフォームを使って同じようなことが
 出来るように作成することを考えます。

 作成すのは、はい と いいえのボタンを付け、メッセージを表示し、どちらかを選択させる
 本家Msgboxの一部の機能を持つユーザーフォームを使った擬似Msgboxです。

 新規ブックにて、ユーザーフォームを一つ作成してください。
   ユーザーフォーム  ----- UserForm1
 このUserForm1に以下のコントロールを配置してください。

         ラベル       ------- Label1(既定名)
         コマンドボタン   -------  CommandButton1(既定名)
         コマンドボタン   ------- CommandButton2(既定名)

 という三つコントロールを適当な位置に上記の順序で作成してください。

 UserForm1のモジュールに

 '=====================================================================
 Public mes As String '表示するメッセージを格納する
 Public yes_no As Long 'はい 6 いいえ 7
 '=====================================================================
 Private Sub UserForm_Activate()
      With Label1
        .Caption = mes
        .Width = Len(mes) * 11
        .AutoSize = True
      End With
      With CommandButton1
        .Caption = "  はい  "
        .Top = Label1.Top + Label1.Height + 10
        .AutoSize = True
      End With
      With CommandButton2
        .Caption = "いいえ"
        .Top = Label1.Top + Label1.Height + 10
        .AutoSize = True
      End With
      CommandButton1.Width = Application.Max(CommandButton1.Width, CommandButton2.Width)
      CommandButton2.Width = CommandButton1.Width
      Me.Width = Application.Max(Label1.Left + Label1.Width + 10, CommandButton1.Width + 4 + CommandButton2.Width + 30)
      Me.Height = CommandButton1.Top + CommandButton1.Height + 30
      CommandButton1.Left = Me.Width / 2 - CommandButton1.Width - 2
      CommandButton2.Left = Me.Width / 2 + 2
 End Sub
 Private Sub UserForm_Initialize()
    With UserForm1
      .StartUpPosition = 1
    End With
    With Label1
       .Top = 10
       .Left = 10
    End With
 End Sub
 '*****************************************************************************
 'ここまでは、わからなくてもいいです。↑やっていることは、メッセージの長さに合わせて
 'Userform1の大きさ、ボタンの位置などを調整しているコードです
 '↓問題は、以下のコードです
 '=======================================================================
 Private Sub CommandButton1_Click() 'はいが押されたとき
    yes_no = 6
    Me.Hide
 End Sub
 '========================================================================
 Private Sub CommandButton2_Click() 'いいえが押されたとき
    yes_no = 7
    Me.Hide
 End Sub
 '==========================================================================
 Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
 '閉じるボタンが押されたとき、いいえボタンが押されたとみなす
    If CloseMode = 0 Then
       Cancel = True
       Call CommandButton2_Click
    End If
 End Sub

 Sheet1シートのモジュールに

 '===========================================================================
 Sub test()
    Load UserForm1
    UserForm1.mes = "あなたは、男ですか?" '表示するメッセージをmesプロパティに設定
    UserForm1.Show
    If UserForm1.yes_no = 6 Then 'yes_noプロパティを調べてボタンの種類を確認
       MsgBox "あなたは、男性です"
    Else
       MsgBox "あなたは、女性です"
    End If
    Unload UserForm1
 End Sub

 

 Sheet1.Testを実行してみてください。

 UserForm1.Show でMsgboxと同じようなフォームが表示されるはずです。

 testというコード内を良く見てください。

 オブジェクト名   Userform1

           指定されたメッセージを表示し、はいといいえで応答を求めます。

 プロパティ         mes     String型 ----- 表示するメッセージ内容を指定します。
                   yes_no  long型  ----- どのボタンが押されたかを取得できます。
                      6----はいボタンが押された
                      7----いいえボタンが押された
 メソッド     Show  mesに設定されたメッセージを表示し、応答を促します。
                          尚、閉じるボタンが押された場合は、いいえが押されたとみなします。

 どうですか? 上記のようなプロパティやメソッドを持つUserForm1という
 オブジェクトが作成できました。

 これを標準モジュールにPublic変数を使った方法で作成すると、ずいぶん扱いづらい
 擬似Msgboxになってしまうと思いますよ!!

 Useform1だけコピーすれば、別のブックでも使えます。再利用も簡単です。

 まきさんの投稿内容から、類似した仕様のコードを例にあげました。

 よく内容を検討してみてください。

 ichinose


Jaka様

再度Hideについて、ネット等で勉強してみます。

ichinose様

早朝にレスを頂き有り難うございました。全てのサンプルが表記されている通り、動作致しました。

 ichinose様のVBAは、半分位理解出来ましたが、もし自分でこの説明を書けと言われても出来ないと感じました。
 Jaka様のレスにも表記しましたが、Hideの意味が今一分からないです。(勉強してみます)ichinose様
 が言われる様に、以前アクセスでPublic変数を多用してしまい(コメントは付けてはいましたが)、修
 正する際に何がなんだか思い出すのに時間が掛かった経緯が有ります。(印刷時にページ毎違うコメン
 トを入れるのに)変数は、出来るだけその場で終える様にしたいと思いました。今回もこの場だけなの
 でPublic変数を使い必要性が有りませんね。本例を後ほどかみ砕いて勉強させて頂きます。
 ところで、上記例題だとuserFormをunloadした際に、男女の情報をどう取得したら良いのでしょうか?
 実際の所、OKまたはCANCEL(このボタンを外しても良いのですが)のどちらかで以降の処理ルーチンが異なります。

何度もすいません、またこの度の親切な解説に感謝しております。

以上よろしくお願い致します。


 >Hideの意味が今一分からないです。
 ん? これ、透明人間を想像してください。
 ある部屋の中で 透明人間が見える状態から透明になった状態、
 透明になっても実態は、その部屋の中にいる これが Hide

 透明人間が部屋の中から出て行った状態 これが Unload Userform1

 どっちも部屋の中は人間には、同じに見えるけど、透明人間が部屋の中で透明になっている
 のと 部屋には、透明人間がいないのとは、違うよね?

 想像してみて・・・、ください。

 >上記例題だとuserFormをunloadした際に、男女の情報をどう取得したら良いのでしょうか?
 >実際の所、OKまたはCANCEL(このボタンを外しても良いのですが)のどちらかで以降の処理ルーチンが異なります。
 はっきりご質問の意図がつかめません・・・。

 男女の情報がいらなくなるまで Unloadしなければよい と思いますし、

 ユーザーフォームから男女の情報だけ保持したいなら、
 sub test()
    dim 男女 as long
    Load UserForm1
    Userform1.mes="あなたは、男ですか?"
    Userform1.Show
    男女=userform1.yes_no 'ここで別変数に値を移す
    unload userform1
    if 男女=6 then 
      ’男の処理
    else
       '女の処理
    end if
 end sub

 というように別の変数に情報を移行すればよい と思いますし、

 ここから、別プロシジャーを呼び出して その中で男女の情報が必要というなら、
 パラメータを使って男女の情報を別プロシジャーに渡せばよいと思いますし・・・。

 sub test()
    dim 男女 as long
    Load UserForm1
    Userform1.mes="あなたは、男ですか?"
    Userform1.Show
    男女 =userform1.yes_no
    unload userform1
    call 別プロシジャー(男女)

 end sub

 sub 別プロシジャー(byval 性別 as long)
    if 性別=6 then
     ’男の処理
    else
       '女の処理
    end if
 end sub    

 記述された内容からは、このような投稿しかできませんが、どれか該当するものが
 ありますか?

 ichinose


ichinose様

こんにちは、まきです。色々有り難うございました。

 Hideの意味が何となく見えた様な気もします。今度時間があった時に、サンプルを作ってみて(HELPから
 参照)動かしてみます。ichinose様からのサンプルでもそうでしたが、動けば意味が理解しやすいと思います。

 ichinose様から前にご指導頂いた通り(すっかり忘れていました)
   With グラフ条件
      .Show      '各LOTの最大値からグラフ条件のX軸、Y軸×4項目の設定値確認
      result = .戻り処理 '項目名は変更しますが
   End With
   Unload グラフ条件      'グラフ条件のUserFormを閉じるとココに戻る
   If result = 0 Then  'グラフ条件でOKボタンが押された際の処理

 とすれば良かっただけです。すいませんでした、とぼけた質問をしてしまいました。

また、何かあった際にはよろしくお願い致します。この度は親切なご指導頂き大変感謝しております。

以上よろしくお願い申し上げます。


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.