- ベストアンサー
Excelオートフィルタでデータ追加を効率化する方法
- VBAを使用して、Excelのオートフィルタ機能を活用してデータ追加を効率化する方法について教えてください。
- 具体的には、B列の重複しないデータを抽出し、フィルタをかけた最終行にデータを挿入する方法を教えてください。
- 手作業でデータ追加するのは時間がかかるため、プログラムを作成したいと考えていますが、もっと効率的な方法はありますか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
わかりやすけど遅いマクロ: 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 リストのタイトル行も用意されていない状況という事なので,それに合わせて作成しました。 適切に応用して実用して下さい。
その他の回答 (3)
- MarcoRossiItaly
- ベストアンサー率40% (454/1128)
>……などすべき項目が多く、プログラムが長くなる予感がしたため、…… 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
お礼
回答ありがとうございます。 今後ともよろしくお願いいたします。
- MarcoRossiItaly
- ベストアンサー率40% (454/1128)
>例文のため、A列には「あ?か」の順で入力していますが、 実際は最後に「青木」とか入るかもしれません。 しかし、順番は変えたくなく、入れた順番で追加されていくような方式が良いのです。 質問者さんによる事実誤認です。 No.2 で回答したとおり、通し番号を振っておき、後で通し番号の順によって並べ替えれば、行がどれだけシャッフルされていても、順番はいつでも元どおりになります。どの位置に「青木」が記入されようが、何の関係もありません。 もっと言えば、No.2 では、「か」だか「青木」だかに当たるデータを記入する位置について、既存データの下端に付け加えると言いましたね。したがって No.2 の場合、既存データの順番は一度も入れ替わることなく、追加すべき行が必要な位置に挿入されたことになりますが。問題視すべきことは何もないですね。 プログラミングでは、単に文法を覚えるだけではなく、どのような手法で目的を達成するかということがたいへん重要です。No.2 のようなシンプルな方法でできるのであれば、回答者としては当然、そういったものを優先して提案するのです。マクロによらず手作業で行う場合でも、同じことが言えます。
お礼
回答ありがとうございます。 No.1、keithin様の回答も大変シンプルで分かりやすいものでした。 私はプログラムのほうが結構しっくりくるので、 keithin様の回答を参考にさせて頂きました。 No.2、MarcoRossiItaly様の回答は分かりやすいものでしたが、 重複のないデータの抽出などすべき項目が多く、プログラムが 長くなる予感がしたため、No.1のkeithin様の回答を ベストアンサーにさせて頂きました。 回答ありがとうございました。
- MarcoRossiItaly
- ベストアンサー率40% (454/1128)
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)の列で並べ替え
お礼
回答ありがとうございます。 申し訳ありません、確認不足でした。 なるべくこのデータもとい、このデータ以外の行や列には変更を 加えたくなく思っていました。
補足
例文のため、A列には「あ~か」の順で入力していますが、 実際は最後に「青木」とか入るかもしれません。 しかし、順番は変えたくなく、 入れた順番で追加されていくような方式が良いのです。
お礼
回答ありがとうございます。 おかげで、思ったとおりのものが出来ました! 思ってたより追加動作も速く、助かりました。 ありがとうございました!
補足
回答ありがとうございます。 申し訳ありません、記入ミスでした。 リストのタイトル行はあり、オートフィルタがかかってします。