VBAで重複データは最後のみ反映し並び替え

このQ&Aのポイント
  • VBAを使って、重複するデータの最後の文字を抽出し、A列に縦に並べて行う方法を教えてください。
  • E5から横に検索し、重複する文字は最後のみ反映し、空白のセルは無視してA列に転記する方法をVBAで実装したいです。
  • 変更される入力値に対応するために、実行ボタンを設置してVBAで処理を行いたいです。
回答を見る
  • ベストアンサー

VBAで重複データは最後のみ反映し並び替え

下記の様にE,F,G,H,I,J,K,L,M,Nに文字(主に地名)を入力した後VBAで横に検索していきA列に重複は最後の文字を抽出し縦に並べて行きたいのですがご教授頂けませんでしょうか。 説明が難しいのですがE5から横に検索し重複する文字は最後のみ反映し空白のセルは反映させずA1上から詰めて転記するイメージとなります。度々入力値が変更される事もあるので実行ボタンを設置してVBAで処理出来たら助かります。どうぞ宜しくお願い致します。(下記イメージです) E  F G H  I  J  K  L  M  N 111 111 222 111 333 111    222 222 111 111 222 444 333 666 555 333 777 444 999 222 333 888 888 666   999 333 333 666 555 666 666 666 ⇓ A 111 777 444 222 888 999 333 555 666

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1623/2463)
回答No.2

No1です。 > A列に重複は最後の文字を抽出し これの事を考えていませんでした。こちらに変更してください。 参照設定で以下の設定をしてから実行してください。 VBEの画面で「ツール」メニューから「参照設定」をクリックします。 「Microsoft Scripting Runtime」にチェックします。 Sub Test2() Dim mDic As New Scripting.Dictionary Dim c As Range, mVar As Variant Dim i As Long, j As Long: i = 0 Dim LastRow As Long, tmp As Variant Range("A:A").ClearContents With Range("E1") LastRow = .CurrentRegion(.CurrentRegion.Count).Row ReDim tmp(0 To .CurrentRegion.Count) End With For Each c In Range(Cells(1, "E"), Cells(LastRow, "N")) If c.Value <> "" Then tmp(i) = c.Value i = i + 1 End If Next For i = UBound(tmp) To LBound(tmp) Step -1 If mDic.Exists(tmp(i)) = False Then mDic.Add tmp(i), tmp(i) End If Next j = mDic.Count For Each mVar In mDic Cells(j, "A").Value = mDic.Item(mVar) j = j - 1 Next End Sub

twiceexid
質問者

お礼

お早い対応ありがとうございます!助かりました。 修正まで頂いて感謝しております。 本当にありがとうございました!

その他の回答 (4)

  • kkkkkm
  • ベストアンサー率65% (1623/2463)
回答No.5

No3さん わかりました。 文字は最後のみ反映し を考えたらということですね。No1はそのことを考えていませんでした。

  • kkkkkm
  • ベストアンサー率65% (1623/2463)
回答No.4

No3さん 「すべき」というその根拠を教えてください。

  • f272
  • ベストアンサー率46% (8024/17150)
回答No.3

#1さんの書いているコードは If mDic.Exists(c.Value) = False And c.Value <> "" Then mDic.Add c.Value, c.Value End If のところを If c.Value <> "" Then If mDic.Exists(c.Value) = True Then mDic.Remove c.Value mDic.Add c.Value, c.Value End If にすべきじゃないのかなあ。

  • kkkkkm
  • ベストアンサー率65% (1623/2463)
回答No.1

参照設定で以下の設定をしてから実行してください。 VBEの画面で「ツール」メニューから「参照設定」をクリックします。 「Microsoft Scripting Runtime」にチェックします。 Sub Test() Dim mDic As New Scripting.Dictionary Dim c As Range, mVar As Variant Dim i As Long: i = 1 Dim LastRow As Long Range("A:A").ClearContents With Range("E1") LastRow = .CurrentRegion(.CurrentRegion.Count).Row End With For Each c In Range(Cells(1, "E"), Cells(LastRow, "N")) If mDic.Exists(c.Value) = False And c.Value <> "" Then mDic.Add c.Value, c.Value End If Next For Each mVar In mDic Cells(i, "A").Value = mDic.Item(mVar) i = i + 1 Next End Sub

