Excelオートフィルタでデータ追加を効率化する方法

このQ&Aのポイント
  • VBAを使用して、Excelのオートフィルタ機能を活用してデータ追加を効率化する方法について教えてください。
  • 具体的には、B列の重複しないデータを抽出し、フィルタをかけた最終行にデータを挿入する方法を教えてください。
  • 手作業でデータ追加するのは時間がかかるため、プログラムを作成したいと考えていますが、もっと効率的な方法はありますか?
回答を見る
  • ベストアンサー

Excel オートフィルタで抽出&追加 VBA

いつもお世話になっております。 VBAで、データベースのようなものを作っています。    A   B   C   D   E   F 1   あ 北海道 2   い 北海道 3   う  北海道 4   え 北海道 5   あ 青森 6   い 青森 7   う  青森 8   え 青森 9   あ 東京 10  い 東京 11  う  東京 12  え 東京 このような感じのデータが並んでおります。 A列が人名で、B列がその人のデータになります。 ここに、新しいデータを追加するプログラムを組みたいと思っています。 例) お を追加する場合    A   B   C   D   E   F 1   あ  北海道 2   い  北海道 3   う  北海道 4   え  北海道 5   お 北海道 6   あ  青森 7   い  青森 8   う 青森 9   え  青森 10   お 青森 11   あ 東京 12   い 東京 13   う  東京 14   え 東京 15   お 東京 このようにデータを追加したいと思っています。 B列の項目数、また、A列の人名も大量にあります。 手作業でやろうにも物凄い時間がかかり、 今後もこの作業が多くなるとのことなので、プログラムを作りたいと思いました。 私の考えですが、 1.B列の重複しないデータ(例なら北海道、青森、東京)を抽出 2.抽出した項目でフィルタをかけ、そのなかの1行コピー   そして、その最終行を取得 3.最終行+1?にコピーしたデータを挿入 4.コピーされた部分のA列部分を変更 これを何度も繰り返すとできるかな?と思ったのですが やはり面倒な作業を繰り返しているようにも思えます。 何か良い方法はありませんか? 私の出した案のように地道にやっていくしかないのでしょうか… 回答よろしくお願い致します!

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

わかりやすけど遅いマクロ: sub macro1()  dim r as long ’全体がB列で並べ替え済みなら次の一行不要  range("A:B").sort key1:=range("B1"), order1:=xlascending, header:=xlnone  for r = range("B65536").end(xlup).row to 1 step -1   if cells(r, "B") <> cells(r + 1, "B") then    rows(r + 1).insert shift:=xlshiftdown    cells(r + 1, "A") = "お"    cells(r + 1, "B") = cells(r, "B")   end if  next r end sub リストのタイトル行も用意されていない状況という事なので,それに合わせて作成しました。 適切に応用して実用して下さい。

satoron666
質問者

お礼

回答ありがとうございます。 おかげで、思ったとおりのものが出来ました! 思ってたより追加動作も速く、助かりました。 ありがとうございました!

satoron666
質問者

補足

回答ありがとうございます。 申し訳ありません、記入ミスでした。 リストのタイトル行はあり、オートフィルタがかかってします。

その他の回答 (3)

回答No.4

>……などすべき項目が多く、プログラムが長くなる予感がしたため、…… No.2 の工程を実装したので、お気に召さないかもしれませんが、ご参考に一応載せます。 >……をベストアンサーにさせて頂きました。 ベストアンサーには始めから関心がないので、問題ありません。 Sub PeriodicInsertion()   Dim psn As String, fr As Long, lr1 As Long, lr2 As Long, a As Long, b As Long, i As Long, s As Worksheet   psn = InputBox("追加する氏名を入力")   If psn = "" Then Exit Sub   'A1セルからデータが始まる場合に限定   Columns("a").Insert   Rows(1).Insert   Range("a1").Value = "番号": Range("b1").Value = "人名": Range("c1").Value = "都道府県"   lr1 = Cells(Rows.Count, "c").End(xlUp).Row   a = WorksheetFunction.CountIf(Columns("c"), Cells(lr1, "c").Value)   For i = 2 To lr1     Cells(i, "a").Value = Int((i - 2) / a) + 1   Next i   Set s = ActiveSheet   Worksheets.Add before:=Worksheets(1)   Range("a1").Value = "都道府県": Range("a2").Value = "<>"   With s     .Range("c1:c" & lr1).AdvancedFilter _       Action:=xlFilterCopy, criteriarange:=Worksheets(1).Range("a1:a2"), copytorange:=.Cells(lr1 + 1, "c"), unique:=True     .Cells(lr1 + 1, "c").Delete shift:=xlShiftUp     lr2 = .Cells(Rows.Count, "c").End(xlUp).Row     For i = lr1 + 1 To lr2       .Cells(i, "a").Value = i - lr1       .Cells(i, "b").Value = psn     Next i     .Range("a1:f" & lr2).Sort key1:=.Range("a1"), order1:=xlAscending, Header:=xlYes   End With   Application.DisplayAlerts = False   Worksheets(1).Delete   Application.DisplayAlerts = True End Sub

