- 締切済み
ご教授願います。
エクセルのVBAを多少勉強致しましたが、行き詰っていますのでどなたかご教授願います。 エクセルにコマンドボタンを二つ作成 最初のコマンドボタンをクリックするとコンボボックスが現れます。 コンボボックスには1~4があります。 1はシート1""あいう""のシート 2はシート1""かきく""のシート 3はシート1""さしす""のシート 4はシート1""たちつ""のシート を指定するようになっています。 ここでとりあえず自分の希望のしーとになるように1~4の数字を選びます。 次にもうひとつのコマンドボタンを選択するとテキストボックスが現れます。 記入し、テキストボックスと同userformにあらかじめ作っていたコマンドボタンをクリックすると先ほど選択した1~4にテキストボックスを転送するようにしたいのです。 hideを使って先ほど表示させたコンボボックスのuserformを隠して、テキストボックスのuserformを閉じる際に指定したシートをにとさせようとしましたが、 そのテキストボックスのuserformが何個かあるのでどうすればいいのかわかりません。 どなたかご教授願えませんでしょうか? よろしくお願い致します。 なお、私の説明不足で内容がよくわからなかったら一報ください。 申し訳ありませんが、どうぞよろしくお願い致します。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17069)
> コンボボックスには1~4があります。 1はシート1""あいう""のシート 2はシート1""かきく""のシート 3はシート1""さしす""のシート 4はシート1""たちつ""のシート を指定するようになっています とはどういう意味? コンボが4つ設けられているのか。アイテムか。 >1はシート1""あいう""のシート はどういう意味? ーー コンボに あいう かきく ・・ の4つアイテム(数字でなく文字列で)を作る、ではダメですか? >指定したシートをにとさせようとしましたが、 どういう意味?
- うぃず(@Wizard_Zero)
- ベストアンサー率69% (344/495)
> これは読んで字のごとく、単に標準モジュールに書けばいいのですね。 そうです。 > こうなるのですか? (・ω・;) 変数aはどこから・・・? 私のほうで書いたコードを載せておきますね。 [ 標準モジュール - Modele1 ] ' コンボボックスで選択したシートを記憶するための変数 ' この変数はどこからでも参照できる。 Public SelectedSheet As String [ シート選択 - UserForm1 ] Private Sub UserForm_Initialize() For i = 1 To 4 ComboBox1.AddItem i Next End Sub ' コンボボックスの変更 Private Sub ComboBox1_Change() SelectedSheet = ComboBox1.Text End Sub [ テキスト入力 - UserForm2 ] ' 記入ボタンのクリック Private Sub CommandButton1_Click() ' コンボボックスで選択したシートに書き込む With Worksheets(CInt(SelectedSheet)) m_row = .Range("a" & Rows.Count).End(xlUp).Row + 1 .Range("c" & m_row).Value = UserForm2.TextBox1.Value End With End Sub UserForm2のようなフォームが複数あるなら、すべて同じように記述する必要があります。(全く同じ処理になるなら、関数化することもできますが)
- うぃず(@Wizard_Zero)
- ベストアンサー率69% (344/495)
#1 で示したコードを加えた上で With Worksheets(SelectedSheet) として出来ませんか? SelectedSheetにはComboBox1_Change()のコードによってコンボボックスで選択した文字列(=シートの番号)が入ります。 SelectedSheetはブックが開いている間、常に参照できるように、標準モジュールでPublicとして宣言しておきます。 質問文から、コンボボックスには 1 2 3 4 という数値のみがリスト化されていると推察しました。これ以外の場合は、選択した内容によって、SelectedSheetに格納する値をSelect Case等で変更する必要があります。
- うぃず(@Wizard_Zero)
- ベストアンサー率69% (344/495)
標準モジュールにPublicな変数を用意して、コンボボックスの内容をその変数へ格納すればよいかと。 [ 標準モジュール ] Public SelectedSheet As String [ UserFormのコンボボックスイベント ] Private Sub ComboBox1_Change() SelectedSheet = ComboBox1.Text End Sub 各ボタンで選択シートを得るにはSelectedSheetから取るようにすればコンボボックスのあるUserFormが削除されてもデータが残ります。
補足
返答ありがとうございます。 [ UserFormのコンボボックスイベント ] Private Sub ComboBox1_Change() SelectedSheet = ComboBox1.Text End Sub の場合、選択したシートのどこにテキストボックスの内容が記入されるのでしょうか? 説明には加えませんでしたが、 With Worksheets("sheet2") m_row = .Range("a" & Rows.Count).End(xlUp).Row + 1 .Range("c" & m_row).Value = UserForm2.TextBox1.Value End With といったような現在は決まったシートに空白検索を加えて、テキストボックスの内容を加えようとしています。 これと組み合わせたいので、 With Worksheets("sheet2") ここをコンボボックスで選んだシートにしたいのです。 説明不足で二度手間になっているかもしれませんが、ご教授お願い致します。
補足
返答ありがとうございます。 そうしますとコードはこのようになるのですか? [標準モジュール] Public SelectedSheet As String (これは読んで字のごとく、単に標準モジュールに書けばいいのですね。シートにコードを書くのではないのですね? 無知な質問で申し訳ありません。) [ UserFormのコンボボックスイベント ] Private Sub ComboBox1_Change() SelectedSheet = ComboBox1.Text End Sub [userform(テキストボックス)の完了のコマンドボタン] Select Case a Case 1 m_row = .Range("a" & Rows.Count).End(xlUp).Row + 1 .Range("c" & m_row).Value = UserForm2.TextBox1.Value Case 2 m_row = .Range("a" & Rows.Count).End(xlUp).Row + 1 .Range("c" & m_row).Value = UserForm2.TextBox1.Value Case 3 m_row = .Range("a" & Rows.Count).End(xlUp).Row + 1 .Range("c" & m_row).Value = UserForm2.TextBox1.Value Case 4 m_row = .Range("a" & Rows.Count).End(xlUp).Row + 1 .Range("c" & m_row).Value = UserForm2.TextBox1.Value Case Else End Select End With こうなるのですか? すみません。言い忘れていましたが、 最初にコンボボックスでリストよりシートを選定。 その後複数あるコマンドボタンより、テキストボックスに記入とする流れなのです。 こういった類のuserformが多々あり、このようにするとファイルがすごく重くなりそうな予感がしそうなのです。 しかし、この方法がベストならばこれでいこうと思います。 わがままばかりで大変申し訳rありませんが、どうかお力添えをお願い致します。