プロが教えるわが家の防犯対策術!

vbaエクセルマクロ
RemoveDuplicatesについて

RemoveDuplicatesを使って重複する行を削除するマクロを組んで、あるデータを作成します。


シート1のA1セルに、シート2のA1セルを、
シート1のA2セルに、シート2のA2セルを、




シート1のB1セルに、シート2のB1セルを、
シート1のB2セルに、シート2のB2セルを、




というように、シート1にシート2の値をもってくるように、シート1のセルにINDEX関数を入れています。

マクロでRemoveDuplicatesメソッドで
シート1のA列とB列ともが、他の行と重複している場合は行削除を行い、
最後にシート1の全体をコピーして値の貼り付けをして
マクロ終了でデータ作成完了としています。

そこで質問なのですが、
シート1のセルに
INDEX関数を設定しているのに、
値の貼り付けをする前にRemoveDuplicatesメソッドで重複行の削除を行うと
おかしくならないでしょうか。

質問者からの補足コメント

  • kantansi様

    追加質問の内容に誤りがありました

    削除された直後、A2セルには
    A2 =INDEX(Sheet2!A:A,2)、もしくは
    A3 =INDEX(Sheet2!A:A,3)
    のどちらが入っているのでしょう。。

    A2 =INDEX(Sheet2!A:A,2)
    A3 =INDEX(Sheet2!A:A,3)

    誤り

    =INDEX(Sheet2!A:A,2)
    =INDEX(Sheet2!A:A,3)

    こちらです

      補足日時:2023/02/28 21:51

A 回答 (3件)

INDEX関数を使用している場合でも、RemoveDuplicatesメソッドで重複行の削除を行っても、問題はありません。



RemoveDuplicatesメソッドは、重複する行を削除するだけで、その行に対応するセルの値は削除しません。つまり、削除された行に対応するセルの値は、シート上にそのまま残ります。

そのため、RemoveDuplicatesメソッドを使用しても、INDEX関数によって取得された値が失われることはありません。削除された行に対応するセルには、INDEX関数によって取得された値が残るため、その後のコピー&貼り付け操作によって、正しいデータが作成されます。

ただし、注意点として、RemoveDuplicatesメソッドは元の範囲内で重複行を削除するため、INDEX関数によって取得される値の範囲と、RemoveDuplicatesメソッドが適用される範囲が異なる場合は、意図しない結果になる可能性があります。そのため、RemoveDuplicatesメソッドを使用する前に、適切な範囲を指定しておくことが重要です。
    • good
    • 0
この回答へのお礼

回答ありがとうございます_(._.)_

私の理解力がなくて申し訳ありません。

回答いただいた内容からしますと、
設定されている関数の内容に依存せず
=INDEX
で参照していたとしても、問題なく重複行が削除されるということでしょうか。

たとえばシート1のセルが下のようになっています。

A1 =INDEX(Sheet2!A:A,1)
A2 =INDEX(Sheet2!A:A,2)
A3 =INDEX(Sheet2!A:A,3)

B1 =INDEX(Sheet2!B:B,1)
B2 =INDEX(Sheet2!B:B,2)
B3 =INDEX(Sheet2!B:B,3)

A1とA2が重複しているので
RemoveDuplicatesメソッドで2行目が削除されたとします。

削除された直後、A2セルには
A2 =INDEX(Sheet2!A:A,2)、もしくは
A3 =INDEX(Sheet2!A:A,3)
のどちらが入っているのでしょう。。

他のかたに回答いただいた内容とは違うということですよね?
追加の質問で申し訳ありませんが教えていただけますとたすかります_(._.)_

ちなみに、実際は
WorkSheet(1).Range("A:Z").RemoveDuplicates Columns:=Array(1, 3),Header:=xlYes
としていて、
1行目から最終行までを対象に、A列とC列ともに重複している場合、重複行を削除、としています。
範囲を正しく選択していないといけないというのは、最終行までを対象にしているので
あまり関係ないでしょうか。

長々とすみません_(._.)_

お礼日時:2023/02/28 21:30

No1です。



>値で貼り付けをした後にRemoveDuplicatesを実行すると回避できるということになりますでしょうか。
どのような形で結果を得たいのかによります。
関数を残す必要がないのなら、値(=固定値)にしてから、処理するのが簡単でしょう。

>=INDEX(A:A,ROW())の関数で参照しておりました。
もしもそうなら、単にシートをコピーしているだけなので、関数を設定する必要もなく、最初から元シートの必要範囲をVBAで転記すれば済む話ではないでしょうか?

転記部分の処理は1行でよいので、
  転記先セル範囲.Value = 転記元セル範囲.Value
  転記先セル範囲.RemoveDuplicates ~~~
程度で済みそうな気がします。
    • good
    • 1

こんばんは



>重複行の削除を行うとおかしくならないでしょうか。
聞くまでもなく、試してみればすぐにわかることと思います。

設定されている関数の内容に依存します。
実際にどのような関数を入力してあるのか不明ですが、
 =INDEX(A:A,ROW())
みたいな関数で参照していると、重複を削除した後で参照するセル位置が変わります。
(結果的に値も変わります)
OFFSET、INDIRECTなどでも同様のことは発生すると考えられます。

一方で、
 =シート2!A1
のような参照式であれば、元の参照が保持されることを期待できます。

要は、(重複している)行を削除した際に、エクセルが自動で関数式のアドレスの調整を行いますが、そのロジックに合致しているか否かの違いかと。
普通に関数式を設定する際に、フィルコピーできる式とできない式の違いのようなことが、別の基準ですが、同じように発生します。
    • good
    • 0
この回答へのお礼

こんばんは
いつもありがとうございます_(._.)_

=INDEX(A:A,ROW())の関数で参照しておりました。。

ということは、値で貼り付けをした後にRemoveDuplicatesを実行すると回避できるということになりますでしょうか。

お礼日時:2023/02/28 01:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!