Excel VBA質問箱 IV

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

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


3629 / 13646 ツリー ←次へ | 前へ→

【61078】VBAのCountif処理を高速にしたい 質問者 09/4/8(水) 14:00 質問[未読]
【61079】Re:VBAのCountif処理を高速にしたい Yuki 09/4/8(水) 14:54 発言[未読]
【61082】Re:VBAのCountif処理を高速にしたい 質問者 09/4/8(水) 16:20 お礼[未読]

【61078】VBAのCountif処理を高速にしたい
質問  質問者  - 09/4/8(水) 14:00 -

引用なし
パスワード
   お世話になります。
首記の件で困っております。
特に不具合なく動いているのですが、
あまりにも動作が遅い。。。
VBAは普段がりがりやっているのではないのですが、
今回の処理は約30万レコード分の処理があるのでどうしても
VBAでないときついと思いチャレンジしています。

やりたいことは、A列にある値がR列の限られたエリアにいくつ存在するか、
というチェック作業です。

コードを記載しますので、
どなたかやさしい突っ込みお願いしますw

Sub CntIf()
  For myRow = 2 To 274872
      Cells(myRow, 19) = WorksheetFunction.CountIf(Range("Q2:Q274872"), Cells(myRow, 1))
      cntRec = cntRec + 1
      Application.StatusBar = "処理実行中....(現在 " & cntRec & "件)"
  Next
End Sub

【61079】Re:VBAのCountif処理を高速にしたい
発言  Yuki  - 09/4/8(水) 14:54 -

引用なし
パスワード
   ▼質問者 さん:

ディクショナリで処理して見ました。
数秒で終わると思います。
未検証です。

Sub TESTaa()
  Dim i  As Long
  Dim v1 As Variant
  Dim v2 As Variant
  Dim v3 As Variant
  Dim Dic As Object
  
  v1 = Range("Q2:Q274872").Value
  v2 = Range("A2:A274872").Value
  ReDim v3(1 To UBound(v2), 1 To 1)
  Set Dic = CreateObject("Scripting.Dictionary")
  ' 最初に同じ物は合計して置く
  For i = 1 To UBound(v1)
    If Dic.Exists(v1(i, 1)) Then
      Dic(v1(i, 1)) = Dic(v1(i, 1)) + 1
    Else
      Dic(v1(i, 1)) = 1
    End If
  Next
  ' 全件チェックあったら数量をセット
  For i = 1 To UBound(v2)
    If Dic.Exists(v2(i, 1)) Then
      v3(i, 1) = Dic(v2(i, 1))
    End If
  Next
  Range("S2").Resize(UBound(v3)).Value = v3
End Sub

【61082】Re:VBAのCountif処理を高速にしたい
お礼  質問者  - 09/4/8(水) 16:20 -

引用なし
パスワード
   Yukiさん、レスありがとうございます。
試してみたところ、
おっしゃる通り10秒足らずで完了しました!
(ちなみに私のコードでは半日がかりで10万件程度・・・)

今回の質問で「ディクショナリ」というものを初めて認識しました。
一度自分なりに調べてみます。

本当に助かりました!
ありがとうございます!

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