• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excel オートフィルタで抽出&追加 VBA)

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

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

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7941)
回答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

専門家に質問してみよう