100行3000列ほどのエクセルデータから
キーワード=項目 が一致する列を抽出したいです。
![
上記のようなデータ一覧から
A B C
1 年賀状 氏名 誕生日
2
3
|
のように、キーワードを選択して
その列に入ってる値をすべて抽出したいです。
また、元のデータ量が変動しても、抽出する
キーワードが変更しても使いやすいように
「元のデータは」セル範囲指定でなく
シート全部もしくは編集中のセル全てを対象としたいです。
キーワードは可能であれば
元のデータとは別シートに記載すると
その別シートのキーワードの列(下)に反映されるようにしたいです。
以前に投稿されていた
【マクロ】検索に一致した条件とその下のセルを抽出
を参考に作成したのですが、
検索設定を行ごとに記述が必要なため、
変動する元のデータに対応しきれませんでした。
マクロを書き換えるのはキーワードが変更になった時だけに
なるような方法で記述するにはどうすれはいいでしょうか?
ご教授のほどよろしくお願い申し上げます。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
詳しい要件が分からないのと、あくまでもお試しなので、細かい点まで作りこんではいませんが…
《 Sheet1(列選択)シートのコード 》
⇒「コピー実施」ボタンクリック時に実行される
⇒ 処理の本体を呼び出すだけ
Option Explicit Private Sub btnCopy_Click() Call ColCopy End Sub
《 標準モジュール「列コピー」のコード 》
⇒ コピー処理の本体
Option Explicit Sub ColCopy() Dim xlBook As Workbook Dim xlSheetOrg As Worksheet Dim xlSheetSel As Worksheet Dim xlSheetDst As Worksheet Dim strDstSheetName As String Dim rngLastRow As Range Dim vntIndex As Variant Dim rngIndexs As Range Dim rngHeader As Range Dim lngColSrc As Long Dim lngColDst As Long Dim rngTargetCol As Range Set xlBook = ThisWorkbook With xlBook Set xlSheetSel = .Worksheets("列選択") Set xlSheetOrg = .Worksheets("オリジナル") End With ' コピー先シート名取得 strDstSheetName = xlSheetSel.Range("A3").Value ' コピー先シートを初期化(なければ生成) On Error GoTo ERR_DST_SHEET Set xlSheetDst = xlBook.Worksheets(strDstSheetName) With xlSheetDst .Cells.Clear End With On Error GoTo 0 ' 項目名を読み取り With xlSheetSel Set rngLastRow = .Cells(.Rows.Count, 1).End(xlUp) Set rngIndexs = .Range(.Cells(5, 1), rngLastRow) Set rngLastRow = Nothing End With ' 見出し行の取り込み Set rngHeader = xlSheetOrg.Rows(1) ' 該当列のコピー Application.ScreenUpdating = False With xlSheetDst lngColDst = 0 For Each vntIndex In rngIndexs lngColDst = lngColDst + 1 Set rngTargetCol = rngHeader.Find(CStr(vntIndex)) lngColSrc = rngTargetCol.Column rngTargetCol.EntireColumn.Copy .Cells(1, lngColDst) Set rngTargetCol = Nothing Next vntIndex Set rngIndexs = Nothing End With Application.ScreenUpdating = True GoTo PROC_END ERR_DST_SHEET: Set xlSheetDst = Sheets.Add(, Sheets("オリジナル")) xlSheetDst.Name = strDstSheetName Resume Next PROC_END: Set rngHeader = Nothing Set xlSheetDst = Nothing Set xlSheetOrg = Nothing Set xlSheetSel = Nothing Set xlBook = Nothing End Sub
投稿2015/10/10 19:55
総合スコア5936
0
###追記
要望を読み間違えていたようですので追記します。
**すること:**任意数指定したキーワードの列を元データから抜き出して別シートにコピーする
手順:
1. キーワードを一つ読み出す
2. [1]のキーワードを元データのタイトル行から検索
3. 見つけた列を全てRangeに収める
4. [3]をコピーし対象シートにペースト
5. 1-4をキーワード分繰り替えす。
行のデータ先頭からデータ端までをRangeに指定 参考
Set ttl = Range("A1").End(xlToRight)
キーワード検索 参考
Set Trg = ttl.Find(What:="年賀状")
見つけた列の末尾まで範囲を拡張
Set Trg = Trg.End(xlDown)
これをコピーして対象シートの一列目にペースト
実行環境が無く試せないので細かい所がうまく行くか不安ですが、こんな感じでどうでしょう?
###最初に投稿したもの
マクロでも同じことできますが、VBAで書くまでもなくExcel機能のオートフィルタでできそうに思います。
1行目を選択してオートフィルタを実行すれば、一行目の各列がプルダウンになり、その列に存在するデータが選択肢に並びます。
選択してフィルタ条件を設定すれば、条件に一致しない行が非表示になります。
VBAでやりたい場合もVBAからオートフィルタが設定できますので、それで実装するのが楽だと思います。
参考ページ
必要なだけオートフィルタを掛けて、必要な範囲を選択し、コピーして別のシートに貼り付け、という風に実装すれば可能かと思います。
投稿2015/10/09 18:18
編集2015/10/09 19:27総合スコア2068
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/10/09 19:08 編集
2015/10/10 04:50 編集
2015/10/10 05:57
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/10/13 02:01