• ベストアンサー

【Excel VBA】コンボボックスで選択した値の取得

Excel2003を使用しています。 SheetAから、あるシート(都度選択)にデータを転記するマクロを作成しています。 当初は、下記のように InputBox で、転記先のシート名を入力して、そこからシート名を取得していましたが、確実にシート名を取得するために、ユーザーフォームのコンボボックスから選択するように、変更したいと思います。  MySht = InputBox("転記するシート名を入力してください")   With Sheets("SheetA")    .Range("H6:J9").Copy     Sheets(MySht).Range("M7") ~ これを、コンボボックスで選択した値を上記のコードでいう、MySht に設定(?)したいのですが、どのようにしたらいいでしょうか? コンボボックスで選択した値をセルに転記する方法はわかるので、とりあえず、今は一旦セルに転記していますが、コード内で直接(…というと変かもしれませんが)設定できるのであれば、教えていただきたいのです。 自分だけが使用するものならば、InputBox で十分なのですが、選択するシートのシート名に数字が含まれているので、全角や半角の入力ミスを避けるために、コンボボックスで選択するようにしたらどうかと思ったのですが、何か他にも良い方法があれば、あわせて教えていただけると嬉しいです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.4

なぜコンボボックスなのでしょう? リストボックスにシート名を表示させれば「誤入力」は起きないはずなのですが?  でもコンボボックスを用いるなら「誤入力の可能性」がありますから、エラーチェックが必要になりますよ。 とりあえずUserformにComboboxを1つ配置して、ユーザーフォームのモジュールシートに以下のマクロを貼り付けて試してみてください。 Const excpt As String = "SheetA" 'コピー元のシート名 Private Sub UserForm_Initialize() Dim sht As Worksheet For Each sht In ThisWorkbook.Worksheets   If sht.Name <> excpt Then     Me.ComboBox1.AddItem sht.Name   End If Next sht End Sub Private Sub ComboBox1_Change()   If Len(ComboBox1.Text) = 0 Then     MsgBox "シートを選択するか入力してください"     ComboBox1.SetFocus   Else     On Error GoTo err1     Worksheets(excpt).Range("H6:J9").Copy _       Destination:=Worksheets(ComboBox1.Text).Range("M1")     Unload Me     Exit Sub   End If err1:   MsgBox "該当するシートがないので再入力してください"   ComboBox1.SetFocus End Sub

rx-z5815
質問者

お礼

お礼が遅くなり、申し訳ありません。 >コンボボックスを用いるなら「誤入力の可能性」がありますから 確かにそうですね。 以前、別件で作成したマクロで、コンボボックス使用し、リストからの選択と手入力と両方できて便利だったという記憶があって、今回もコンボボックスで…と思ってしまいました。 誤入力がおきないよう、リストボックスで検討しようと思います。 今回、教えていただいたマクロも大変参考になりました。 ありがとうございました。

その他の回答 (3)

  • mshr1962
  • ベストアンサー率39% (7418/18948)
回答No.3

写す方法はいくつかあります。 方法1.コンボボックスチェンジイベントで値を設定する。 ※コンボボックスの値が変わると動作するマクロ Sub combobox_change() Mysht = combobox.Value 以下継続 方法2.コンボボックスのプロパティのLinkedCellで、特定のセルに値をリンクさせておく Sub macro() MySht = WorkSheets("シート名").RANGE("セル座標").Value 以下継続

rx-z5815
質問者

お礼

お礼が遅くなり、申し訳ありません。 具体的な方法を示していただき、助かりました。 いろんな方法があるのですね。勉強になります。 ありがとうございました。

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

