[[20211006105321]] 『ユーザーフォームの変数を標準モジュールで使用し』(PTP) ページの最後に飛ぶ

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

 

『ユーザーフォームの変数を標準モジュールで使用したい』(PTP)

テキストボックスとコマンドボタンがあるユーザーフォームで
テキストボックスに入力した文字を標準モジュールで変数として使用したいのですが、上手く受け渡しができません。
方法を教えてください。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


>上手く受け渡しができません。
コードを提示されるとより良い回答があると思いますよ。
(*) 2021/10/06(水) 11:07

一例です

標準モジュール

 Sub Sample()
  MsgBox UserForm1.TextBox1.Value
 End Sub

UserForm1(Textbox1が置いてある)

 Private Sub UserForm_Click()
  Call Module1.Sample
 End Sub

(めざめるパワー) 2021/10/06(水) 11:25


>> * 様

元のコードが長いのでやりたいことをまとめるとこんな感じです。

ユーザーフォーム

Private Sub UserForm_Click()

NAME = TextBox1.Text

Unload UserForm1
End Sub

標準モジュール

Sub test()

Dim NAME As String

UserForm1.Show

MsgBox NAME

End sub

>>めざめるパワー様

例の提示ありがとうございます。

標準モジュール側で
UserForm1.Showを使ってユーザーフォームを開き、
標準モジュールの上記の式以下をCallって出来るのでしょうか。
(PTP) 2021/10/06(水) 11:40


>標準モジュール側で
>UserForm1.Showを使ってユーザーフォームを開き、
>標準モジュールの上記の式以下をCallって出来るのでしょうか。

やってみてください
(めざめるパワー) 2021/10/06(水) 11:44


>>めざめるパワー様

出来ませんでした。

(PTP) 2021/10/06(水) 11:52


ユーザーフォームから標準モジュールの関数をCallしたいということでしょうか。
その際にユーザーフォームのテキストボックスの値を渡したいと。

グローバル変数経由で渡すという方法があります。

 'ユーザーフォーム
  Private Sub UserForm_Click()
    NAME = TextBox1.Text
    Unload UserForm1
    call 
  End Sub

 '標準モジュール
 Public NAME As String

 Sub test()
    UserForm1.Show
    MsgBox NAME
 End sub

ただ、グローバル変数はできる限り使うべきでないというのがプログラミングセオリーなので
引数で渡すといいでしょう。

 'ユーザーフォーム
 Private Sub UserForm_Click()
    Dim NAME As String
    NAME = TextBox1.Text
    Unload UserForm1
    Call sendName(NAME)
 End Sub

 '標準モジュール
 Sub test()
    UserForm1.Show
 End sub

 Sub sendName(NAME As String)
    MsgBox NAME
 End sub

(hatena) 2021/10/06(水) 11:57


 変数受け渡しで調べてみてください。
 その上で分からないことがあれば、また聞いてみてください。

 http://officetanaka.net/excel/vba/tips/tips94.htm
 http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_200_050.html

(tkit) 2021/10/06(水) 12:04


 UserFormを Unloadしたら、そのメンバーにはアクセスできなくなります。
 UserForm側では、Hideだけして後始末は標準モジュール側でしましょう
    '----- UserForm ------
    Private Sub CommandButton1_Click()
        Me.Hide
    End Sub
    '---- 標準モジュール -----
    Sub sample()
      UserForm1.Show
      MsgBox UserForm1.TextBox1.Text
      Unload UserForm1
    End Sub
(´・ω・`) 2021/10/06(水) 12:32

(´・ω・`)さんと同じコードを用意してましたが、ランチしている間に先を越されました(;^_^A

最終的には、下記で紹介しているような Property経由で値を渡すという方法もあります。

https://hatenachips.blog.fc2.com/blog-entry-522.html

 '----- UserForm1 ------
 Option Explicit
 Private sResult As String

 Public Property Get Result() As String
    Me.Show vbModal
    Result = sResult
    Unload Me
 End Property

 Private Sub UserForm_Click()
    sResult = Me.TextBox1.Text
    Me.Hide
 End Sub

 '---- 標準モジュール -----
 Sub test()
    MsgBox UserForm1.Result
 End Sub

動作原理について上記のリンク先で解説しています。興味があればご参考に。

(hatena) 2021/10/06(水) 12:48


>>hatena様
最初に頂いた側で上手く行きました。
ありがとうございました。
後で頂いたHideを使用する方法とどちらが良い、というものがあれば教えていただけるとありがたいです。

>>(´・ω・`)様

別案の提示ありがとうございました。
(PTP) 2021/10/06(水) 14:30


後のHideのやつのメリットは、
グローパル変数を使わずに済むということと、
標準モジュールから呼び出すとき1行で済む、
Input関数と同じ様な使い方ができる、
ということかな。
(hatena) 2021/10/06(水) 15:09

 サイトを巡って、分かりやすそうなところを探し提示したのですが、スルーされてしまいましたね。

 こういうことがしたいのでしょうか?

 'Formモジュール
 Function GetUserFormTextBox() As String
     Me.Show
     GetTextBox1 = TextBox1.Value
 End Function

 '標準モジュール
 Sub sample()
     Dim result As String
     result = UserForm1.GetUserFormTextBox
     MsgBox result
 End Sub

(tkit) 2021/10/06(水) 15:23


 修正してください
 'Formモジュール
 Function GetUserFormTextBox() As String
     Me.Show
     GetUserFormTextBox = TextBox1.Value
     Unload Me
 End Function
(tkit) 2021/10/06(水) 15:36

tkitさん、関数の返り値で渡すという方法ですね。
これもシンプルでいいですね。
(hatena) 2021/10/07(木) 12:10

コメント返信:

[ 一覧(最新更新順) ]


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