- ベストアンサー
エクセルで不要な行を自動で削除する
エクセルを使った表で下記の様なデータがあります。 A列は番号、B列は来歴で、一番最後の文字(A0000の場合はB)の行が最新のデータになります。 例えばA0000の場合は始めのデータは「スニーカー」「サンダル」でしたが、A改定で「パンプス」が加わり、 更にB改定で「スニーカー」と「パンプス」が無くなったので、最終のデータは「サンダル」だけになります。 自動でこの表を結果の様に、夫々の番号で最終の来歴だけを残す方法を教えて下さい。 行は4000行程あり、来歴は無しの物からJ位まであります。 又番号によってデータの行数も異なります。D列以降にもデータは入っています。 A B C D E 1 A0000 - スニーカー 2 A0000 - サンダル 3 A0000 A スニーカー 4 A0000 A サンダル 5 A0000 A パンプス 6 A0000 B サンダル 7 B0000 - Tシャツ 8 C0000 - スーツ 9 C0000 A スーツ 10 C0000 A ドレス 11 C0000 A 着物 12 D0000 - 靴下 13 D0000 - ストッキング : : 結果(最終来歴だけのデータにする) A B C D E 1 A0000 B サンダル 2 B0000 - Tシャツ 3 C0000 A スーツ 4 C0000 A ドレス 5 C0000 A 着物 6 D0000 - 靴下 7 D0000 - ストッキング 現在並び替えて手作業で削除していますので、是非良い知恵をご教授下さい。
- bee_soccer
- お礼率66% (4/6)
- オフィス系ソフト
- 回答数5
- ありがとう数4
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
作業列を使わないでやる方法。 先ず、質問提示のサンプルでテストしてください。 見出し:1行目 データ:2行目以降 としてあります。 また、実際のデータで実行する場合は 当然ながらそれに応じてテーブル範囲など適宜修正のこと。 '-------------------------------------------------- Sub Test() Dim myDic1, myDic2 Dim Akey1, Akey2 Dim Target As Range Dim R As Long Dim LastRow As Long Set myDic1 = CreateObject("Scripting.Dictionary") Set myDic2 = CreateObject("Scripting.dictionary") LastRow = Cells(Rows.Count, "A").End(xlUp).Row '▲▲必要ならソートのコードをここに挿入 For R = LastRow To 2 Step -1 Akey1 = Cells(R, "A").Value Akey2 = Cells(R, "A").Value & "@" & Cells(R, "B").Value If myDic1.exists(Akey1) = False Then myDic1.Add Akey1, "" myDic2.Add Akey2, "" Else If myDic2.exists(Akey2) = False Then If Target Is Nothing Then Set Target = Cells(R, "A") Else Set Target = Union(Target, Cells(R, "A")) End If End If End If Next R Target.EntireRow.Delete xlUp End Sub '------------------------------------------------------ 第1キー(A列)第2キー(B列)のソートが必要なら、 上記▲のところに、下記ソートコードを挿入すること。 '-------------------------------------------------- Range("A1:C" & LastRow).Sort _ Key1:=Range("A2"), Order1:=xlAscending, _ Key2:=Range("B2"), Order2:=xlAscending, _ Header:=xlYes, OrderCustom:=1, MatchCase:=False, _ Orientation:=xlTopToBottom, SortMethod:=xlPinYin '------------------------------------------------------- 以上です。
その他の回答 (4)
- 135ok
- ベストアンサー率34% (26/75)
No.1です。 既に解決済みかと思いますが、関数で来歴の集計方法がわかりましたのでご参考として紹介いたします。 A列に作業列を作り A2 =IF(C2="","",IF(LEFT(B2,1)=LEFT(B3,1),"",LEFT(B2,1))) *C列が空欄の時は空欄。B2の頭文字(A)がB3の頭文がと同一文字の場合は空欄、以外はB2の頭文字を表示。 G2 =VLOOKUP(F2,$A:$D,3,0) *F列の文字を、A列~D列の表から検索しC列の文字を表示。 後は、前回紹介した作業と同じです。 今回は、値をsheet2に表示させてあります。 参考資料ですので、コメントは不要です。
- imogasi
- ベストアンサー率27% (4737/17068)
例データ A,B、C列 A0000 - スニーカー A0000 - サンダル A0000 A スニーカー A0000 A サンダル A0000 A パンプス A0000 B サンダル 1 B0000 - Tシャツ 2 C0000 - スーツ C0000 A スーツ C0000 A ドレス C0000 A 着物 3 D0000 - 靴下 D0000 - ストッキング 4 D2に =IF(COUNTIF($A$2:A2,A2)=COUNTIF($A$2:$A$100,A2),MAX($D$1:D1)+1,"") と式を入れて下方向に式を複写。仮にデータは第100行までと仮定した式。実際は多めの行数に変えること。 結果 上記D列 あとはGoogleで「imogasi方式」で照会してもらえれば私の回答が沢山出てくる。 Sheet2のA2に =INDEX(Sheet1!$A$1:$C$100,MATCH(ROW()-1,Sheet1!$D$1:$D$100,0),COLUMN()) C2まで式複写。 A2:C2の式をA5:C5の行まで式複写。 結果 A0000 B サンダル B0000 - Tシャツ C0000 A 着物 D0000 - ストッキング ーー やっていることは上からその行までのA0000の数と、列全体でのA0000の数が等しい(最下行に当たる)行に、上から、連番を振ったもの。 Sheet2では連番に対応したSheet1の行をもってきている。 === 質問の文章部分は、「同じ顧客番号のうち最下行に位置する行のものだけを抜き出したい」と表現すれば読者に判りやすいのでは。 ーー
補足
ご回答ありがとうございます。 補足ですが今回導きたい答えは最終行では無く、最終来歴のデータ全て なので、 C0000の場合は C0000 A スーツ C0000 A ドレス C0000 A 着物 となって欲しいです。 imogasi方式での回答も是非知りたいので、再度ご回答頂けると嬉しいです。 よろしくお願い致します。
- ASIMOV
- ベストアンサー率41% (982/2351)
VBAを使う方法です A列を一時的に作業列として使います A列の前に1列挿入し、下記のVBAを実行すると 図の様に、A列に残す行に「@」が付きます 後は、フィルターで 1.「@」行を抽出して、別シートにコピー 又は 2.「空白セル」行を抽出して、行削除 します 終了後はA列を「非表示」又は「列削除」します ----------------------------------- Sub Ts() lp = Range("B" & Rows.Count).End(xlUp).Row Cells(lp, "A") = "@" ban = Cells(lp, "B") rai = Cells(lp, "C") Do Until lp < 2 If ban = Cells(lp - 1, "B") Then If rai = Cells(lp - 1, "C") Then Cells(lp - 1, "A") = "@" End If Else Cells(lp - 1, "A") = "@" ban = Cells(lp - 1, "B") rai = Cells(lp - 1, "C") End If lp = lp - 1 Loop End Sub
お礼
ご回答ありがとうございました。 データ4000行に一瞬で「@」マークが付き私の思う通りの結果になりました。 今までこの作業に毎回かなりの時間を費やしていましたので助かりました。 今後多いに活用させて頂きます。
- 135ok
- ベストアンサー率34% (26/75)
ご参考程度で。 添付資料を参照ください。 「フィルタオプションの設定」を使うやり方です。 まず、項目をつけて表を作成する。 A列から 番号 来歴 商品名 次に、E、F列に検索データを入力 E列 Aから○○まで F列 各番号の最終来歴を入力。 次に、データ→フィルタ→フィルタオプションの設定を選択。 抽出先 指定した範囲 リスト範囲 $A:$C 検索条件範囲 $E$1:$F$5 抽出範囲 $H$1 なお、重複するレコードは無視するにチャックは入れない。 F列の最終来歴を自動で表示する方法が思いつきませんので、ご参考とさせていただきます。
お礼
早速のご回答ありがとうございました。 おっしゃる通りやりたかった事、すばりでは無かったのですが、今まで知らない機能なので 今後活用させて頂きたいと思います。 又参考URLもじっくり読ませて頂こうと思います。
関連するQ&A
- Excelで、同一データ行を知るには
Excel2000で、 A列からD列までまったく同じデータの場合、色をつけてくれる方法を教えてください。 例えば、 A20=A100 かつ B20=B100 かつ C20=C100 かつ D20=D100 の場合、同じデータとして、20行目と100行目に色をつけるようにしたいです。 次善の策として、 A列からD列だけでなく、E列以降もすべてまったく同じデータの場合でもいいです。 なお、ソートしたり、行の順番を変えるのはナシにしてください。 また、A列からD列のデータをくっつけるのも、できれば避けたいです。(それぞれの列を比較して異なる場合でも、くっつけたら同じになる場合もありうるので。)
- ベストアンサー
- オフィス系ソフト
- エクセル2010 エラー行を削除
こんばんは、エクセルのエラー行について解らないので、教えて頂けませんか? 画像の様なデータがあり、A6,B6の様に両方にエラーがある行、A12,B12の様にB列のみにエラーがある行のあるデータがあります。 それを、D列、E列の様に空白にする方法はありますか? ちなみに、2万行ほどありますので、一括で出来ればと思います。 詳しい方、よろしくお願い致します。
- ベストアンサー
- Excel(エクセル)
- エクセルの行と列の項目を入れ替えたいのですが
大きな表を作成しているのですが、行(1、2、3・・)と列(A,B,C,D・・・)を入れかえる必要がでてきました。すなわち、行を現在の列である(A,B,C,D・・・)とし、列を現在の行である(1、2、3、・・・)にしたいのです。こつこつデータを打ち直すしか方法はないのでしょうか?どなたか教えてください。お願い致します。
- 締切済み
- オフィス系ソフト
- Excelで、行の組み換えについて
A列からG列までデータが入っているリストがあるのですが、 例えば、1行目から50行目までと、51行目から100行目までを交互に組み入れるには どのようにすればよいでしょうか。 A B C D E F G 1 2 3 ・ ・ ・ 51 52 53 ・ ・ ・ といったものを、 A B C D E F G 1 51 2 52 3 53 ・ ・ ・ のようにしたいのですが、一気に操作できる方法があれば 教えていただきたく、よろしくお願いいたします。
- 締切済み
- オフィス系ソフト
- エクセルのデータを1行ずつ別々にしたい。
次のような1列のデータを2列に変更したいのです。 エクセルの初心者なものでいろいろ工夫してみましたがうまくいきません。良い方法を教えてください。データは1000行くらいあります。 元のデータ 1 あ 2 a 3 い 4 b 5 う 6 c ほしいデータ 1 あ a 2 い b 3 う c 4 え d 5 お e 6 か f どうぞ、よろしくお願いします。
- ベストアンサー
- その他(Windows)
- エクセルで長い行を5行ごとに1列にするには?
エクセルで行列の入れ替えの応用(になるのでしょうか?)をお尋ねします。 A列に例えば100行のデータが入っているのを、5行ずつ横並べにして、20行にしたい時どうすればよいでしょうか? A列 ------- データ1 データ2 データ3 データ4 データ5 データ6 データ7 データ8 データ9 データ10 (続く…) -------- こうなっているのを、 A列 B列 C列 D列 E列 ------------------------------------------ データ1 データ2 データ3 データ4 データ5 データ6 データ7 データ8 データ9 データ10 (続く…) ---------------------------------------- このように、表示したいのです。 お尋ねしているのは、100行ですが、 実は1500行ほどの長い名簿データが元のものです。 宜しくお願い致します。
- ベストアンサー
- オフィス系ソフト
- エクセルマクロ、空白行(セル)の挿入
データがA、B、C、D、E列100行まであります。 このうちD、E列を除き、エクセルのマクロで1行ごとに空白で10行挿入したいです。 (A、B、C、D列のデータに空白セルを10行分挿入し、下にシフトするイメージ。D、E列はそのまま。) ご教授頂きたく、お願いします。
- 締切済み
- その他(Windows)
- エクセル 複数行にまたがっているデーターを一つの行
以前に似たようなVBAの質問を元にさらにやりたいVBAがあるのですが、 (前の質問者のURL:http://okwave.jp/qa/q4955096.html) A列 B列 C列 D列 E列 ~ R列 1行目 佐藤 北海道 りんご S 100 105 2行目 佐藤 北海道 ばなな M 100 105 3行目 伊藤 東京 いちご S 100 105 4行目 伊藤 東京 ばなな M 100 105 上記のようなデーターがあります。これを2行目と4行目を削除し下記のようにしたいのですが A列 B列 C列 C列 1行目 佐藤 北海道 りんご,ばなな S,M 2行目 伊藤 東京 いちご,ばなな S,M A列とB列とE列~R列のデーターが同じでC列,D列,のデータが異なる場合、上記のように一行にまとめたいのです。関数やVBAで上記の処理を出来る方法がありますでしょうか。
- ベストアンサー
- オフィス系ソフト
- エクセルで行を削除するコマンド
こんにちは、お世話になります。 エクセルのVBAで、↓こんなことをしたいのですが、教えてください。 A列 B列 1 a 11 2 b 12 3 c 20 4 d 21 B列が20以上の時、行ごと削除する。 B列が「20の時」だったら、なんとかうまくいったのですが、 以上、以下、というのが全然わかりません。 それから、もし、皆さんが参考にされているサイトなどがあれば教えてください。 よろしくおねがいします。
- ベストアンサー
- オフィス系ソフト
- エクセルVBAでの行削除
エクセルで下記のようなデータがあり、最終行は2万くらいです。間に空白行はありません A B C D 年月日 営業所 担当者名 営業成績 0708 東京 ○山 60 0708 大阪 △川 55 0708 東京 ○山 20 0708 名古屋 □元 60 0708 大阪 ×谷 55 0708 大阪 ×谷 10 0708 九州 ▽尾 45 このデータでB列の値が「大阪」と「東京」以外を行削除 するマクロを作ろうとするのですがうまく行きません。 (実際の営業所は1000くらいあって、必要な営業所数は11だけなのですが) よい方法をご存知でしたら、お教えください。
- ベストアンサー
- その他(インターネット・Webサービス)
お礼
ご回答ありがとうございました。 完璧です。やりたいそのままの事が実現出来ました。 本当にありがとうございました。