人に聞けない痔の悩み、これでスッキリ >>

すいません、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)
としても、コンパイルエラーとなってしまいます。
よろしくご教示をお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

こんばんは。



引数の渡し方には二種類ありますから、それを混乱しているのだと思います。必ずしも、以下の方法が良いというわけではありませんが、UserForm の立ち上げに対して、渡しようがない場合は、プロジェクト・スコープの変数を用いて、以下のようなスタイルで変数として渡すのが良いのではないかと思います。

'-------------------------------------------
'標準モジュール

Public m As Integer

'-------------------------------------------
'シートモジュール

Private Sub CommandButton1_Click()
 m = 1
 Call フォーム呼び出し
End Sub

Private Sub CommandButton2_Click()
 m = 2
 Call フォーム呼び出し
End Sub

Sub フォーム呼び出し()
 UserForm1.Show
End Sub

'-------------------------------------------
'UserForm モジュール

Private Sub CommandButton1_Click()
 MsgBox "ボタン" & m & "が押されました。", vbInformation
 Application.Wait Now + TimeSerial(0, 0, 1)
 Unload Me
End Sub
    • good
    • 1
この回答へのお礼

出来ました!ありがとうございました。
ですが、自分が作ったものとどこが違うのかまだよく理解できていません。参照渡しと値渡しのところをもう一度今から勉強してみます。
わからないことがありましたら別途ご質問させていただきたいと思います。

お礼日時:2009/07/28 00:59

>Sub フォーム呼び出し(m As Integer)


> UserForm1.Show
>End Sub

は、
Sub フォーム呼び出し(m As Integer)
 if m=1 then
  UserForm1.Show
 elseif m=2 then
  UserForm2.Show
 endif
End Sub

という具合に、この時点で分岐してしまえば、引数は要りません

どうしても...というのなら
Tag という通常使われないプロパティーを利用するとか..
    • good
    • 0
この回答へのお礼

ありがとうございます。シート上のコマンドボタンにtagの設定の仕方を調べてみます。

お礼日時:2009/07/28 01:00

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QExcel VBAで、ユーザーフォームの値を、モジュールで使用したい。

VBA初心者です。(おそらく)基本的な質問で、申し訳ありません。
ユーザーフォーム1には、テキストボックス1とコマンドボタン1が配置されているとします。

Sub TEST ()
Dim N
Userform1.Show
MsgBox N
End Sub

Private Sub CommandButton1_Click()
Dim N
N = TextBox1.Text
UserForm1.Hide
End Sub

Sub TESTを実行した時に、ユーザーフォーム1からNの値を引き継ぐには、どうしたら良いのでしょうか?よろしくお願いします。

Aベストアンサー

'モジュールに変数宣言(グローバル変数)
'Public 宣言すると他のモジュールやフォームと
'共有できる変数になります。
Public AA As String

'sample
'A1 を実行する。

Sub A1()
Call A2
AA = InputBox("input", , AA)
End Sub

Sub A2()
AA = InputBox("input", , AA)
End Sub

Qフォームに引数を渡す方法のやり方

はじめまして

----------------------------
配列Aにシート名を全て格納

フォームに引数を渡す

UserForm_Initialize にて
コンボボックスに引数を羅列させる
----------------------------

というようなマクロを作成しようと思っているのですが、フォームに引数を渡す方法がわからず困っています

どなたかご教授をお願いします
よろしくお願いします

Aベストアンサー

どうしても Initialize イベントで初期設定を行いたいのなら、標準モジュールに書いた Public な変数に情報を持つしかないと思います。
呼び出し元から、最初にシート名一覧を Public 変数である "配列A" にセットしてからフォームを Show する。

Initialize じゃなくても良いのなら、フォームに独自のプロパティを作成する方法。
例えばこんな感じとか。

' 呼び出し元のコード
Dim sheetNames As String
' シート名に使えない文字を区切り文字に使う
sheetNames = "a/b/c/d/e/f"
UserForm1.OpenArg = sheetNames
UserForm1.Show

' ユーザーフォームのコード
Option Explicit

Public Property Let OpenArg(aArg As String)
 Dim argArray As Variant
 argArray = Split(aArg, "/")

 Dim arg As Variant
 For Each arg In argArray
  Me.ComboBox1.AddItem arg
 Next
End Property

