- ベストアンサー
エクセルVBAのコードについての質問
- エクセルのVBAについて質問があります。特定の条件に基づいてセルに値を入力するプログラムについて、要素を追加・変更したいです。
- 具体的には、特定のオプションボタンの選択に応じて、選択したオプションボタンに対応するシートに値を入力するようにしたいです。
- 提供されたコードを使用して値を入力するプログラムを作成しましたが、コードの意味や役割が理解できないため、説明していただけると助かります。
- みんなの回答 (13)
- 専門家の回答
質問者が選んだベストアンサー
これが2回目分です。 ■次に、UserForm2~5それぞれに次のコードをコピペする '----●UserForm2 ---------- Private Sub CommandButton1_Click() On Error Resume Next Unload UserForm2 Unload UserForm3 Unload UserForm4 Unload UserForm5 End Sub Private Sub CommandButton2_Click() UserForm2.Hide UserForm3.Show End Sub '----●UserForm3 -------- Private Sub CommandButton1_Click() UserForm3.Hide UserForm2.Show End Sub Private Sub CommandButton2_Click() UserForm3.Hide UserForm4.Show End Sub '----●UserForm4 -------- Private Sub CommandButton1_Click() UserForm4.Hide UserForm3.Show End Sub Private Sub CommandButton2_Click() UserForm4.Hide UserForm5.Show End Sub '----●UserForm5---------- Private Sub CommandButton1_Click() UserForm5.Hide UserForm4.Show End Sub Private Sub CommandButton2_Click() Dim Lastrow As Long With Sheets(KirokuSheetName) Lastrow = .Cells(Rows.Count, "A").End(xlUp).Row .Cells(Lastrow + 1, "A").Value = GetCaption(2) .Cells(Lastrow + 2, "A").Value = GetCaption(3) .Cells(Lastrow + 3, "A").Value = GetCaption(4) .Cells(Lastrow + 4, "A").Value = GetCaption(5) End With Unload UserForm2 Unload UserForm3 Unload UserForm4 Unload UserForm5 End Sub Private Function GetCaption(N) As String Dim i As Integer GetCaption = "" For i = 1 To 4 If UserForms(N - 2).Controls("OptionButton" & i).Value Then GetCaption = UserForms(N - 2).Controls("OptionButton" & i).Caption Exit For End If Next i End Function '------------------------------ 質問者が先にテストしたブックで動作を確認すること! 以上です。
その他の回答 (12)
- myRange
- ベストアンサー率71% (339/472)
おや、まあ、2回に分けたら投稿できた。 原因不明ですが、投稿できたので、よしとしませう。 これが最後の回答になるように、祈って。。。 以上です。
- myRange
- ベストアンサー率71% (339/472)
myRangeです。 昨夜から何回も投稿を試みるが、アクセス集中、で拒否され、今朝も同様。 恐らく、OKWAVEのシステムがバグっているのだろうと推測。 OKWAVE,しっかりせんかぃっ! と叱咤激励したい気分。 と、ま、それは置いといて、今回の投稿もちょと長いので2回に分けてみる。 これは、1回目。 第一段階、上手くいって何よりです。 第二段階ですが、これは、Userform2~5のOptionのCaptionを 【第一】段階のUserForm1で選択したシートのA列に転記、ですね? '----------------------------------------- ■先ずUserForm1の宣言セクションの変数KirokuSheetNameを削除して 標準モジュールの最初(宣言セクション)に Public KirokuSheetName As String とグローバル変数として宣言する '----------------------------------------- ■印刷シートへ次のコードを追加 Private Sub CommandButton2_Click() If KirokuSheetName = "" Then MsgBox "シート名が選択されてない" Else UserForm2.Show End If End Sub '------------------------------------------- ここまでが1回目送信分。
補足
コード試しました。 コマンドボタン2をクリックすると、シート名が洗濯されてない。 とメッセージがでてきます。 ちゃんと最初にコマンドボタン1で転記先シートを決めた上でやりましたが、どうしてなのでしょうか?
- myRange
- ベストアンサー率71% (339/472)
暇なのでまたまた登場、myRangeです。 >言われた通りにやっているのですが・・・。 >9.印刷シートのコードを開いて、教えていただいたサンプルコードをコピペする これを見て、おい、おい、ということで、前回の回答を見たところ、 あろうことか当方が、コードを印刷シートのモジュールへと言ってますね。 それは間違いで、 回答のコードをコピペする場所は、印刷シートではなくて、●UserForm1●です。 印刷シートには下記のようにUserForm1を表示させるコードのみを書いておく。 Private Sub CommandButton1_Click() UserForm1.Show End Sub これで上手くいくでしょう。 以上です。
お礼
私のフォームでもうまくいきました。 次なんですが、印刷シートにコマンドボタン2があります。 それには以前説明したようなオプションボタンで選択していって記録するマクロがあるのですが、コマンドボタン1で選択した転記先シートと同じところに転記するのはどのようにするのでしょうか?
補足
できました!!! あせっていた気持ちがすごく楽になりました。 今から自分のに試します! 未熟な私に丁寧に付き合ってくれてありがとうございます><。 自分ので試したらまた報告いたします!
- myRange
- ベストアンサー率71% (339/472)
>If ComboBox1.ListIndex = -1 Then >で実行エラー424が発生します。 424の他に、エラーメッセージは表示されませんでしたか? 表示されてたらそれも提示しないと分かりません。 コントロールの種類、数、シート名など前回の回答の条件を満たしているんですよね。 ま、何れにしろ、アップしたコードは●テスト済み●なので 回答のとおりすればエラーは出ないはずです、というより、 エラーの出るような部分はありません。 で、試しに、新しいブックでシート名など回答の条件でアップしたコードを試してみてください。 UserForm1だけにすること。 その後、現在使用してエラーが出るというコードをアップしてください。 UserForm1のモジュールに書いてあるコードを全部アップすること。 文字制限(2000文字)をオーバーするようだったら、2回に分けて投稿のこと。 以上です。
補足
言われた通りにやっているのですが・・・。 私がしていることを順を追っていいますね。 1.エクセル起動 2.シートを6個用意する 3.シート1を印刷 シート2をリスト シート3~6を記録1~4に名前を書き換える 4.印刷シートにコマンボボタン1を作成 5.VBA起動 6.userform1を作成 7.userform1にオプションボタンを4個 コンボボックスを1個 テキストボックスを5個 コマンボボタンを1個作成 8.オプションボタン1のCaptionを記録1 オプションボタン2のCaptionに記録2とその後3,4を同様にする 9.印刷シートのコードを開いて、教えていただいたサンプルコードをコピペする 10.リストのA2からA9まで適当な文字を入力 B列C列D列も同様に適当に打ち込む 11.印刷シートにあるコマンドボタンをクリックし、マクロを起動させる 12.すると実行時エラー424 オブジェクトが必要です となりコードにいき、先ほどの場所が黄色で囲まれている このようになってしまいます・・・。 試験の動作確認でこうなるので、自分のものではまだためしていません。
- myRange
- ベストアンサー率71% (339/472)
myRange、連続投稿。サンプルコードです。 以下のコードを 印刷シートモジュールにセットして実行する。 先に示したシート名などの条件は必ず遵守すること。 '------------------------------------------------- Dim ListAdrs Dim KirokuSheetName As String Private Sub UserForm_Initialize() OptionButton1.Caption = "記録1" OptionButton2.Caption = "記録2" OptionButton3.Caption = "記録3" OptionButton4.Caption = "記録4" ListAdrs = Split("A2:A9,B2:B9,C2:C9,D2:D9", ",") End Sub '--------------------------------------------- Private Sub ComboBox1_Enter() Dim i As Integer KirokuSheetName = "" For i = 1 To 4 If Controls("OptionButton" & i).Value Then ComboBox1.List = Sheets("リスト").Range(ListAdrs(i - 1)).Value KirokuSheetName = Sheets(Controls("OptionButton" & i).Caption).Name Exit For End If Next i If KirokuSheetName = "" Then MsgBox "OptionButtonにチェックが入ってない!" End If End Sub '----------------------------------------------- Private Sub CommandButton1_Click() Dim i As Integer Dim Lastrow As Long If ComboBox1.ListIndex = -1 Then MsgBox "ComboBoxが選択されてない" Exit Sub End If With Sheets("印刷") .Range("A1").Value = ComboBox1.Value .Range("A4").Value = TextBox1.Value .Range("A5").Value = TextBox2.Value .Range("B3").Value = TextBox3.Value .Range("D3").Value = TextBox4.Value .Range("D4").Value = TextBox5.Value End With With Sheets(KirokuSheetName) Lastrow = .Cells(Rows.Count, "A").End(xlUp).Row .Cells(Lastrow + 1, "A").Value = ComboBox1.Value .Cells(Lastrow + 1, "B").Value = TextBox1.Value .Cells(Lastrow + 1, "C").Value = TextBox2.Value .Cells(Lastrow + 1, "D").Value = TextBox3.Value .Cells(Lastrow + 1, "E").Value = TextBox4.Value .Cells(Lastrow + 1, "F").Value = TextBox5.Value End With Unload UserForm1 End Sub '---------------------------------------------------- 以上です。
補足
サンプルコードありがとうございました。 また、補足説明に不備があり、申し訳ありませんでした。 ご説明頂いたとおりしましたが、 Private Sub CommandButton1_Click() Dim i As Integer Dim Lastrow As Long If ComboBox1.ListIndex = -1 Then MsgBox "ComboBoxが選択されてない" Exit Sub End If のIf ComboBox1.ListIndex = -1 Then で実行エラー424が発生します。 どうすればいいのでしょうか?
- myRange
- ベストアンサー率71% (339/472)
補足要求の重要事項が補足されてません。 なぜ無視するでしょうか? 質問者のための補足要求ですよ! なかなか意思の疎通が図れないようなので 手始めに、UserForm1の分だけのコードをアップしてみましょう。 よって、新しい補足は不要です。 ●シートの名前は必ず次のようにすること 印刷用シート、、、印刷 リストシート、、、リスト 記録用シート、、、記録1~記録4(数字は全角) ●記録シート名の取得 UserFom1のOptionButtonのCaptionと同じとする (Captionが、記録1とか記録4とかになってるということ) ●リストシートの一覧は次のようになってること OptionButton1用: A2~A9 OptionButton2用: B2~B9 OptionButton3用: C2~C9 OptionButton4用: D2~D9 上記のような条件で、サンプルコードは続けて投稿します。
- myRange
- ベストアンサー率71% (339/472)
またまたまた登場、myRangeです。 >===== 印刷シートに別のコマンドボタンをもうひとつ用意しています。 そのマクロとは、userformにオプションボタンを4個程度配置しています。 そのオプションボタンを選択形式でまた次の同じようなオプションボタンが4個あるようなuserformへと進んでいきます。 userformはhideで一旦隠して、最後のuserformで今まで隠していて、選択されているオプションボタンのcaptionを転記していくといった内容になっています。テキストボックスもいくつかありますが。。。 参考までに全部ではありませんがコードをのせておきます。 If UserForm1.OptionButton1 = True Then .Range("a" & m_row).Value = UserForm1.OptionButton1.Caption ElseIf UserForm1.OptionButton2 = True Then .Range("a" & m_row).Value = UserForm1.OptionButton2.Caption <===== ●更に補足が必要です。 ●簡単のために、UserFormが1~3の3つあり、 UserForm1がメイン、2~3がサブと仮定して、、 (以下、UserFormは、Formと書く) --------------------------------------------------- Form1のボタンでForm1の内容を転記したあと このForm1は、Unloadするのか、Hideするのか? -------------------------------------------------- 印刷シートのボタン2で、Form2を表示するのは分かったが そこから次のForm3を表示するタイミングが不明。 例えば、Form2にもボタンがありそれでForm3を表示するとか。。 ---------------------------------------------------- 提示のコードでは、Form1のOptionしか書いてないが 実際は、Form1~3全てのチェックされたOptionのCaptionを転記したいということか また、提示のコードでは、記録シートの【A列】転記するようになってるが 前回の補足には ○リストから選択したものが印刷用シートA列1行と記録用シートのA列の空白セルに転送。 このように、記録用シートのA列には、Form1のComboで選択した項目を転記とあるが、 そこら辺りをもっと詳しく補足のこと。 ----------------------------------------------------- ■■■注意点■ するしないは別にして、実際の流れを実際に即して提示しないと (要するに今までのように小出しにしないということ) コードをアップする前に何回も遣り取りをしないといけなくなるので そこら辺りを十分に考慮して質問補足すること 尚、コード自体は簡単なものですので(但し、慣れた人にとっては)、 あとは質問者がやりたいことをちゃんと説明できるかどうかです。 以上です。
補足
おはようございます。 私の説明不足で混乱させてしまっていますね・・・。 申し訳ありません。 印刷用シートの最初に補足しましたコマンドボタンを1とします。 今回のもうひとつのコマンドボタンを2とします。 コマンドボタン1と2の関連性は、コマンドボタン1で決定した「どのシートに転記するか」だけです。 前回の補足でコードを表示しましたが、userform1とか書いてあるからややこしかったのですね・・・。 コマンドボタン2のみの機能を説明致します。 コマンドボタン2はuserformが4個で成り立っております。 仮に各々のuseroformをA~Dとします。 formA~Dは同じような構成です。 オプションボタンG オプションボタンH オプションボタンI オプションボタンJ コマンドボタンL コマンドボタンY ↑前のformに戻る ↑次のformへ進む機能を 機能を持たせている 持たせている このようになっております。 ただし、formAのコマンボドタンLはformAをunload。 formDのコマンドボタンYはformA~Dまでのオプションボタンの内容を転記するきっかけとします。 formAでオプションボタンンを選び、コマンドボタンLを選択して一旦formし、formBへ。formBでも同様にオプションボタンを選び、コマンドボタンでhideにしてformCへと続いていくようにしています。 で最後にformDで一斉に転記としています。
- myRange
- ベストアンサー率71% (339/472)
またまた登場、myRangeです。 初めからそのように書けば分かりやすかったですね。 それにしても最初とは随分と違う質問になりましたねぇ。。(^^;;; ただ、も少し補足が必要です。 >4個のオプションボタンがあり >オプションボタン毎にコンボボックスのリストが変化する。 コンボボックスにリストを設定するタイミングは? オプションボタンをクリックした瞬間にセットする? >5個テキストボックスの内容を印刷用シートのあるセルと >記録用シートの、先ほどと同じ行に転送。 記録シートは転記するたびに行方向に増えていくが 印刷用シートは転記するたびに増えていかないで、 常に決まったセルに転記するのか? また、印刷用シートの【ある】セル、とはどのセル? それから、転記が終了した後の処理の流れはどうなっているか? 例えば、1件転記したあと、次はどんな処理をするのかということです。 上記が補足されたらサンプルコードをアップします。 以上です。
補足
返答ありがとうございます。 ネット上のマクロ講座で勉強はしたのですが、求めているものを簡潔に考えようとしても難しいです・・・。 未熟な私の手助けをしていただいて本当にありがとうございます。 コンボボックスにリストを設定するタイミングは? オプションボタンをクリックした瞬間にセットする? そうです。オプションボタン4個のすぐ↓にコンボボックスを設けているので、オプションボタンを選択後、コンボボックスでリスト内から選択といった形をとりたいです。 自分でも色々調べたのですが、オプションボタンを色々変更してクリックするとリストがおかしくなっちゃったりするのですよね・・・? 記録シートは転記するたびに行方向に増えていくが 印刷用シートは転記するたびに増えていかないで、 常に決まったセルに転記するのか? おっしゃるとおりです。 印刷用はフォーマットを作っているので決まった箇所に転記されたいのです。 記録用は、今後データを行ごとに蓄積し、管理したいので、最初のコンボボックスの選択したリスト内容を転記した同じ行にしたいのです。ご理解はいただいていると思いますが、データは蓄積したいのでリスト転記は空白セルを検索し、転記させたいのです。 また、印刷用シートの【ある】セル、とはどのセル? テキストボックス1はA4 テキストボックス2はA5 テキストボックス3はB3 テキストボックス4はD3 テキストボックス5はD4 です。 一件転記した後ですが、 印刷シートに別のコマンドボタンをもうひとつ用意しています。 そのマクロとは、userformにオプションボタンを4個程度配置しています。 そのオプションボタンを選択形式でまた次の同じようなオプションボタンが4個あるようなuserformへと進んでいきます。 userformはhideで一旦隠して、最後のuserformで今まで隠していて、選択されているオプションボタンのcaptionを転記していくといった内容になっています。テキストボックスもいくつかありますが。。。 参考までに全部ではありませんがコードをのせておきます。 If UserForm1.OptionButton1 = True Then .Range("a" & m_row).Value = UserForm1.OptionButton1.Caption ElseIf UserForm1.OptionButton2 = True Then .Range("a" & m_row).Value = UserForm1.OptionButton2.Caption ElseIf UserForm1.OptionButton3 = True Then .Range("a" & m_row).Value = UserForm1.OptionButton3.Caption ElseIf UserForm1.OptionButton4 = True Then .Range("a" & m_row).Value = UserForm1.OptionButton4.Caption End If これらの作業が一通りとして、また同じ作業をすると違う行にデータが蓄積されていくようにしたいのです。 説明に不足な点だらけとは思いますがよろしくお願い致します。
- phoenix343
- ベストアンサー率15% (296/1946)
#2です | With Worksheets("sheet2")を | Worksheets("OptionButton1.Caption") | みたいになるわけですか? ""はいりません ""で囲むとただの文字列と扱われます Worksheets(OptionButton1.Caption) ※変数と聞いてワカラナイのであれば、 まずはVBAでの基本を抑えないと、 この先もっとワカラナイと思いますよ 笑
- myRange
- ベストアンサー率71% (339/472)
期限が迫っていて焦ってらしいのは分かりますが、 最初の質問と、回答1の補足はほとんど別物になってますし 何をどうしたいのかが明確には読み取れません。 回答1の補足の質問者のたコードも説明とは全然異なっていますし。 特に、以下は意味不明です。 >また、userform1で決めた、記録先シート(オプションボタン1~5のいずれを選択したか)に他のuserfromでの内容を記録していきたいのです。 >他のuserfromtとは下記のようになります。 >オプションボタンを選択してuserformを進んでいき、最後のuserformにコマンドボタンがあり、オプションボタンに名前を記録していくマクロです。 UserForm1以外のUserFormがいくつあるのか書いてない、 また、UserFormを進んできき、とはどういうことか さらに、最後のUserformとは? そしてまた、Userform1ではtextBoxの内容を記録するとあるが 他のUserFormではオプションボタンに名前を記録する、になってる 名前を記録するとは? ここでいうオプションボタンはどのUserFormにあるのか などなど疑問点を挙げれば限がありませんね。。(^^;;; UserFormの数、それぞれのコントロール、それらの役目、転記するセル。。。など やりたいことを実際に即して詳細に再度補足した方がいいでしょう。
補足
説明が下手で申し訳ありません。 順を追って説明したいのですが・・・。 どんなVBAが完成してほしいか書き出したほうがよろしいでしょうか? 書き出してみます。 シートは全部で6シート。 うち4シートは記録用です。 もう1シートはコンボボックスのリストデータ用です。 残り1シートは印刷用です。 印刷用シートにコマンドボタンが3個あります。 印刷用シートのコマンボボタン1をクリックすると、userform1が呼び出される。 userform1に持たせたい機能 1. 4個のオプションボタンがあり、オプションボタン毎にコンボボックスのリストが変化する。 2. テキストボックスが5個ある。 3. コマンドボタンがあり、そのコマンドボタンをクリックすると以下の用に動いてほしい。 ○ リストから選択したものが印刷用シートA列1行と記録用シートのA列の空白セルに転送。 ○ オプションボタン1を選択した場合は記録用のシート1に、オプションボタン2はシート2、オプションボタン3はシート3、オプションボタン4はシート4としたいです。 ○ 5個テキストボックスの内容を印刷用シートのあるセルと、記録用シートの、先ほどと同じ行に転送。 この場合テキストボックス1をB列、テキストボックス2をC列・・・・。 このようにしたいです。 わかります・・・か? 説明が下手で申し訳ありません。
- 1
- 2
補足
今帰宅しました。 昨晩はそのような障害があったんですか・・・。 何度も投稿を試みて頂いてありがとうございました。 頂いたサンプルコードですが、後日確認させて頂きます。 ありがとうございました。 また3回目の投稿にコメントさせて頂きます。