• ベストアンサー

エクセル/マクロ コンボボックスからの検索とセル位置の取得

エクセル/マクロに関する質問です。あるワークシートのA列に日付、B列にその日付に対応した商品の名前が入っています。データは日付順に並んでいます。A列の中には重複する日付もあります。ユーザーフォームを使用して、ある一定の期間内のデータを新しいシートにペーストしたいと考えています。 ユーザーフォームには2つのコンボボックス、1つのテキストボックスを設置しました。コンボボックスAでは、コピーしたいデータが始まる日付が選択できるようになっており、コンボボックスBではコピーしたいデータの最後の日付が選択できるようになっています。 Private Sub UserForm_Initialize() Dim DateList1 As New Collection Dim Row1 As String, TopCell1 As String, BottomCell1 As String Dim CellRange1 As Range, EachCell1 As Range Row1 = "A" TopCell1 = Row1 & "3" BottomCell1 = Row1 & "65536" With Worksheets("AAA") Set CellRange1 = .Range(.Range(TopCell1), .Range(BottomCell1).End(xlUp)) End With For Each EachCell1 In CellRange1 On Error Resume Next DateList1.Add EachCell1.Value, CStr(EachCell1.Value) If Err.Number = 0 Then Me.ComboBoxA.AddItem EachCell1.Value End If On Error GoTo 0 Next End Sub テキストボックスでは新しいシートの名前を入力できるようにしています。 コンボボックスA、Bで選んだ項目に一致するセルの行番号を取得しその範囲をコピー、新しいシートにペーストしたいと考えています。さらにコンボボックスAの日付がBをこえないようにしたいとも考えています。 できるだけシンプルなコードで表現したいのですが、なかなか上手くいきません。スマートなアイデアをお持ちの方がいらっしゃれば、アドバイスを頂きたいと思います。どうぞよろしくお願いします。

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

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

エクセルの機能をできるだけ使ってやってみた。 ユーザーフォームに テキストボックスを2つ(「から」の日と「まで」の日)。 コマンドボタンを1つ設ける。 コマンドボタンのクリックイベントに ーー Private Sub CommandButton1_Click() Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") f = DateValue(TextBox1.Text) t = DateValue(TextBox2.Text) sh1.Range("F1") = sh1.Cells(1, "A") sh1.Range("F2") = ">=" & Format(f, "yyyy/mm/dd") sh1.Range("G1") = sh1.Cells(1, "A") sh1.Range("G2") = "<=" & Format(t, "yyyy/mm/dd") d = sh1.Range("A65536").End(xlUp).Row sh1.Range("A1:B" & d).AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=sh1.Range( _ "F1:G2"), CopyToRange:=sh2.Range("A1:b100"), Unique:=False sh1.Range("F1:G2").ClearContents Me.Hide Set sh1 = Nothing Set sh2 = Nothing End Sub ーー ユーザーフォームを表示し からとまでの日付を入力。コマンドボタンをクリック。 例データ Sheet1 日付 名前 2009/11/2 a 2009/11/23 b 2009/11/30 c 2009/12/3 d 2009/12/4 e 2009/12/6 f 2009/12/15 g 2009/12/15 h 2009/12/18 i 2009/12/19 j 2009/12/20 k 2009/12/21 l ーーー 日付は 2009/12/3 2009/12/15 --- 結果 Sheet2 日付 名前 2009/12/3   d 2009/12/4  e 2009/12/6   f 2009/12/15 g 2009/12/15 h

ocypodidae
質問者

補足

テキストボックスの代わりにコンボボックスを使ってユーザーフォームを作りました。希望通りのフォームになりました。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.1

collectionを使って、重複はエラー処理で逃げるというのは、確かにスマートではないかもしれませんね。 dictionary(連想配列)を使われてはいかがですか。日付の最大値と、最小値を取得して済ませる手もあると思います。 他にフィルタオプション案もあります。別のQ&Aで、フィルタオプションで別シートに書き出すのを覚えたばかりなので、ご参考までに。セル範囲をを一次元の配列に一括変換して、コンボボックスのListに一括で設定しようとしましたが、表示形式が日付シリアルになってしまってうまく行きません。(文字列に変換すると、結局一括でできませんし) Private Sub UserForm_Initialize() Dim targetRange As Range, destRange As Range Dim i As Long '後で消しますが、差し障りのない場所を指定してください。 Set destRange = Sheets("Sheet2").Range("A1") With Sheets("Sheet1") Set targetRange = .Range(.Range("A3"), .Range("A" & .Rows.Count).End(xlUp)) End With targetRange.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=destRange, Unique:=True Set destRange = destRange.CurrentRegion For i = 2 To destRange.Rows.Count Me.ComboBox1.AddItem CDate(destRange.Cells(i)) Next i destRange.Cells.Clear End Sub 指定期間内のデータを他シートに貼り付けるのは、下記に盛りだくさんの案がありご参考になると思います。 http://okwave.jp/qa5498229.html