フォームを Show する前にプロパティを呼び出すので、その瞬間にますフォームの Initialize イベントが実行され、そのあとプロパティに値がセットされてコンボボックスに値が入ります。
したがって Initialize イベント内でコンボボックスの値を元に他の初期化もすることはできませんので、コンボボックスに入れる値を使って初期化するコードはすべてこの独自プロパティの中で処理する必要があります。
ということで、初期化のコードが多い場合はコードが煩雑になる可能性があります。

どうしても Initialize イベントで初期設定を行いたいのなら、標準モジュールに書いた Public な変数に情報を持つしかないと思います。
呼び出し元から、最初にシート名一覧を Public 変数である "配列A" にセットしてからフォームを Show する。

Initialize じゃなくても良いのなら、フォームに独自のプロパティを作成する方法。
例えばこんな感じとか。

' 呼び出し元のコード
Dim sheetNames As String
' シート名に使えない文字を区切り文字に使う
sheetNames = "a/b/c/d/e/f"
UserForm1.OpenArg =...続きを読む

Qエクセル VBA ユーザーフォームを閉じる

ユーザーフォームを開く時は
UserForm1.Showですが
閉じる時は?
UserForm1.Close
だとコンパイルエラーになります。
End
にするしかないですか?

Aベストアンサー

Unload Me とか Unload UserForm1 でユーザーフォームを閉じることができます。

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QForm間の値の渡し方

1つのForm上のコマンドボタンで別のFormを表示、そこで変数に値を入れ、そのFormを閉じ、元のFormでその変数を使いたいのですが、どうもうまくいきません。
実施したやり方は、一方のFormの宣言領域で、”Public abc As String”を宣言、両方のFormの(変数に値を入れた方と変数を使う方の)プロシージャーの宣言では引数として(abc As String)と記述しました。
因みに、両プロシージャーともイベントプロシージャーです。何か基本的なことができていないのだとは思いますが、どなたか教えていただけませんか?よろしくお願いします。

Aベストアンサー

すでに何件か回答があがっていますので、少し変わった方法をご参考までに。

あまり使われませんが、Formにはtagというプロパティがあります。
これは「文字列形式であれば何でも格納できる」という、上手く使えば便利なプロパティです。

FormAからFormBを呼び出し、FormBで変更した値をFormA.tagにセットします。
ここでFormBをUnloadしてもFormA.tagの値は影響を受けないので自由に使えます。

複数の値を呼び出し元に戻してやる場合に、区切り文字(カンマなど)で連結した文字列をtagに格納し、呼び出し元で区切り文字でsplitして、複数の値を受け渡すという手法をよく使っています。

QVBAでユーザーフォームに引数を渡したい

標準モジュールからユーザーフォームに引数を渡し、フォーム上で表示させたいのですが、方法がわかりません。
可能でしょうか?教えてください。

Aベストアンサー

Excel の話でしょうか?
Excel は操作したことがない門外漢です。
そこで、強引に次のような手法を用いてみました。
標準モジュールからも同じ手法を使えると思います。
広域変数を使うという手もありますが、それでは、面白くありませんので・・・。

Private Sub CommandButton1_Click()
  UserForm1.Controls("TextBox1") = "AAAA"
  UserForm1.Show
End Sub

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。

QエクセルVBAでテキストボックスの値の取得と変更について

エクセルのVBAを使ってシート上のテキストボックスのテキストを取得・変更するマクロを作成したいと思っていますがうまく行きませんので、お知恵を拝借したいとおもいます。

環境:WindowsXPでオフィス2002
状況:
エクセルブックa.xlsのシートに「コントロールツールボックス」のテキストボックスを配置(オブジェクト名はTEXTBOX_C)
エクセルブックb.xlsにコードを書き、a.xlsのTEXTBOX_CのプロパティのValueかTextを取りだしたい

試した事:
コントロールを配置したシートに次のマクロ
TEXTBOX_C.Text = "これはコントロールのテキストボックス"
を書くとテキストボックスに文字を入れ込めますが、別のエクセルブックからだと上手く行きません。

また、オートシェイプのテキストボックスの場合は簡単に出きるのですが、コントロールツールボックスではどうしても上手く行きませんので、対象法などご存知の方いらっしゃいましたら教えてください

Aベストアンサー

エクセルを新規に開きました。
そのSheet1に(コントロールツールボックスの)TextBoxを貼りつけました。
そのBook1から、ファイル-開くで別ブックを開きました。
別ブックのMojule1側に下記を書いて
Sub test02()
MsgBox Workbooks("book1").Worksheets("sheet1").textbox1.Text
End Sub
を実行すると、Book1のTextBoxに入れた文字列が表示
されました。
がそんな質問ではないのですか。

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング