Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2010)
同一の列内の重複したデータを素早く見つけ出したい
投稿日時: 18/11/15 00:15:25
投稿者: FANTA66

いつも皆様の内容を参考にさせていただき大変助かっております。
既に、データへの連番の付け方、件数表示の不具合などについて
ご教授いただき大変助かりました。
  
私はExcelVBAを勉強中の初心者です。掲題につきまして質問がございます。
どうぞよろしくご指導をいただけますようお願い申し上げます。
 
今回の質問は「同一の列内で重複したデータを探し出し、
重複したデータはカラー表示をして目立たせたい」と考えております。
 
@を実行すると、希望した通りに動作するのですが、
いくつものシートに渡って繰り返し処理を行うと大変時間がかかります。
実際に1シート10列200行くらいのデータのうち、2列の重複を検出してます。
それが、30シートくらいありまして、実行すると15分くらいかかります。
 ※「H8:H1048576」の部分で列のすべてを検索しているのが
  まずいのだと考えております。結果、Aのように考えました。
 
@Sub 氏名漢字の重複データに色を付ける条件付き書式()
    Range("H8:H1048576").FormatConditions.Delete
    With Range("H8:H1048576").FormatConditions.AddUniqueValues
        .DupeUnique = xlDuplicate
        .Font.ColorIndex = 26
    End With
 End Sub
 
Aそこで、"データの最後の行を見つけ出そう"と考えて、
以下のように書いてみたのですが、Range("C8").End(xlDown).Rowの「Row」の部分の
型が違うとアラームが出て止まってしまいます。
 
ASub 氏名漢字の重複データに色を付ける条件付き書式2()
 Dim rng As Range, uv As UniqueValues
        Set rng = Range("C8").End(xlDown).Row
        Set uv = rng.FormatConditions.AddUniqueValues
            uv.DupeUnique = xlDuplicate
            uv.Font.ColorIndex = 26
 End Sub
 
書き方に問題があるのだと思うのですが、もうひとつ上手く動かすことができません。
ご指導よろしくお願いいたします。

回答
投稿日時: 18/11/15 07:52:12
投稿者: simple

Rowプロパティは行数という整数を返すものです。
一方で、Set はなんらかのオブジェクトを対象として使うものです。
ミスマッチになっているのでエラーになるのです。
当てずっぽうではなく、
コードの意味を考えながらコーディングするようにしてください。
 
セル範囲の指定方法は、とても重要ですが、なかなか理解しにくいことも確かです。
まとめてあるサイトを参照して、よくなじむようにしてください。
 
セル範囲の指定方法
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_cell.html
説明との関係で逐一Selectをしていますが、普通はSelectはしないようにします。

回答
投稿日時: 18/11/15 07:55:11
投稿者: WinArrow
投稿者のウェブサイトに移動

>Range("C8").End(xlDown).Rowの「Row」の部分の型が違うとアラームが出て止まってしまいます。
 
取得したいのは、Rangeオブジェクトであるにもかかわらず、行番号というプロパティを取得するコードになっているからです。
 
>Range("C8").End(xlDown).Row

Range("C8").End(xlDown)
にすれば、エラーの原因は、解消するでしょう。
 
しかし、ここで取得するRangeオブジェクトは、最終行のセルだけです。
>rng.FormatConditions.AddUniqueValues
の「rng」は単体セルですから、セル範囲にしなければいけません。
そうするとよいかは、あなたが考えることです。
 
もう一つの問題
条件付き書式を設定するときは、
当該セル範囲を選択する必要があったと記憶していますので、
試してみてください。
 
根本的なことですが、
このコードは、1つのシートでけに
30シートがあるのでしたら、複数のシートを対象にするコードにする必要がありますよね?
そのあたりは、今後、取り組むのでしょうか?
 
 
 
 
 

回答
投稿日時: 18/11/15 22:25:06
投稿者: simple

    Set rng = Range("C8", Range("C8").End(xlDown))
といった書き方ができますね。

投稿日時: 18/11/16 00:28:47
投稿者: FANTA66

simple 様。WinArrow 様。
 
こんばんは。早速、ご教授いただきありがとうございました。
 
simple 様の「セル範囲の指定方法」を読んでコードの意味を掴みながら
書いてみたところ手早い結果が得られるようになりました。
また、追記していただいた書き方を試しましたら、さらに早い作業結果が得られました。
あらためて、当方の知識の乏しさに落胆したところです。
 
WinArrow 様にご指摘いただいた「コードが意味する事」を深く勉強してゆきたいと思います。
 
私は、今年の四月からVBAの参考書を買い込み見よう見まねでスタートしました。
以前データの最終行を見つけ出せるコード覚えたことから、
それをうまく流用出来たら・・。と考えておりました。しかしながら、あてはめることなんて
簡単な事では進まない事もわかってきたところです。
もっともっとコードの意味を勉強したいと思います。
 
現在は、CSVの売上データをインポートし、そこからデータ内の商品ごとに分けた台帳を出力する。
という作業をVBAで完成しつつあります。
今回はその中の重複したデータに色付けして目立たせたいと考えておりました。
 
また、わからないことがございましたら、ぜひ、教えてください。
 
ありがとうございました。これでクローズとさせていただきます。