• 締切済み

コンボボックスのvba 作成の仕方

私は、月別にデータを作っています。なので、月ごとにデータを見られるようなボタンを作成したいです。 現在組んでいるマクロは、ボタン(普通の四角いもの)を押すごとに、翌月データをコピペするというものになっています。 (以下、現在のコード記載) Sub auto_open() Dim wkm As Long Dim wkn As Long Dim wkt As Variant Dim wks As Variant Dim dt As Date Dim mi As Integer dt = Date mi = Month(dt) wkt = Array(0, 10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9) wks = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12) wkm = wkt(mi) Call Macro1(wkm) Sheets("住宅資金").Range("A3") = wks(mi) End Sub Sub Next_Month() Dim wks As Variant Dim dt As Date Dim mi As Integer wks = Array(0, 10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9) If Sheets("住宅資金").Range("A3") = 12 Then wkm = 10 Else wkm = wks(Sheets("住宅資金").Range("A3") + 1) End If Call Macro1(wkm) wks = Array(0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3) Sheets("住宅資金").Range("A3") = wks(wkm) End Sub Sub Macro1(ByVal wkm As Long) With Sheets("入力") Sheets("住宅資金").Range("D5:D23").Value = .Range("C5:C23").Offset(, wkm - 1).Value Sheets("住宅資金").Range("J5:J23").Value = .Range("C28:C46").Offset(, wkm - 1).Value Sheets("住宅資金").Range("P5:P23").Value = .Range("T28:T46").Offset(, wkm - 1).Value Sheets("住宅資金").Range("O5:O23").Value = .Range("T5:T23").Offset(, wkm - 1).Value Sheets("住宅資金").Range("F5:F23").Value = .Range("O5:O23").Value Sheets("住宅資金").Range("L5:L23").Value = .Range("O28:O46").Value End With With Sheets("目標") Sheets("住宅資金").Range("C5:C23").Value = .Range("B4:B22").Offset(, wkm - 1).Value Sheets("住宅資金").Range("I5:I23").Value = .Range("B27:B45").Offset(, wkm - 1).Value End With With Sheets("前年同期") Sheets("住宅資金").Range("H5:H23").Value = .Range("C5:C23").Offset(, wkm - 1).Value Sheets("住宅資金").Range("N5:N23").Value = .Range("C28:C46").Offset(, wkm - 1).Value Sheets("住宅資金").Range("Q5:Q23").Value = .Range("T5:T23").Offset(, wkm - 1).Value End With End Sub さて、現在作りたいと思っているものを以下に記述します。 普通の四角いボタンではなく、コンボボックスを使用して、矢印(▼)を押すことによってリストが表れ、 「1月」に合わせたら1月のデータがコピペされる、「8月」に合わせたら8月のデータがコピペされる、というものを作りたいと思っています。 以下のような空欄の表を作成したシートがあります。        A    B    C   D 1      目標  実績  …   … 2 ○支所   3 △支所 4  ・ 5  ・ 6  ・ 別のシートに、手入力した月別のデータがあります。 空欄のシートのどこかにコンボボックスを作り、別シートの○月のデータを貼り付けられるようにしたいと思っています。 コンボボックスの作り方がわからず、後一歩のところでつまずいてしまいました。 知恵をお貸しください。 よろしくお願いいたします。

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

現在の処理のコードなど長々と書いて、読者に読み解かせているから、読むのが面倒くさくて、回答がついてないように思う。 もう少し文章で簡単に、したいことを表現して質問できないのかな。 また簡単な模擬実例シート例など作っって載せたら。 ーー もうひとつ、何をきっかけにして操作を進めていくのがよいのか(使用者に自然なのか)、事前によく考えましたか。 ==== 下記は、質問者の意図するパターンと、似ているかどうかわからないが、下記のようなものをつくってみたから、似ている点があって参考になれば、参考にしたら良い。 ーー Sheet1 シート名 27年9月売上表(数字の全角半角に注意して、コンボのアイテムの文字列と合わせること) りんご みかん イチゴ バナナ a店 12 13 14 15 b店 15 18 21 24 c店 18 23 28 33 d店 21 28 35 42 e店 24 33 42 51 Sheet2 シート名 27年10月売上表 りんご みかん イチゴ バナナ サクランボ a店 24 26 28 30 23 b店 30 36 42 48 44 c店 36 46 56 66 63 d店 42 56 70 84 45 e店 48 66 84 102 26 f店 54 76 98 120 7 --- 以下の「27年11月売上表」などシート例は書略する。 Sheet3 結果を表示するシート シート名 目的シート ーーー ユーザーフォームにコンボを1つ張り付ける。 UserForm_Initialize()イベントと ComboBox1_Click()イベントに 下記を作る。 ーーー Private Sub ComboBox1_Click() Worksheets("目的シート").Cells.Clear sn = UserForm1.ComboBox1.Value MsgBox sn Worksheets(sn).Select Worksheets(sn).Range("A1:F10").Copy Worksheets("目的シート").Range("A1") UserForm1.Hide Application.VBE.MainWindow.Visible = False Worksheets("目的シート").Activate End Sub ’--- Private Sub UserForm_Initialize() Dim myArray() As Variant Dim i As Long ColumnWidth = 120 ReDim myArray(9, 1) myArray(0, 0) = "27年9月": myArray(0, 1) = "27年9月売上表" myArray(1, 0) = "27年10月": myArray(1, 1) = "27年10月売上表" myArray(2, 0) = "27年11月": myArray(2, 1) = "27年11月売上表" myArray(3, 0) = "27年12月": myArray(3, 1) = "27年12月売上表" myArray(4, 0) = "28年1月": myArray(4, 1) = "28年1月売上表" With ComboBox1 .Height = 15 .ColumnCount = 2 '表示列数の設定 .TextColumn = 1 '表示列の設定 .BoundColumn = 2 '値として取得する列の設定 .List() = myArray() 'リスト項目の設定 End With End Sub ーー 使い方 VBE画面の実行ーSub/ユーザーフォームの実行をクリック(シートにコマンドボタンを張り付けて実行のキッカケとすることも良いかもしれない) ユーザーフォーム1が表示される そのコンボのアイテムを1つ選ぶ(クリックする)と たとえば、「27年9月」を選ぶと、「27年9月売上表」が選ばれ(両者はコンボの中で対応づけられている)、この名前のシートのデータをコピーして、目的シートにコピー貼り付けする。 コンボの年月の第1列と、シート名を第2列に取り込んでいるのは、両社が別の文字列でもよいようになっている。 そのため、プログラムの中で、2元の配列にデータを作り、1行のコードでコンボのデータがセットできる。 エクセルVBAではコンボのアイテムのデータ(表)は、シートのセル範囲にセットするのが建前かもしれない。 2列にしなくても使えるかもしれない。 ーーー また「りんご」の列だけを、ユーザーフォームのリストボックスで選択して、27年9月売上表などの「りんご」の列だけ、コピーして「目的シート」へ貼り付けることも、少し手を加えるとできそうだ。

関連するQ&A