コンボボックスを (1)ユーザーフォームに貼り付ける場合 (2)ワークシートへ貼り付ける場合 どちらをしたのか、質問には明記のこと。 ーー Sheet1に(2)として Private Sub ComboBox1_Click() MsgBox Worksheets("Sheet1").ComboBox1.List(Worksheets("Sheet1").ComboBox1.ListIndex) End Sub をSheet1のイベントのコンボボックスのクリックイベントに入れれば 実験になるでしょう 実際はx=Worksheets("Sheet1").ComboBox1.List(Worksheets("Sheet1").ComboBox1.ListIndex) として 最終は Private Sub ComboBox1_Click() 'MsgBox Worksheets("Sheet1").ComboBox1.List(Worksheets("Sheet1").ComboBox1.ListIndex) x = Worksheets("Sheet1").ComboBox1.List(Worksheets("Sheet1").ComboBox1.ListIndex) Sheets(x).Select End Sub となると思うが。 簡単に Private Sub ComboBox1_Click() x = Worksheets("Sheet1").ComboBox1.Value MsgBox x Sheets(x).Select End Sub でもOKのようだ。 ーー それにしても、WEBや本ならコントロール(の中のコンボボックス)の説明のところに、選択したアイテムのとり方は必ず載っているよ。 WEB照会でも、Googleなどで「VBA コンボボックス」で照会すれば、沢山実例が出て、すぐ判る。

rx-z5815
質問者

お礼

お礼が遅くなり、申し訳ありません。 丁寧に説明していただき、助かりました。 WEBや参考書でも調べましたが、いまひとつ求めるものと違うようでしたので、質問させていただいた次第です。

  • marbin
  • ベストアンサー率27% (636/2290)
回答No.1

>コンボボックスで選択した値をセルに転記する方法はわかるので、 こんな感じかな? Worksheets(1).Range("A1").Value = Me.ComboBox1.List(Me.ComboBox1.ListIndex) お分かりと思いますが、シート選択は↓の ような感じです。 Worksheets("シート名").Select もうお分かりですね。 Worksheets(Me.ComboBox1.List(Me.ComboBox1.ListIndex)).Select とすれば、コンボボックスで選択した行の名前のシートを選択できます。 変数を使えばもっと簡潔になります。

rx-z5815
質問者

お礼

お礼が遅くなり、申し訳ありません。 わかりやすく説明していただき、助かりました。 ありがとうございました。

