Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


307 / 13645 ツリー ←次へ | 前へ→

【81082】VBAで重複データ nao 19/8/19(月) 22:31 質問[未読]
【81083】Re:VBAで重複データ ピンク 19/8/20(火) 10:04 発言[未読]
【81084】Re:VBAで重複データ nao 19/8/20(火) 16:07 お礼[未読]
【81085】Re:VBAで重複データ γ 19/8/21(水) 7:15 発言[未読]
【81086】Re:VBAで重複データ マナ 19/8/21(水) 18:24 発言[未読]

【81082】VBAで重複データ
質問  nao  - 19/8/19(月) 22:31 -

引用なし
パスワード
   ご質問させてください。
素人なりにExcel2016 VBAで重複データを調べています。

現在、同一シート内の検出はできるようになったのですが
複数シート5シート程の重複データも調べたいと思っているのですが
うまく行きません。

それぞれのシートで重複を調べているようです。

例えばシート1にりんごの重複があった場合、
シート2やシート3のリンゴもシートへ色を付けたいです。

複数シートでのコードを教えて下さい。
現在のコードは、
Sub Test1()
Dim i As Long, j As Long
For i = 1 To 3000 '
For j = 1 To 6 '
If WorksheetFunction.CountIf(Range("A1:G100"), Cells(i, j)) > 1 Then
Cells(i, j).Interior.ColorIndex = 40
End If
Next j
Next i
End Sub

としています。
各シートにも検出セル色を付けたいです。
宜しくお願い致します。

【81083】Re:VBAで重複データ
発言  ピンク  - 19/8/20(火) 10:04 -

引用なし
パスワード
   ▼nao さん:
>複数シート5シート程の重複データも調べたいと思っているのですが
複数シートがSheet1、Sheet2、Sheet3、なら
Sub Test2()
  Dim sh As Worksheet, c As Range
  With WorksheetFunction
    For Each sh In Sheets(Array("Sheet1", "Sheet2", "Sheet3"))
      For Each c In sh.Range("A1:G100")
        If .CountIf(Worksheets("Sheet1").Range("A1:G100"), c.Value) + _
            .CountIf(Worksheets("Sheet2").Range("A1:G100"), c.Value) + _
            .CountIf(Worksheets("Sheet3").Range("A1:G100"), c.Value) > 1 Then
          c.Interior.ColorIndex = 40
        End If
      Next
    Next
  End With
End Sub

【81084】Re:VBAで重複データ
お礼  nao  - 19/8/20(火) 16:07 -

引用なし
パスワード
   ピンクさん
お忙しい中、ありがとうございます。

凄いですね、上手くいきました。

また、動作も早いです。
すごく勉強になりました。

本当にありがとうございました。

【81085】Re:VBAで重複データ
発言  γ  - 19/8/21(水) 7:15 -

引用なし
パスワード
   こんな書き方もあります。dictionaryを利用する方法です。

Sub test()
  Dim sh As Worksheet, c As Range
  Dim dic As Object

  Set dic = CreateObject("Scripting.Dictionary")

  For Each sh In Sheets(Array("Sheet1", "Sheet2", "Sheet3"))
    For Each c In sh.Range("A1:G100")
      dic(c.Value) = dic(c.Value) + 1
    Next
  Next

  For Each sh In Sheets(Array("Sheet1", "Sheet2", "Sheet3"))
    For Each c In sh.Range("A1:G100")
      If dic(c.Value) > 1 Then c.Interior.ColorIndex = 40
    Next
  Next
End Sub

ちなみに、CountIfによる方法も十分速い(0.6秒台)ですが、
上記は0.1秒台でした。
データ量にも依存するので、一概に言えないかもしれませんが、
一応参考まで。

【81086】Re:VBAで重複データ
発言  マナ  - 19/8/21(水) 18:24 -

引用なし
パスワード
   ▼nao さん:

条件付き書式です。
手作業で設定するほうが楽ですね…
というか、手作業で1回設定したら
マクロを実行する必要がないです。

Sub test()
  Dim sh As Worksheet
  Dim f As String
  
  f = "=COUNTIF(A1,Sheet1!$A$1:$G$100)" _
    & "+COUNTIF(A1,Sheet2!$A$1:$G$100)" _
    & "+COUNTIF(A1,Sheet3!$A$1:$G$100)"

  For Each sh In Sheets(Array("sheet1", "sheet2", "sheet3"))
    With sh.Range("A1:G100").FormatConditions
      .Delete
       .Add(Type:=xlExpression, Formula1:=f).Interior.ColorIndex = 40
    End With
  Next
  
End Sub

307 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free