プロが教えるわが家の防犯対策術!

いつもお世話になっております。

以下のような仕様のVBAコードを作成したいと考えています。
(貼付資料も参照してください)

■仕様
 (1)ユーザーフォーム
  1.処理の対象となる市名をチェックボックスから選択
  2.処理の対象となるシート名をコンボボックスから選択
 (2)ユーザーフォームで選択した
   選択したシートの対象市名のデータを配列に格納
 (3)格納した配列を元に一覧、詳細の表を作成

■オブジェクト
 ●ユーザーフォーム
 ・フレーム
  Frame1:神奈川県 Frame2:茨城県 Frame3:栃木県 Frame4:対象年度
 ・チェックボックス
  CheckBox1:フレーム外の全選択
  CheckBox2~4:各フレームの全選択
  CheckBox5~11:市町村名(横浜市~小山市の順)
 ・コンボボックス
  ComboBox1:対象年度
 ●ワークシート

■不明な事
 (1)⇒(2)の処理(ユーザーフォームで選択した項目を他のプロシージャで使用する)
 について質問させていただきます。
 私の頭の中では、
 I.パブリック変数を用意して、CheckBoxやComboBoxで選択した項目を格納
 II.プロシージャ引数として・・・
 の2つの方法が候補として浮かんでいます。

 Iに関して
 CheckBox1:対象年度については、オブジェクトが1つしかないので、
 適当なパブリック変数(今回はmySh)を用意して、
 mySh=Combobox1.Value
 とすれば、仕様は満たせると思いますが、
 CheckBoxに関しては、数が多いので,どのようにすれば良いのかイマイチ分かりません。

 IIに関しては、全く見当が付きません。

■質問
 (1)上記の処理を行う場合は、I又はIIの方法で問題無いでしょうか?
 (2)I又はIIの方法の優劣はあるのでしょうか?
 (3)I、IIの方法を教えてください。

どうぞよろしくお願いします

「VBA ユーザーフォームの値の取得方法」の質問画像

A 回答 (1件)

つまり、呼び出し先のプロシージャでデータを格納したいため、


フォームの選択結果をキーとして渡したいということでしょうか?



>(1)上記の処理を行う場合は、I又はIIの方法で問題無いでしょうか?

呼び出し先のプロシージャが同じユーザーフォーム内であれば
CommandButton1_ClickプロシージャからCall ○○で呼び出して
呼び出し先の○○プロシージャでFor i = 5 To 11~Nextで
Me.Controls("CheckBox" & i).Valueとして値を判定すればいいし、
呼び出し先が標準モジュールであれば
UserForm1.Controls("CheckBox" & i).Valueで同じく値を判定すればよいのでは?
ユーザーフォームは呼び出し先のプロシージャからUnload UserForm1すれば消せますし。



>(2)I又はIIの方法の優劣はあるのでしょうか?
引数でも、広域変数で渡しても好みの問題かと。



>(3)I、IIの方法を教えてください。

I ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

■ユーザーフォームモジュールへ記述
(以下ではコンボボックスしか格納していませんが、チェックボックスはII参照して同様に。)

Private Sub CommandButton2_Click()
pub_cmBox_no = Me.ComboBox1.ListIndex
pub_cmBox_str = Me.ComboBox1.Value
Unload Me
Call sample2
End Sub

■標準モジュールへ記述

'広域変数を用意
Public pub_cmBox_no As Integer
Public pub_cmBox_str As String
'結果を表示
Sub sample2()
  MsgBox "▼選択されたコンボボックス" & vbCrLf & pub_cmBox_no + 1 & "番目の" & pub_cmBox_str
End Sub

II~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

■ユーザーフォームモジュールへ記述

Private Sub CommandButton1_Click()
Dim list_boo(6) As Boolean
Dim list_str() As String
Dim cnt As Integer
'チェックボックス判定
For i = 5 To 11
  'チェックボックスの状態を配列に格納
  list_boo(i - 5) = Me.Controls("CheckBox" & i).Value
  If list_boo(i - 5) Then
    'Trueのリスト配列(名前)を作成
    cnt = cnt + 1
    ReDim Preserve list_str(1, cnt)
    list_str(0, cnt - 1) = "CheckBox" & i
    list_str(1, cnt - 1) = Me.Controls("CheckBox" & i).Caption
  Else
  End If
Next i
'要素数1削除
If Sgn(list_str) <> 0 Then ReDim Preserve list_str(1, cnt - 1)
Unload Me
'sample1プロシージャを引数つきで呼び出し
Call sample1(list_boo, list_str, Me.ComboBox1.ListIndex, Me.ComboBox1.Value)
End Sub

■標準(ユーザーフォーム)モジュールへ記述

Sub sample1( _
  list_boo() As Boolean, list_str() As String, _
  cmBox_no As Integer, cmBox_str As String)
Dim i As Integer
Dim msg As String
msg = "▼全チェックボックスの状態"
For i = 0 To UBound(list_boo)
  msg = msg & vbCrLf & "CheckBox" & i + 5 & "=" & list_boo(i)