ocypodidae
質問者

お礼

フィルタオプションを使う事にしました。 いろいろ参考になりました。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • コンボボックスとテキストボックスをセルへ

    コンボボックスのデータを行へ表示されるよう下記の通りやりました。 続けてテキストボックスを指定した同じ行のセルへ入力されるように したいのですが、いろいろ調べたのですが、解決できず ここで助言いただけたらと思います。 また textbox1はA列 textbox2はB列 textbox3はM列 へとコンボボックスのデータを挟む形での入力となります。 ちなみにテキストボックスのプロジェクト名は変更してあります。 Private Sub CommandButton1_Click() Dim lrow As Long, i As Long With Worksheets("製品化") lrow = .Range("F" & Rows.Count).End(xlUp).Row For i = 0 To 6    .Cells(lrow + 1, i + 6).Value = itemname.List(listno, i) Next i End With End Sub

  • excel vba コンボボックス更新について

    お世話になります。 シート1のA1セルに 名前 B1セルに期限と入力してあり A2セル リンゴ  B2セル 1703 A3セル バナナ  B3セル 1703 A4セル ぶどう  B4セル 1704 A5セル キウイ  B5セル 1704  A6セル お米   B6セル 1706 A7セル 酒    B7セル 1708 以下 同様に入力しています。 B2以下に入力されているのは4桁の数字で 小さいほうから大きいほうに並んでいます。 同じ数字が入力されていることもあり、 また欠番も存在します。 この期限をユーザーフォームにコンボボックス設置して 重複なし表示させています。以下のコードです。 Private Sub UserForm_Initialize() Worksheets("Sheet1").Select 名前.Value = Cells(2, 1).Value 期限.Value = Cells(2, 2).Value X = 期限.Value nextGyo = Range("B:B").Find(X).Row 'Dim リスト As New Collection 'Dim 列 As String, 上端セル As String, 最下端セル As String 'Dim セル範囲 As Range, 各セル As Range 列 = "B" '※3 上端セル = 列 & "2" '※4 最下端セル = 列 & "65536" With Worksheets("Sheet1") '※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.期限.AddItem 各セル.Value 'コンボボックスのリストに項目を追加 End If On Error GoTo 0 Next End Sub 上記の例だと「1703」「1704」「1706」「1708」の 4種類から選択できる状態です。 ここでたとえば コンボボックスで1704を選択して (コンボボックスには自由に入力はさせずにリストの中から選ばせるようにしています) ユーザーフォーム上のボタンを押すと A4セル ぶどう  B4セル 1704 A5セル キウイ  B5セル 1704 を行削除して空白行を上に詰めるコードを書きました。 ただこのときコンボボックスからは リストの更新がされないので「1704」が選択できてしまいます。 削除した時点で「1704」がない状態にするには (自動更新をかける) どうしたらよいでしょうか? (削除するコードの中に  Call UserForm_Initialize と書いてみたのですが  何も変化ありませんでした) どうかよろしくお願いいたします

  • エクセルVBA 別シートからのコンボボックス連動

    エクセルVBA 別シートからのコンボボックス連動について Book1(多人数入力用ブック) ・入力シート ・データ用シート Book2(反映用ブック) ・シート1 Book1にコンボボックスが2列 テキストボックスが2列 * 6行のユーザーフォームを作成しました。 コンボボックス1 コンボボックス2 テキストボックス1 テキストボックス2 コンボボックス3 コンボボックス4 テキストボックス3 テキストボックス4 ・ ・ ・ 左のコンボボックスで「あ」が選ばれたときには、右のコンボボックスで「あ行の顧客」・・・というように連動させたいと考えております。 データ用シートのデータは、   A      B          C 1 あ あ行で始まる顧客 か行で始まる顧客 2 か 3 さ 4 た 5 な 6 Private Sub UserForm_Initialize() Dim c As Range ComboBox1.RowSource = "データ用シート!A1:A9" End Sub Private Sub ComboBox1_Change() 'Dim Rng As Range 'Dim i As Long i = ComboBox1.ListIndex If i > -1 Then Dim c As Range Set Sh = Worksheets("データ用シート") Set Rng = Worksheets("データ用シート").Range("B2:I30") ComboBox2.Value = "" ComboBox2.RowSource = Rng.Columns(i + 1).Address End If End Sub 上記コードですと、コンボボックス2が入力シートのデータを表示してしまいうまくいきません。 欲をいえば、 Book1(多人数入力用ブック)入力シートの特定セルに コンボボックス2・テキストボックス1 コンボボックス4・テキストボックス3というように続けて1セルに反映 Book2(反映用ブック)シート1に コンボボックス2・テキストボックス1・テキストボックス2 を各1セル 1行に反映させたいと考えております。 まったく知識がないのですが 仕事上どうしても必要となったので、各種サイトを見よう見真似でやっております。 ご助力いただければ幸いです。

  • エクセル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コンボボックスについて

    図の左のように、商品リスト欄のセルA3から下方向に大分類(A16まで14種類) セルB3~O3(Bから数えて14個目のO)列から下方向に小分類があります。 P2~P11には1から10までの数字が入っています。 図の右側がユーザフォームで、コンボボックスの番号を入れています。 コンボボックス「1.4.・・・28.」までは大分類を選べるようにして、 コンボボックス「2.5.・・・29.」までは左の大分類に応じた小分類の値を表示させたいと思っています。 大分類「111」→小分類「あ~そ」 大分類「222」→小分類「た~と」といった具合です。 そのコンボボックスの値を指定したセルに入力しようと思っています。 下のように記述した結果、問題が発生しました。 (1)大分類で14個ほどあるリストの3つほどしかでてこない。 (2)Select Caseの構文を使用していて、大分類が14個だから「Case 13」までと しているが、「大分類の数-1」までの変えられる数までにしたい。 アドバイスをいただけると助かります。 ------------------------------------------------------------------ Private Sub UserForm_Initialize() Dim MyVar1 As Variant MyVar1 = Sheets("商品リスト").Range("A3:A" & Range("A3").End(xlDown).Row) Dim MyVar20 As Variant MyVar20 = Sheets("商品リスト").Range("P2:P" & Range("P2").End(xlDown).Row) '種類欄を指定 With ComboBox1 .List() = MyVar1 End With ※・・・(省略)・・・ コンボボックス4から25まで※ With ComboBox28 .List() = MyVar1 End With '数量欄を指定 With ComboBox3 .List() = MyVar20 End With ※・・・(省略)・・・ コンボボックス6から27まで※ With ComboBox30 .List() = MyVar20 End With End Sub '1番目 Private Sub ComboBox1_Change() Dim MyVar1 As Variant ※・・・(省略)・・・ MyVar2~13 As Variant※ Dim MyVar14 As Variant Dim MyVar20 As Variant MyVar1 = Sheets("商品リスト").Range("A3:A" & Range("A3").End(xlDown).Row) ※・・・(省略)・・・ B列からN列まで※ MyVar15 = Sheets("商品リスト").Range("O3:O" & Range("O3").End(xlDown).Row) MyVar20 = Sheets("商品リスト").Range("P2:P11") Select Case ComboBox1.ListIndex Case 0 With ComboBox2 .List() = MyVar2 End With ※・・・(省略)・・・ Case1~ Case12 ※ Case 13 With ComboBox2 .List() = MyVar15 End With End Select End Sub

  • コンボボックスを自動更新

    お世話になります。 シート1のA1セルに 名前 B1セルに期限と入力してあり A2セル リンゴ  B2セル 1703 A3セル バナナ  B3セル 1703 A4セル ぶどう  B4セル 1704 A5セル キウイ  B5セル 1704  A6セル お米   B6セル 1706 A7セル 酒    B7セル 1708 以下 同様に入力しています。 B2以下に入力されているのは4桁の数字で 小さいほうから大きいほうに並んでいます。 同じ数字が入力されていることもあり、 また欠番も存在します。 この期限をユーザーフォームにコンボボックス設置して 重複なし表示させています。以下のコードです。 Private Sub UserForm_Initialize() Worksheets("Sheet1").Select 名前.Value = Cells(2, 1).Value 期限.Value = Cells(2, 2).Value X = 期限.Value nextGyo = Range("B:B").Find(X).Row 'Dim リスト As New Collection 'Dim 列 As String, 上端セル As String, 最下端セル As String 'Dim セル範囲 As Range, 各セル As Range 列 = "B" '※3 上端セル = 列 & "2" '※4 最下端セル = 列 & "65536" With Worksheets("Sheet1") '※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.期限.AddItem 各セル.Value 'コンボボックスのリストに項目を追加 End If On Error GoTo 0 Next End Sub 上記の例だと「1703」「1704」「1706」「1708」の 4種類から選択できる状態です。 ここでコンボボックスで1704を選択して (コンボボックスには自由に入力はさせずにリストの中から選ばせるようにしています) ユーザーフォーム上のボタンを押すと A4セル ぶどう  B4セル 1704 A5セル キウイ  B5セル 1704 を行削除して空白行を上に詰めるコードを書きました。 ただこのときコンボボックスには リストの更新がされないので「1704」が表示されたままです。 削除した時点で「1704」がない状態にするには (自動更新をかける) どうしたらよいでしょうか? (削除するコードの中に  Call UserForm_Initialize と書いてみたのですが  何も変化ありませんでした) どうかよろしくお願いいたします

  • Excel VBA でテキストボックスの値をセルA列から検索

    いつもお世話になります。 Private Sub CommandButton3_Click() Dim 行 As String Dim 列 As String Dim 最終行 As String Dim 検索行 As String Dim メッセージ As Integer Dim 一致 As Range Dim myNO As Variant Dim i As Long Sheets(3).Select 最終行 = Range("A2").End(xlDown).Offset(1).Select 行 = ActiveCell.Row 列 = ActiveCell.Column myNO = TextBox2.Value 検索行 = Range("A2").End(xlDown).Select ※・・・Set 一致 = Range("A2:検索検").Findwhat:=TextBox2,lookat:=xlWhole) If 一致 Is Nothing Then MsgBox "データがありません。新規コード入力します。" Cells(行, 列 + 0) = UserForm1.TextBox2.Value Cells(行, 列 + 1) = UserForm1.ComboBox7.Value Else i = Cells(行 - 1, "A") Cells(i, 列 + 0) = UserForm1.TextBox2.Value Cells(i, 列 + 1) = UserForm1.ComboBox7.Value End If End Sub 「エラー1004'Range'メソッドは失敗しました'Global'オブジェクト」とでます。※印が黄色になっています。 ユーザーフォーム1のテキストボックスの値をシート3のA列から検索して、一致すれば、A列の一致セルに上書き入力して、一致が無い場合はA列の空白セルに追加入力したいのです。よろしくお願い致します。

  • コンボボックス 連動 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 コンボボックスのリスト設定

    リストインデックスが複数ある場合は動くのですが、 インデックスが0 もしくは1個しかない場合は、どのように処理を追加したらいいでしょうか。。 実行時エラー381 Lisプロパティを設定できません。プロパティの配列のインデックスが無効です、と メッセージが出ます。 いろいろ試してるのですがわかりません。 コンボボックスの値は別シートで参照先を指定しています。 ----------- Private Sub ComboBox3_DropButtonClick() Dim lRow As Long Dim i As Long, myCnt As Long Dim myData With Worksheets("部門名") lRow = .Range("O" & Rows.Count).End(xlUp).Row ’O列の最終行を確認 myData = .Range("O2:O" & lRow).Value ’コンボボックスのリストデータ End With With ComboBox3 .ColumnCount = 1 .ColumnWidths = "50" .List = myData End With End Sub

  • VBA コンボボックスの重複削除

    こんばんわ。 VBAをはじめたばかりで、コンボボックスで困っています。 sheet1にコンボボックスを配置して、sheet2のA列にあるデータ (例) A列          1          1          2 を コンボボックスに          1          2 というようにデータを入れたいのですが、どの様にしたらよいのでしょうか? sheet1.コンボボックス.value=workSheet("sheet2).Range(A1:A3).value とすると1・1・2というようにA列の値がすべて入ってしまいました。 これを1・2というようにコンボボックスに入れたいです。  よろしくお願いいたします。

専門家に質問してみよう