twiceexid
質問者

補足

kkkkkmさま ご親切にお早いご対応ありがとうございます!大変感謝しております。 私の説明が下手で分かり難くすみません 殆ど思い通りに動くのですが重複する物は順番的に最後のみ反映させ 途中は無い物として詰めたいと思ってます。 度々すみませんがご検討宜しくお願い致します。

関連するQ&A

  • VBAで重複しないデータを1列縦に並べたいです。

    下記の様にC,E,G,Iに文字(主に地名)を入力した後にVBAでA列に重複しない文字だけ縦に並べて行きたいのですがご教授頂けませんでしょうか。 B,D,F,H,Iは備考として自由記入したいので対象外にしたいです。 説明が難しいのですがA1から横に検索し重複しない文字や数字のみA列上から詰めて転記するイメージとなります。度々入力値が変更される事もあるので実行ボタンを設置してVBAで処理出来たら助かります。どうぞ宜しくお願い致します。 A, B, C, D, E, F, G, H, I, j 111 111 222 111 333 222 111 111 222 444 333 666 555 333 777 444 999 222 333 888 666 555 777 999 888

  • VBA

    1 a;b;c;d; 2 e;f;g;h; 3 i;j;k;l; をVBAで   1 a;   2 e;   3 i;   1 b;   2 f;    3 j;   1 c;   2 g;   3 k;   1 d;   2 h;   3 l; としたいのですが、どうしたらいいですか?

  • リストのデータを重複なしでランダムに抽出する

    シート1に下記のように14種類の名前リストがあります     A 1   A 2   B 3   C 4   D 5   E 6   F 7   G 8   H 9   I 10  J  11  K 12  L 13  M 14  N 上記の名前を下記のように別シートの数列おきの列(行は同一)に重複なしに行毎にランダムに抽出する事が関数で出来るでしょうか?(エクセルは2010です) ちなみに下記は一列おきのセルに抽出した例です   A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AA 1 D   L   K    I    A   M   N    B   H   J    C    F    E   G 2 K   J   M   H    I   G   F    E   D    A    B   N   C    L 3 E   J   A    L   B   M    K   C   N    G    F   D    H   I どなたか教えていただける方がおりましたらよろしくお願いします。

  • エクセルデータの並び替え

    A列に 1 2 3 4 5 6 7 ・・・・・ B列に a b c d e f g h i j k l ・・・・ と文字列があります。 これを C列に 5つずつデータをセットにして並べたいのです。 A列    B列           C列 1     a      1 a   2 b  3 c  4 d  5 e 2     b      6 f   7 g  8 h  9 i  10 j 3     c      11 k  12 l  13 m  14 n  15 o 4     d      16 p   17 q  18 r  19 s  20 t 5     e      以下同じように続く 6     f 7     g 8     h 9     i 10     j 11     k 実際のC列のデータは トマト tomato  ネコ cat   机 desk  いす chair  かばん  bag  のようにしたいのです。 関数の扱いがわからずに苦戦しています。どうぞ、よろしくお願いします。

  • エクセルのデータ並び替え

    列(A)に1000個あるデータを、4列X250行に自動的に並び替える方法はありますか? つまり A   A B C D B   E F G H C ⇒ I J K L D   M N O P E   ・ ・ ・ ・ ・ ・ ・ と、並べかえたいのですが、いい方法はありませんでしょうか?

  • エクセルでデータを反映させたい。

    エクセルで下記のことをしたいのですが、どのような方法が ありますか?   A B C D E (列) 1 1  a b c d 2 2  e f g h 3 3  i j k l (行) ・他シートにA1の「1」を入れると、B~E列のデータが反映する。 (A列の数字が個人を指すもので、それを選択すると付随するデータ(B~E)も反映するということなんですが・・・。 説明が下手で申し訳ないのですが、どなたか教えて下さい。

  • リストのデータを重複なしでランダムに抽出する

    シート1に下記のように14種類の名前リストがあります     A 1   A 2   B 3   C 4   D 5   E 6   F 7   G 8   H 9   I 10  J  11  K 12  L 13  M 14  N 上記の名前を下記のように別シートの数列おきの列(行は同一)に重複なしに行毎にランダムに抽出する事が関数で出来るでしょうか?(エクセルは2010です) ちなみに下記は一列おきのセルに抽出した例です   A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AA 1 D   L   K    I    A   M   N    B   H   J    C    F    E   G 2 K   J   M   H    I   G   F    E   D    A    B   N   C    L 3 E   J   A    L   B   M    K   C   N    G    F   D    H   I どなたか教えていただける方がおりましたらよろしくお願いします。 という質問をさせていただき、mike gさんに下記のような回答をいただきました 1.Sheet1 の例えばセル C1 に式 =RAND() を入力して、此れを右に2列(注1参照)ドラッグ&ペースト 2.範囲 C1:E1 を下方にズズーッと(14行目まで)ドラッグ&ペースト 以下は別シート(Sheet2)における操作です。 3.セル A1 に次式を入力して、此れを右方にズズーッと(セル AA1 まで)ドラッグ&ペースト(注2参照)   =IF(MOD(COLUMN(),2)=1,INDEX(Sheet1!$A$1:$A$14,MATCH(SMALL(OFFSET(Sheet1!$C$1,,ROW()-1,14,),CEILING(COLUMN()/2,1)),OFFSET(Sheet1!$C$1,,ROW()-1,14,),0)),"") 4.1行目全体を下方にズズーッと(3行目まで)ドラッグ&ペースト 注1:「右に2列」は別シートの行数が3行の場合で、4行(5行)の場合は「右に3列(4列)」に読み替える。 注2:式中の 2 は「一列おき」の場合で、二列(三列)おきの場合は 2 を 3(4) に書き替える。 これで完璧に出来たのですが 実際にはSheet2のセルH6から15列おきに抽出したいのです。 15列おきは出来たのですが、セルH6から抽出を始めるにはどの部分を変更すれば良いのでしょうか? どなたか教えて頂ける方がおりましたらよろしくお願いします。

  • エクセル:データの間にスペースを入れて表示させたいのですが

    エクセル:データの間にスペースを入れて表示させたいのですが エクセル2007を使用しています。 英数や+-が混在した30桁のデータの間に スペースを7・4・4・4・7・4 文字毎に 入れて表示させたいのですが いい方法はあるでしょうか?   a0b1c2d3e-f3g-h4i5j6k+l7m8n9o+ を   a0b1c2d 3e-f 3g-h 4i5j 6k+l7m8 n9o+ の様に表示させたいのですが。 ご存知の方がいらっしゃいましたらお教え下さい。 宜しくお願いします。

  • VBAでの構成比率の出し方について

    下記のようにA~Fまで件数が入力されているのですが、 その件数をもとにG~Nのように構成比率をVBAを使て出したいのですが 調べても全くわからないので、お詳しい方ぜひアドバイスをください。 エクセル2010を使っています。よろしくお願いします。 A、 B、 C、  D、 E、  F、 G、   H、   I、    J、   K、   N 10 20  40  25  20  15  7.69% 15.3% 30.8% 19.2% 15.3% 11.5%

  • エクセル 複数範囲から重複する数字を抽出

    エクセルで複数の範囲すべてに同じ数字があった場合、その数字を抽出することは出来ますか? 例:A1| B1 C1 D1 E1|F1 G1 H1 I1|J1 K1 L1 M1| N1 O1 P1 Q1| (1) B1~E1=(20 50 60) (2) F1~I1=(20 50 60) (3) J1~M1=(20 60) (4) N1~Q1=(20 50 80 ) (1)B1~E1、(2)F1~I1、(3)J1~M1、(4)N1~Q1の4つの範囲すべてに入っているのは、”20”になります。 A1に”20”と出したいのですが、どうしたら良いでしょうか。 どうぞよろしくお願いします。

専門家に質問してみよう