関連するQ&A

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

    ユーザーフォーム上のコンボボックスから値を選択し、その値を変数として使いたいのですが、うまくいきません。 コンボボックスのコードで Private Sub ComboBox1_Change() moji1 = ComboBox1.Text Range("A1").Value = moji1 のようにすれば、コンボボックスから値を選んだ時点でA1セルにその値をコピーできるのですが、同じユーザーフォーム上にあるコマンドボタンをクリックして実行する「マクロ1」にてこのmoji1という変数を使いたいのです。 マクロ1にて、上記と同じ Range("A1").Value = moji1 というコードを記述しても、ユーザーフォームで選択した値が消えており、empty値となってしまいます。 原因をご存知の方はお教えください。

  • VBA コンボボックスの条件分岐

    コンボボックスの条件分岐のコードが間違っているみたいで 調べても分からなかったので質問します。 やりたいこと 『マスタ』という名前のシート内のセルを参照し マスタシートには C2セル『A』C3セル『B』C4セル『C』と それぞれアルファベットがあります。 そこでコンボボックスを使用し コンボボックス22にC2~C4セルを選択できるようにし 例えばC2セルを選択したら コンボボックス21の参照範囲をマスタシート内の D2~D13セルを選択できるようにし C3セルを選択したら コンボボックス21の参照範囲をマスタシート内の E2~E13セルを選択できるようにしたいのです。 すいませんがコードを記載して頂けますと 助かります。 Private Sub UserForm_Activate() '----------------------- With ComboBox22 .ColumnCount = 2 .ColumnWidths = "90;10" .RowSource = "マスタ!C2:C4" End With '↑こうすればコンボボックス22のマスタシートのC2からC4まで値を選択できるようになります。 '------------------------わかりやすく区切っています。 '--------------------------------------- If UserForm1.ComboBox22 = "A" Then With ComboBox21 .ColumnCount = 2 .ColumnWidths = "90;10" .RowSource = "マスタ!D2:D13" End With End If '↑コンボボックス22の値が(C2セルの値がAなら)コンボボックス21をマスタシートのD2からD13までを選択できるようにしたい If UserForm1.ComboBox22 = "B" Then With ComboBox21 .ColumnCount = 2 .ColumnWidths = "90;10" .RowSource = "マスタ!E2:E13" End With End If '↑コンボボックス22の値が(C3セルの値がBなら)コンボボックス21をマスタシートのE2からE13までを選択できるようにしたい '----------------------------------------区切っています。 End Sub

  • Excel VBA: コンボボックスの値取得

    社内システムのIEブラウザからExcelに貼り付けたテキストボックスは、以下のように取得できました。 Sheets("伝票").Range("B1").Value = Sheets("伝票").HTMLText1.Value ただ、コンボボックス(ドロップダウンメニューが出てくるもの)の選択文字列は以下で取得できませんでした。取得方法はありますでしょうか? Sheets("伝票").Range("B1").Value = Sheets("伝票").HTMLSelect1.Value

  • エクセルVBA コンボボックスの値の転記

    エクセルVBAの質問です。 ユーザーフォームを表示し 年を選択するコンボボックス1 月を選択するコンボボックス2 を入力してもらい ユーザーフォームを閉じるときに sheet1のワークシートのC2セルに 「コンボボックス1の値」+「年」+と「コンボボックス2の値」+「月」をつなげて 入力できるというようなマクロを考えています。 下記の様に考えてみたのですが、 うまく入力できませんでした。 Private Sub UserForm_Initialize() With ComboBox1 .AddItem "2021" .AddItem "2022" .AddItem "2023" .AddItem "2024" End With With ComboBox2 .AddItem "1" .AddItem "2" .AddItem "3" .AddItem "4" .AddItem "5" .AddItem "6" .AddItem "7" .AddItem "8" .AddItem "9" .AddItem "10" .AddItem "11" .AddItem "12" End With Private Sub CommandButton1_Click() 'ユーザーフォームを閉じる Unload UserForm1 'ユーザーフォームの値をセルC2に入力 With Worksheets("sheet1") .Cells(2, 3).Value = "ComboBox1.Text" & "月" & "ComboBox2.Text" & "日" End With End Sub どのように修正すればいいでしょうか? よろしくお願いします。

  • Excel:コンボボックスの値をセルにセットする場合

    Excel2000を使っています。 コンボボックスで選択した内容をアクティブなセルに入力するために、以下のようなコードを作成しました。 (ユーザフォームにコンボボックスを1つ作成しています) ------------------------------------------ Private Sub UserForm_Initialize() ComboBox1.ColumnCount = 2 For I = 0 To 10 ComboBox1.AddItem Worksheets("元ネタ").Cells(I + 2,1).Value ComboBox1.List(I, 1) = Worksheets("元ネタ").Cells(I + 2,2).Value Next End Sub ------------------------------------------ Private Sub ComboBox1_Change() Worksheets("入力用").Activate ActiveCell.Value = ComboBox1.Text End Sub ------------------------------------------ このコンボボックスは、2列を表示させています。最後にセルに値を入力すると、今のコードでは1列目の値が入りますが、実際には2列目の値だけを入れたいんです。でもコンボボックスの選択時は、先頭列に1列目の値を表示させたいんです。 どうすれば、2列目の値をアクティブセルに入力できるでしょうか?

  • Exel VBA コンボボックスで選択した値以外の値をセルに入力する方法

    初めて質問します。 コンボボックスから選択した値によって、 セルに値を入力する方法を教えて下さい。 コンボボックスの値は、1、2、3。 1を選択した時には、A1にA、 2を選択した時には、A2にB、 3を選択した時には、A3にCを入力する。 といったかんじにしたいです。 本やネットなど色々調べてみたのですが、わかりませんでした。 初歩的な質問かもしれませんが、どなたか教えて下さい。 よろしくお願いします。

  • エクセルVBAコンボボックスについて

    リスト欄のセルA3から下方向に大分類(A16まで14種類)があります。 コンボボックス1に大分類をリスト化して選べるようにしたいと思っています。 しかし、(1)のようにVBAを記入して、マクロを実行すると、コンボボックス1には、 大分類で14個あるリストの4つしか出てきません。 -(1)(抜粋)--------------------------------------------------------- Private Sub UserForm_Initialize() Dim MyVar1 As Variant MyVar1 = Sheets("リスト").Range("A3:A" & Range("A3").End(xlDown).Row) ------------------------------------------------------------------ (2)のように記述してマクロを実行すると、コンボボックス1には、14個全てが表示されます。 -(2)(抜粋)--------------------------------------------------------- Private Sub UserForm_Initialize() Dim MyVar1 As Variant MyVar1 = Sheets("リスト").Range("A3:A16") ------------------------------------------------------------------ 原因がわかる方、いらっしゃいませんか? 出来れば、リスト欄のA列は14個よりも増える可能性があるので、Range("A3:A" & Range("A3") .End(xlDown).Row)のような範囲の指定がしたいです。 なお、リストシートのA3を選択して、「Ctrl+↓」でA16が選択されました。

  • コンボボックス 連動 VBA

    VBA初心者です。 ご教授ください。 入力フォームにコンボボックスを4っつ リストボックスを一つ作成し 一つ目のコンボでシートを選択後 二つ目以降のコンボボックスでセル範囲を選択し絞り込み、最終のリストボックスに 絞り込み表示を行い、コマンドボタンにて フィルター操作を行いたいのですが 重複表示させずに、絞り込んでいく方法がうまくいきません。下記コードにコンボボックス3以降も記述したのですが、絞り込みができません。よろしくお願いします。 Private Sub UserForm_Initialize() For i = 2 To Worksheets.Count 'シートの数だけ繰り返す ComboBox1.AddItem Worksheets(i).Name '取得したシート名をリストボックスへ Next End Sub Private Sub ComboBox1_Change() Dim Index As Integer Dim strBuf As String Index = ComboBox1.ListIndex 'ワークシートリストの選択された位置 strBuf = ComboBox1.List(Index) 'ワークシート名を取得 Worksheets(strBuf).Activate ' セルA1を左上端にする Application.Goto Reference:=Range("A1"), Scroll:=True ComboBox2.Clear Dim リスト As New Collection Dim 列 As String, 上端セル As String, 最下端セル As String Dim セル範囲 As Range, 各セル As Range 列 = "b" '※3 上端セル = 列 & "4" '※4 最下端セル = 列 & "65536" With Worksheets(strBuf) '※5 Set セル範囲 = .Range(.Range(上端セル), .Range(最下端セル).End(xlUp)) End With For Each 各セル In セル範囲 'セル範囲の各セルについて繰り返し処理 On Error Resume Next '次行が実行時エラーならその次行から継続 リスト.Add 各セル.Value, CStr(各セル.Value) 'Collectionオブジェクトにメンバを追加 If Err.Number = 0 Then '実行時エラーが発生していなければ Me.ComboBox2.AddItem 各セル.Value 'コンボボックスのリストに項目を追加 End If On Error GoTo 0 Next End Sub

  • コンボボックスに設定する値

    ユーザーフォーム上のコンボボックスに設定する値を ワークシートの入力規則のリストで設定した値から参照するにはどうしたらいいでしょうか? 入力規則の値は、元の値のテキストボックス?に直接入力されているので これをどこかのセル範囲を参照して~というのはナシでお願いします。

  • Excelでコンボボックスが沢山必要なときは

    お世話になります。 オラクルからコードと値を取ってきて、エクセルのシート上で表示や 選択をさせたいと思います。(一番左のセル) このときセルにアクティブXのコンボボックスを貼り付けて、表示は できたのですが、データが1000件くらいあるようで、それぞれに 1000個もコンボボックスを貼り付けるのが大変です。 何かよい方法はありませんか。 よろしくお願いします。

専門家に質問してみよう