satoron666
質問者

お礼

回答ありがとうございます。 今後ともよろしくお願いいたします。

回答No.3

>例文のため、A列には「あ?か」の順で入力していますが、 実際は最後に「青木」とか入るかもしれません。  しかし、順番は変えたくなく、入れた順番で追加されていくような方式が良いのです。 質問者さんによる事実誤認です。 No.2 で回答したとおり、通し番号を振っておき、後で通し番号の順によって並べ替えれば、行がどれだけシャッフルされていても、順番はいつでも元どおりになります。どの位置に「青木」が記入されようが、何の関係もありません。 もっと言えば、No.2 では、「か」だか「青木」だかに当たるデータを記入する位置について、既存データの下端に付け加えると言いましたね。したがって No.2 の場合、既存データの順番は一度も入れ替わることなく、追加すべき行が必要な位置に挿入されたことになりますが。問題視すべきことは何もないですね。 プログラミングでは、単に文法を覚えるだけではなく、どのような手法で目的を達成するかということがたいへん重要です。No.2 のようなシンプルな方法でできるのであれば、回答者としては当然、そういったものを優先して提案するのです。マクロによらず手作業で行う場合でも、同じことが言えます。

satoron666
質問者

お礼

回答ありがとうございます。 No.1、keithin様の回答も大変シンプルで分かりやすいものでした。 私はプログラムのほうが結構しっくりくるので、 keithin様の回答を参考にさせて頂きました。 No.2、MarcoRossiItaly様の回答は分かりやすいものでしたが、 重複のないデータの抽出などすべき項目が多く、プログラムが 長くなる予感がしたため、No.1のkeithin様の回答を ベストアンサーにさせて頂きました。 回答ありがとうございました。

回答No.2

No.1 さんのように下の行から逐次挿入していくとか、別シートにコピペするとか、きっと様々な方法があるとは思いますが。 質問文のように必ず 5 行ずつとか決まっているのなら、このようにしては? (1)どこかの列に 5 行ずつの通し番号(1,1,1,1,1,2,2,2,2,2,3,...)を振る、(2)重複のないデータ「北海道、青森、東京」を抽出(ループ、AdvancedFilter メソッドなど)、(3)(2)のデータを B16:B18 に記入、(4) A16:A18 に「か、か、か」を記入、(5)(1)の列の 16 ~ 18 行目に「1,2,3」を記入、(6)(1)の列で並べ替え

satoron666
質問者

お礼

回答ありがとうございます。 申し訳ありません、確認不足でした。 なるべくこのデータもとい、このデータ以外の行や列には変更を 加えたくなく思っていました。

satoron666
質問者

補足

例文のため、A列には「あ~か」の順で入力していますが、 実際は最後に「青木」とか入るかもしれません。 しかし、順番は変えたくなく、 入れた順番で追加されていくような方式が良いのです。

