Excel VBA質問箱 IV

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

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


11100 / 76735 ←次へ | 前へ→

【71176】Re:異なるデータを抽出させる
発言  kanabun  - 12/2/3(金) 18:29 -

引用なし
パスワード
   ▼PePe さん:
時間があったので、Findと CountIf と Dictionary とで、
どのくらい処理時間に差が出るのか、2つのシートに
2万行のランダム数値データを置いて、テストしてみました。

Option Explicit
Declare Function timeGetTime Lib "winmm.dll" () As Long
’// 2万行データの生成
Sub GenData()
  Const Lo = 1000, Hi = 9999
  Const MAX = 20000
  Dim i&
  Randomize
  ReDim v(1 To MAX, 1 To 1)
  For i = 1 To MAX
    v(i, 1) = Int((Hi - Lo + 1) * Rnd() + Lo)
  Next
  Cells(1).Resize(MAX).Value = v
End Sub

Sub test1_Find()
  Const MAX = 20000
  Dim WS1 As Worksheet
  Dim WS2 As Worksheet
  Dim r1 As Range, r2 As Range, c As Range
  Dim LstR1 As Long, LstR2 As Long
  Dim v
  Dim t&
  t = timeGetTime()
  
  Set WS1 = Worksheets(1)
  Set WS2 = Worksheets(2)
  With WS1
    LstR1 = MAX '.Cells(Rows.Count, 1).End(xlUp).Row
    Set r1 = .Range("A1:A" & LstR1)
    LstR2 = MAX ' WS2.Cells(Rows.Count, 1).End(xlUp).Row
    'WS2 A列をLoop
    For Each r2 In WS2.Range("A1:A" & LstR2)
      v = r2.Value
      Set c = Nothing
      'Bk2シートA列のあるセル値が、Bk1側にあるか調べる
      Set c = r1.Find(v, LookIn:=xlFormulas, LookAt:=xlWhole)
      '↓無かった時の処理
      If c Is Nothing Then
        LstR1 = LstR1 + 1
        .Cells(LstR1, 1).Value = v
      End If
    Next r2
  End With
 
  Debug.Print "Find", timeGetTime() - t
  
End Sub

Sub test2_CountIf()
  Const MAX = 20000
  Dim WS1 As Worksheet
  Dim WS2 As Worksheet
  Dim r1 As Range, r2 As Range
  Dim LstR1 As Long, LstR2 As Long
  Dim v
  Dim t&
  t = timeGetTime()
  
  Set WS1 = Worksheets(1)
  Set WS2 = Worksheets(2)
  With WS1
    LstR1 = MAX '.Cells(Rows.Count, 1).End(xlUp).Row
    Set r1 = .Range("A1:A" & LstR1)
    LstR2 = MAX ' WS2.Cells(Rows.Count, 1).End(xlUp).Row
    'WS2 A列をLoop
    For Each r2 In WS2.Range("A1:A" & LstR2)
      v = r2.Value
      'Bk2シートA列のあるセル値が、Bk1側にあるか調べる
      If WorksheetFunction.CountIf(r1, v) = 0 Then
      '↓無かった時の処理
        LstR1 = LstR1 + 1
        .Cells(LstR1, 1).Value = v
      End If
    Next r2
  End With
 
  Debug.Print "CountIf", timeGetTime() - t
  
End Sub

Sub test3_Dictionary()
  Const MAX = 20000
  Dim WS1 As Worksheet
  Dim WS2 As Worksheet
  Dim r1 As Range, r2 As Range
  Dim LstR1 As Long, LstR2 As Long
  Dim i&, v
  Dim dic As Object
  Dim t&
  t = timeGetTime()
  
  Set dic = CreateObject("Scripting.Dictionary")
  Set WS1 = Worksheets(1)
  Set WS2 = Worksheets(2)
  With WS1
    LstR1 = MAX '.Cells(Rows.Count, 1).End(xlUp).Row
    v = .Range("A1:A" & LstR1).Value
    For i = 1 To UBound(v)
     dic(v(i, 1)) = Empty
    Next
   
    LstR2 = MAX ' WS2.Cells(Rows.Count, 1).End(xlUp).Row
    'WS2 A列をLoop
    v = WS2.Range("A1:A" & LstR2).Value
    For i = 1 To UBound(v)
     'Bk2シートA列のあるセル値が、Bk1の辞書にあるか調べる
      If Not dic.Exists(v(i, 1)) Then
      '↓無かった時の処理
        LstR1 = LstR1 + 1
        .Cells(LstR1, 1).Value = v(i, 1)
      End If
    Next i
  End With
 
  Debug.Print "Dictionary", timeGetTime() - t
  
End Sub

■結果です(1回だけ  単位:ミリ秒)
CountIf    69390

Find      59691

Dictionary   256

9 hits

【71162】異なるデータを抽出させる PePe 12/2/3(金) 10:36 質問
【71164】Re:異なるデータを抽出させる kanabun 12/2/3(金) 11:03 回答
【71167】Re:異なるデータを抽出させる PePe 12/2/3(金) 11:29 質問
【71168】Re:異なるデータを抽出させる Hirofumi 12/2/3(金) 11:31 発言
【71170】Re:異なるデータを抽出させる Hirofumi 12/2/3(金) 11:57 発言
【71172】Re:異なるデータを抽出させる Hirofumi 12/2/3(金) 12:42 発言
【71171】Re:異なるデータを抽出させる kanabun 12/2/3(金) 11:59 発言
【71166】Re:異なるデータを抽出させる kanabun 12/2/3(金) 11:21 発言
【71169】Re:異なるデータを抽出させる kanabun 12/2/3(金) 11:32 発言
【71173】Re:異なるデータを抽出させる PePe 12/2/3(金) 15:47 お礼
【71175】Re:異なるデータを抽出させる kanabun 12/2/3(金) 17:04 発言
【71176】Re:異なるデータを抽出させる kanabun 12/2/3(金) 18:29 発言
【71177】Re:異なるデータを抽出させる kanabun 12/2/3(金) 19:08 発言

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