Next i
msg = msg & vbCrLf & "▼チェックされているもの"
If Sgn(list_str) <> 0 Then
  For i = 0 To UBound(list_str, 2)
    msg = msg & vbCrLf & list_str(0, i) & "=" & list_str(1, i)
  Next i
Else
  msg = msg & vbCrLf & "1つもチェックされていません"
End If
msg = msg & vbCrLf & "▼選択されたコンボボックス"
If cmBox_no > -1 Then
  msg = msg & vbCrLf & cmBox_no + 1 & "番目の" & cmBox_str
Else
  msg = msg & vbCrLf & "1つも選択されていません"
End If
MsgBox msg
End Sub
「VBA ユーザーフォームの値の取得方法」の回答画像1
    • good
    • 3

お探しの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エクセル VBA ユーザーフォームを閉じる

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

Aベストアンサー

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

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 で現在開いているブックのファイル名を取得する方法

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

Aベストアンサー

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

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

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

すいません、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...続きを読む

Aベストアンサー

こんばんは。

引数の渡し方には二種類ありますから、それを混乱しているのだと思います。必ずしも、以下の方法が良いというわけではありませんが、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

こんばんは。

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

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

Public m As Integer

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

Private Sub CommandBu...続きを読む

QVBA コンボボックスで選んだ値を取得するには

ユーザーフォーム上のコンボボックスから値を選択し、その値を変数として使いたいのですが、うまくいきません。

コンボボックスのコードで
Private Sub ComboBox1_Change()
moji1 = ComboBox1.Text
Range("A1").Value = moji1
のようにすれば、コンボボックスから値を選んだ時点でA1セルにその値をコピーできるのですが、同じユーザーフォーム上にあるコマンドボタンをクリックして実行する「マクロ1」にてこのmoji1という変数を使いたいのです。

マクロ1にて、上記と同じ
Range("A1").Value = moji1
というコードを記述しても、ユーザーフォームで選択した値が消えており、empty値となってしまいます。

原因をご存知の方はお教えください。

Aベストアンサー

原因については下記を参考にしてください。
http://pc.nikkeibp.co.jp/pc21/special/2007_gosa/eg5.shtml

QVBAです。ユーザーフォームの表示させ、標準モジュールを読み込ませる方法について

こんばんわ。

教えていただけないでしょうか。。。

ワークシート上にコマンドボタンがあり、それを押すと集計を始めます。
その際にユーザーフォームで「集計中」と書いたものを表示させ、バックで集
計したいと思っておりますが、うまくいっておりません。

流れとしては、
ワークシート上に、コマンドボタンをクリックさせユーザーフォームを表示さ
せる「***.show」を記述し、集計するためのコードが書いてある標準モジュー
ル「module2」へ移動させる書き方をしたら、
***.show
の部分で止まってしまいました。
***.showから集計のコードへ移すには何かコツがいるのでしょうか???

恐れ入りますが、ご教示のほど宜しくお願いします。

Aベストアンサー

ANo2の方のを少し改良すると
'シートモジュール----------------------------------------------
Private Sub CommandButton1_Click()
 Call Test
End Sub

'標準モジュール----------------------------------------------
Sub Test()
Dim i As Long
 UserForm1.Show vbModeless
 DoEvents
 For i = 1 To 2000
  ActiveSheet.Range("A" & i) = i

  'ここを改良
  If i mod 10 = 0 then
   UserForm1.Caption = "ただいま処理中・・・・" & i
   DoEvents
  End if

 Next i
 Unload UserForm1
End Sub

ウィンドウズの処理(メッセージキュー?)の中では、画像処理の優先度が低いのです。
なので、表示を更新したい場合はDoEventsを入れて、表示をリフレッシュさせるのです。

ANo2の方のを少し改良すると
'シートモジュール----------------------------------------------
Private Sub CommandButton1_Click()
 Call Test
End Sub

'標準モジュール----------------------------------------------
Sub Test()
Dim i As Long
 UserForm1.Show vbModeless
 DoEvents
 For i = 1 To 2000
  ActiveSheet.Range("A" & i) = i

  'ここを改良
  If i mod 10 = 0 then
   UserForm1.Caption = "ただいま処理中・・・・" & i
   DoEvents
  End if

 Nex...続きを読む

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

どうぞよろしくお願いします。

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

Qユーザーフォームを表示中にシートの操作をさせるには

ユーザーフォームを表示中にシートの操作をさせる事はできるのでしょうか。
セルへの入力、画面のスクロールなどは、ユーザーフォームからマクロを実行させたり、.hideでユーザーフォームを一時的に隠すなどすればいいのでしょうが、そういう手段をとらないでユーザーフォームを表示中にシートの操作をさせる事はできるのでしょうか。

Aベストアンサー

ユーザフォームの
ShowModalプロパティを
falseにすればよいかと。


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

人気Q&Aランキング