関連するQ&A

  • オートフィルターの抽出されない条件とは

    シートに8列の項目があり項目に対応する文字列を入力しているブックがあります。A列に識別コード(主キーみたいな感覚で)作成してこれまでは Sheet1.Range("A1").AutoFilter Field:=1, Criteria1:= _ "=*08??", Operator:=xlAnd として抽出したい文字列だけ抽出できていました。 今回、別の識別コード(具体的には月日です)をA列に新たに挿入して同じように抽出を試みましたが、何も抽出されず文字列が入力されている最終行の次の1行以前が消えてしまいます(空欄が抽出された)。しかし、完全一致であれば抽出できます。なぜでしょうか?  ちなみに新しい識別は月日なので4桁の数字で10月10日→1010というようにしています。これで10月の行を抽出したいので"=10??"で抽出をかけてみたりしているのですが・・・。

  • エクセル フィルタオプションでの抽出

    使用しているデータベースから、必要な項目列と行のみ抽出し、いくつかの別ファイルに引用したいと思っています。 抽出元のマスターデータベースは下記のような形式で、   |A   |B   |C   |D   |E   |…S程度   |出荷先 |日付  |コード |商品名 |単価  | ____________________________ 1 |A社  |4/5 |商品由来|AAA |3000| ・ ・ 5 |B社  |4/5 |同上  |BBB |2800| ・ ・ 28|A社  |4/6 |同上  |CCC |1500| ・ ・ 45|C社  |4/6 |同上  |AAA |2950| 上記簡素化してありますが、出荷先と日づけごとに 複数の商品や単価の行が入る形になります。 抽出先は、 1)特定の縦列のみすべて引用したいものが複数  (A表:ABE列の表・B表:ACDE列の表など)  (今後抽出したい列が変わる可能性あり) 2)特定の列のうち、特定の行を指定して引用したいもの の、2種類があります。 マスターは日々増えてゆきますが、抽出先の列項目は固定のため、 作業用の列を行を追加し、作業行用部分で抽出表の列を指定 作業列用で行を指定、のように出来ないでしょうか(下記)      |A   |B   |C   |D   |E   | 作業行列 |出荷先 |日付  |コード |商品名 |単価  |   行用→|AB  |A   |B   |B   |AB     ↓列用 ____________________________   |1 |A社  |4/5 |商品由来|AAA |3000|   |・   |・ 1 |5 |B社  |4/5 |同上  |BBB |2800| 1 |・ 1 |・   |28|A社  |4/6 |同上  |CCC |1500| 実作業を行うのはエクセル超初心者の方になるので、 範囲指定等をかけなおしたり、動作不備の対応が難しい状態です。 作成後は自身の手を離れてしまうので、 極力マクロやピボットテーブルを使わず、関数で指定をかけ、 ファイルをアクティブにした時自動更新出来るような案はないでしょうか。 ややこしくてすみません。 考えすぎて複雑にしてしまっている気もしますが、どうぞお力をお貸し下さい。 宜しくお願いします。

  • Excel 関数を使う? 抽出データ

     以下について教えてください。 ============================== 【基になる表--「A」の表と呼ぶことにします。】  列方向のリストには左から「月」「日」「地域」「数」が並んでいる。  「月」には1月から12月までのデータが、 「日」には1日から30もしくは31日のデータが、 「地域」には北海道、青森、新潟、東京、大阪の5つの地域が、 「数」には売上数が並んでいるとする。 【基になる表から抽出して作られた表--これから便宜上「B」の表と呼ぶことにします。】  列には「地域」の中から北海道と青森を、 行には「月」から9月を、「日」から15日を、 列と行が交差するセルには「数」を置き、「9月15日の北海道と青森の売上数」の合計を抽出したい。  さらに、Bの表において、 「地域名」の北海道を削除して新潟にしたり、9月15日ではなく9月18日に置き換えても、 列と行が交差するセルに自動的に集計結果が表されるようにしたいのです。  ちなみに、Aの表もBの表も同じブックに作り、シートは別にします。 ===================================  DSumやIfSum関数だと私が作りたいBの表のような形式になりません。列方向にしかラベルを置けません。  ピボットテーブルを使った集計ならば、求めているデータ以外のデータも表示されてしまいます。  どうすれば求めていることができるでしょうか?どうか皆さんの知恵をお貸しください。

  • エクセルのオートフィルタでのデータ抽出&カウント

    エクセルのローデータでのオートフィルタでのデータ抽出&カウントで困っています。 A列にNo.、B列にデータB、C列にデータC、D列にデータDがあるとします。 それぞれの列に1~9までの数字があり、 それぞれの列、 データの一番下(正確には1行開けて)にはSUMやCOUNTIFなどの関数(計算式)が入っています。 で、これをフィルターにかけ抽出した際、この抽出したデータのみで計算の値を表示したいのですが、 やってみると 全データの計算の値で表示されてしまいます。 どうすればよいのでしょうか? 大変困っています。 よろしくお願いいたします。

  • オートフィルターで一つずつ抽出したものを....

    Bの行にオートフィルターをかけ、列の11で一つずつ抽出したものをコピーし、新規シートに貼り付けたいのですがどうやれば良いですか? 見出し『商品』として抽出されるもの全て新規シートにそれぞれコピーしたいです。 VBAの場合、初心者ですのでわかりやすくお願いします。 わかる方には面倒な事ばかりで申し訳ありませんが宜しくお願いします。 エクセル2010です。

  • Excelのオートフィルタでデータ抽出するマクロについて

    オートフィルタで指定した期間のデータ抽出のマクロを作成しているのですが上手くいきません。 例えばA列に 10月29日 11月1日 11月3日 11月5日 と日付を入力しており、B列、C列にデータを入力していたとして D列1行目に10月31日、D列2行目に11月4日と入力し D列1行目からD列2行目までと指定したデータを抽出するマクロを教えていただけませんか。 マクロ初心者で、困っております。どうかよろしく御願いします。

  • オートフィルターで抽出してコピー&印刷するマクロ

    いつもお世話になります。 エクセル2002です。 (1)オートフィルターでデータを抽出(部署ごと)する。(インプットボックスで) (2)抽出された行を1行ずつコピーし、【編集シート】のA1セルに貼り付け (3)【印刷シート】の印刷 (データが3行あれば3枚の印刷がしたいのです) 《データ》   A列  B列 1 (部署)(商品名) 2  01   商品1 3  01   商品2 4  02   商品1  5  02   商品3 ・・・・・・・・・・ ---------------- Sub Macro1() Dim 部署 部署 = InputBox("部署コードを入れてください") Selection.AutoFilter Field:=1, Criteria1:=部署 Range("A1").Select End Sub ------------------ ↑のマクロにどう追加すればよいのかわからないので、教えてください。 よろしくお願いします。

  • 【VBA】オートフィルタで抽出した内容を隣のセルにコピーする方法

    A列   B列 1       都道府県 2       神奈川 3       神奈川 4       埼玉 5       東京 6       千葉 7       東京 8       神奈川 9       東京 1行目にオートフィルタを使用してB列から東京だけを抽出。 A列   B列 1       都道府県 5       東京 7       東京 9       東京 B列の内容を隣のセルにコピー。 A列   B列 1       都道府県 5東京       東京 7東京       東京 9東京       東京 このような処理をVBAで行うにはどうしたらいいでしょうか? 可視セルを他シートに貼り付ける処理は分かりましたが、同シート内での処理が分かりません。 宜しくお願いします。

  • エクセル・オートフィルタを使わず関数で抽出をするには

    excelのデータで、該当する項目のある行のみの抽出をオートフィルタもマクロも使用せずに、関数で行う方法があれば教えてください。     A B 1  桃太郎 123456 2  猿   122222 3  キジ  123555 4  桃太郎 122245    … 1000 桃太郎 002145 ↑このような表で「桃太郎」だけを抽出したいのです。 イメージとしては、ボックスに「桃太郎」と入力するだけで結果が一覧として出るようなものを作りたいのです。 さらにB列が昇順に並び替えされていると、なおよいのです。 随時更新するデータなので、その都度の最新の表が欲しいのです。 オートフィルタ→並べ替えをすれば簡単なのですが、エクセルを全く使えないような人がいる職場環境でして、教えるのが面倒というのとデータがぐちゃぐちゃになったら困るので、誰でも簡単にできる方法はないものかと考えています。 また環境的にマクロはあまり使いたくないのです。 よろしくお願いします。

  • マクロでオートフィルターの抽出が出来ない

    下記のデーターをマクロで作成しましたが、2010/03/01は抽出するが、2010/03/02以降は デバッグが発生して上手くいきません。 どの様にすれば解決できるのか、ご教授お願いします。 現状) AファイルのA列のオートフィルタオプションで、抽出条件の指定にBファイルの C6をコピーして、「Ctrl」+「V」で貼り付け抽出すると2010/03/01の24時間分の データーが抽出されます。2010/03/02を抽出するとデバッグが発生する。 データーの詳細) Aファイルに「元データー Sheet」があり、A6~A44647に、 1ヶ月分の日付が記載されてます。 (B6~B44647には、24時間を1分間隔でのデーターがあります) A列の日付は、2010/03/01~2010/03/31のデーターがあり、 「セルの書式設定」を確認すると、「標準」設定で表記されてます。 オートフィルタによりA列の、各1日分のデーターを抽出させます。 Bファイルの「作成日指定 Sheet」のB3に2010/3/1を入力すると C6には「=$B$3」で「2010/03/01」と表示する様に「セルの書式設定」 「ユーザー定義」で「yyyy/mm/dd」を選択してます。(C36まで設定) 以下C7に「=$B$3+1」で、C8には「=$B$3+2」で、C36までで「2010/03/31」 と表示させてます。

専門家に質問してみよう