- 締切済み
マクロ/VBAにてフレーム内複数コンボボックスの作り方
エクセルにて予約表を作成しました。 入力する方があまりキーボード入力が得意ではないので入力画面を作りました。一通り完成し、登録コマンドボタンを押すと予約表の最下部行に入力されるようにしたのですが、1つだけうまくいきません…。 それはフレーム内に50音順でコンボボックスを配置している部分です。(「ア・イ・ウ・エ・オ・カ・キ・ク・ケ・コ・…」と続き、「ワ」までです。) 各50音のコンボボックスには予め50音に分けて作ってある業者リストを選択できるようにし、そのフレーム内で1つ選択すると他は選択できないようにしたいのですが…。 プログラミングに関しては初心者ですので、分かる方がいましたら、ご教授お願い致します。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- KenKen_SP
- ベストアンサー率62% (785/1258)
> .Cells(mySNewRow, "G").Value = fraName1.Controls("cboA1").Value > .Cells(mySNewRow, "G").Value = fraName1.Controls("cboI1").Value これだと、cboA1 と cboI1 が同じG列のセルに書き込まれます。原因は ここだと思います。 以下は余談です。 Cells ですが基本的な書式は次のとおりです。 Cells(行番号,列番号) 例えば、A1 セルなら Cells(1,1) だし、C5 セルなら Cells(5,3) です。 このとき次のような書き方もできます。 Cells(1,"A") 列番号を文字列で指定することができます。本当は数値で指定した方が 処理速度は速いのですが、体感できるほどの違いはありません。 詳しくは VBA のヘルプを見て下さい。
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは。KenKen_SP です。横レス失礼します。 そのままできませんか?エラーになる?現状でどのような結果になるの ですか? 例えば、フレーム内であっても Cells(1, 1).Value = ComboBox1.Value で転記できるはずです。もし明示的に書くなら Cells(1, 1).Value = Frame1.Controls("ComboBox1").Value でもいけます。それから、ご提示されたコードですが、With 句を使うと スッキリしますよ。こんな感じ。 Private Sub cmdToroku_Click() Dim mySNewRow As Long With Worksheets("6月") mySNewRow = .Range("A65536").End(xlUp).Row + 1 .Cells(mySNewRow, "A") = cboDay.Value .Cells(mySNewRow, "B") = cboArea.Value .Cells(mySNewRow, "C") = cboTime.Value .Cells(mySNewRow, "D") = cboBusnumber.Value .Cells(mySNewRow, "E") = txtName1.Value .Cells(mySNewRow, "F") = txtNumber.Value .Cells(mySNewRow, "H") = txtCharge.Value .Cells(mySNewRow, "I") = cboLodging.Value .Cells(mySNewRow, "K") = txtRemarks.Value .Cells(mySNewRow, "L") = cboInput.Value End With End Sub
#1です。 申し訳ないのですが質問の意味がわかりかねます。 具体的にどの部分のどのコードがわからないのかを提示して頂けますか?
補足
手間をとらせて申し訳ありません。 ユーザーフォームによる入力画面に、各テキスト、コンボボックスを入力・選択、「登録」コマンドボタンを押した際のコード記述についてです。普通の(フレーム外)テキスト、コンボボックスをエクセルシートに転写(自動入力)はできたのですが、フレーム内に配置したコンボボックスを転写(自動入力)が分かりません。フレーム内の複数コンボからどれか1つ選び、どれを選んだときも同じセルに転写されるようしたいのですが。(分かりづらくすみません。) 以下は分からない部分のコードです、参考に。 Private Sub cmdToroku_Click() Dim mySNewRow As Long mySNewRow = Worksheets("6月").Range("A65536"). _ End(xlUp).Row + 1 Worksheets("6月").Range("A" & mySNewRow) = _ cboDay.Value mySNewRow = Worksheets("6月").Range("A65536"). _ End(xlUp).Row Worksheets("6月").Range("B" & mySNewRow) = _ cboArea.Value mySNewRow = Worksheets("6月").Range("A65536"). _ End(xlUp).Row Worksheets("6月").Range("C" & mySNewRow) = _ cboTime.Value mySNewRow = Worksheets("6月").Range("A65536"). _ End(xlUp).Row Worksheets("6月").Range("D" & mySNewRow) = _ cboBusnumber.Value mySNewRow = Worksheets("6月").Range("A65536"). _ End(xlUp).Row Worksheets("6月").Range("E" & mySNewRow) = _ txtName1.Value mySNewRow = Worksheets("6月").Range("A65536"). _ End(xlUp).Row Worksheets("6月").Range("F" & mySNewRow) = _ txtNumber.Value mySNewRow = Worksheets("6月").Range("A65536"). _ End(xlUp).Row Worksheets("6月").Range("H" & mySNewRow) = _ txtCharge.Value mySNewRow = Worksheets("6月").Range("A65536"). _ End(xlUp).Row Worksheets("6月").Range("I" & mySNewRow) = _ cboLodging.Value mySNewRow = Worksheets("6月").Range("A65536"). _ End(xlUp).Row Worksheets("6月").Range("K" & mySNewRow) = _ txtRemarks.Value mySNewRow = Worksheets("6月").Range("A65536"). _ End(xlUp).Row Worksheets("6月").Range("L" & mySNewRow) = _ cboInput.Value End Sub
Private Sub ComboBox1_Change() ComboBox2.Enabled = False End Sub のようにコンボボックスのコードに自分以外のコンボボックスを使えない ように全てに記述すればできます。ただし、間違えて選択した場合のことを 考える必要があるかと思いますが。
補足
さっそく回答ありがとうございます。 間違った場合も考えなくてはならないのですね…。 フレーム内に44個のコンボボックスがあるので気合で全て記述しようと思うのですが…、作ってある登録コマンドボタンをクリックした際のフレームについてのコード記述が分からなくなってしまいました。 申し訳ないのですが、分かればご教授お願い致します。
お礼
すみません、先ほどの補足への追加です。 コードの .Cells(mySNewRow, "G").Value = fraName1.Controls("cboA1").Value .Cells(mySNewRow, "G").Value = fraName1.Controls("cboI1").Value の「""」が抜けていたのでエラーが出ていたようです。 修正後、実行するとエラーは出ないのですが、正しく入力できません。「cboA1」を選択入力すると、何も入力されず、「cboI1」を選択入力すると一応、フォーム通りに入力されます?? 原因が分かれば、是非教えていただけないでしょうか? 宜しくお願い致します。
補足
たいへんありがとうございます、コードがすっきりしました! ところがまだ「実行時エラー1004」が出てきます。 テストということで、フレーム内のコンボは2つでコードを書いてます。(実際は44個必要) 必ずフレーム内のコンボをどれか1つ選択し、それを常に同じ最下行に転写したいのですが…。 申し訳ありませんがご教授お願いします。 現在のコードは以下です。 Private Sub cmdTojiru_Click() Unload userform1 End Sub Private Sub cmdToroku_Click() Dim mySNewRow As Long With Worksheets("6月") mySNewRow = .Range("A65536").End(xlUp).Row + 1 .Cells(mySNewRow, "A") = cboDay.Value .Cells(mySNewRow, "B") = cboArea.Value .Cells(mySNewRow, "C") = cboTime.Value .Cells(mySNewRow, "D") = cboBusnumber.Value .Cells(mySNewRow, "E") = txtName1.Value .Cells(mySNewRow, "F") = txtNumber.Value .Cells(mySNewRow, "H") = txtCharge.Value .Cells(mySNewRow, "I") = cboLodging.Value .Cells(mySNewRow, "K") = txtRemarks.Value .Cells(mySNewRow, "L") = cboInput.Value .Cells(mySNewRow, G).Value = fraName1.Controls("cboA1").Value .Cells(mySNewRow, G).Value = fraName1.Controls("cboI1").Value End With End Sub Private Sub userform_Initialize() Dim mySno As Integer myLastRow = Worksheets("設定1").Range("A65536"). _ End(xlUp).Row cboDay.RowSource = "設定1!A1:A" & myLastRow cboArea.RowSource = "設定1!B1:B" & myLastRow cboTime.RowSource = "設定1!C1:C" & myLastRow cboBusnumber.RowSource = "設定1!D1:D" & myLastRow cboLodging.RowSource = "設定1!F1:F" & myLastRow cboInput.RowSource = "設定1!H1:H" & myLastRow cboA1.RowSource = "設定2!A1:A" & myLastRow cboI1.RowSource = "設定2!B1:B" & myLastRow End Sub