いつもお世話になっております。
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列部分を変更
これを何度も繰り返すとできるかな?と思ったのですが
やはり面倒な作業を繰り返しているようにも思えます。
何か良い方法はありませんか?
私の出した案のように地道にやっていくしかないのでしょうか…
回答よろしくお願い致します!
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
リストのタイトル行も用意されていない状況という事なので,それに合わせて作成しました。
適切に応用して実用して下さい。
回答ありがとうございます。
おかげで、思ったとおりのものが出来ました!
思ってたより追加動作も速く、助かりました。
ありがとうございました!
No.4
- 回答日時:
<br /> >……などすべき項目が多く、プログラムが長くなる予感がしたため、……<br /> <br /> 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
No.3
- 回答日時:
>例文のため、A列には「あ?か」の順で入力していますが、 実際は最後に「青木」とか入るかもしれません。
しかし、順番は変えたくなく、入れた順番で追加されていくような方式が良いのです。
質問者さんによる事実誤認です。
No.2 で回答したとおり、通し番号を振っておき、後で通し番号の順によって並べ替えれば、行がどれだけシャッフルされていても、順番はいつでも元どおりになります。どの位置に「青木」が記入されようが、何の関係もありません。
もっと言えば、No.2 では、「か」だか「青木」だかに当たるデータを記入する位置について、既存データの下端に付け加えると言いましたね。したがって No.2 の場合、既存データの順番は一度も入れ替わることなく、追加すべき行が必要な位置に挿入されたことになりますが。問題視すべきことは何もないですね。
プログラミングでは、単に文法を覚えるだけではなく、どのような手法で目的を達成するかということがたいへん重要です。No.2 のようなシンプルな方法でできるのであれば、回答者としては当然、そういったものを優先して提案するのです。マクロによらず手作業で行う場合でも、同じことが言えます。
回答ありがとうございます。
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)の列で並べ替え
この回答への補足
例文のため、A列には「あ~か」の順で入力していますが、
実際は最後に「青木」とか入るかもしれません。
しかし、順番は変えたくなく、
入れた順番で追加されていくような方式が良いのです。
回答ありがとうございます。
申し訳ありません、確認不足でした。
なるべくこのデータもとい、このデータ以外の行や列には変更を
加えたくなく思っていました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 新幹線 東北北海道新幹線の列車名を東海道山陽新幹線と同じにするとしたら皆さんはどう思いますか? 停車駅は下記 8 2022/06/11 11:40
- 新幹線 北海道新幹線の速達列車の名前を予想してください。 私は、 速達型は、ぴりか号(上野、大宮、仙台、盛岡 4 2023/02/11 19:22
- 北海道 青森駅から木古内駅まで乗り換えなしで行けますか。 8 2022/05/15 01:05
- 新幹線 2030年開業の東北北海道新幹線東京始発のはやぶさの案を考えて見ました。いかがでしょうか? 途中停車 4 2023/02/11 19:26
- 新幹線 203x年に開業予定する北海道新幹線についてですが、東京、上野、大宮、仙台、盛岡、いわて沼宮内、二戸 1 2023/07/08 14:16
- Excel(エクセル) Excelマクロ 差分抽出の方法が知りたいです。 2 2023/03/07 13:25
- 新幹線 北海道新幹線が203x年に開業予定する北海道新幹線のグランクラスですが、東京、大宮、仙台、新青森、札 4 2023/07/09 10:57
- 郵便・宅配 北海道版の日刊スポーツとスポーツ報知を購入しましたが1週間以上たっても届きません。 1 2023/02/28 21:34
- Excel(エクセル) EXCELで、漢字のみ抽出する式を教えてください。 6 2022/04/27 14:40
- 新幹線 北海道新幹線ができる前に青森ー札幌夜行便があったと思うのですが、その列車名を北海道新幹線の再速達便の 3 2023/07/08 13:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
振込用紙の東京MTとは
-
転勤で札幌に住んで二年ですが...
-
「なんで」と「なにで」の使い分け
-
特定の文字列があったらその行...
-
東京からフェリーで和歌山にい...
-
とても後悔しています。受験生...
-
「○○県は○○市~」にある"は"とは?
-
最近ここら辺という言葉が標準...
-
希塩酸は薬局に売っているので...
-
「そんなこと言わんでよ」の言...
-
「しっちゃかめっちゃか」と「...
-
行者ニンニクの発送について
-
原田国際法律事務所とゆうとこ...
-
出身地とは
-
地図とかの「至」は何と読む?
-
そこがそれ
-
「より」と「から」の使い分け...
-
大阪の人は東京弁(標準語)に...
-
自分の住んでいる地域が嫌い。
-
紛失したiPhoneが戻ってきまし...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
振込用紙の東京MTとは
-
転勤で札幌に住んで二年ですが...
-
♪カステラ一番,電話は二番♪,...
-
「○○県は○○市~」にある"は"とは?
-
「なんで」と「なにで」の使い分け
-
「しっちゃかめっちゃか」と「...
-
最近ここら辺という言葉が標準...
-
東京からフェリーで和歌山にい...
-
福島駅から見える山脈の名前は?
-
「より」と「から」の使い分け...
-
地図とかの「至」は何と読む?
-
とても後悔しています。受験生...
-
特定の文字列があったらその行...
-
紛失したiPhoneが戻ってきまし...
-
飾っていた御札が落ちてしまい...
-
出身地とは
-
東日本の人は「ひっつく」とい...
-
東京~銀座辺りで、朝早くから...
-
東京に遊びにいくにはいくらく...
-
20代後半で単身上京。(女で...
おすすめ情報