Excel VBA質問箱 IV

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

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


44499 / 76732 ←次へ | 前へ→

【37249】こちらこそ。勉強させて頂きました^ ^
発言  Ned  - 06/4/26(水) 23:10 -

引用なし
パスワード
   こんにちは。
私のコードが速いのではなくて、"Scripting.Dictionary"が速いのだと思います^ ^;
調べて、使いこなせるようになれば、いろんなところで役に立ちますヨ^ ^

でも、前に書きましたが、私も勉強中なので、詳しいわけではありません。
Scripting.Dictionary でNET検索してみてください。
http://www.interq.or.jp/student/exeal/dss/ref/wsh/scripting/dictionary.html
など、いろいろHITすると思います。

ついでに。自分のコードにコメントつけるのは苦手なのですが、何かの参考になれば。

Sub sample0()
  Dim vA As Variant '比較(検索)先範囲を格納するために準備
  Dim vD As Variant '比較元となる範囲を格納するために準備
  Dim v As Variant '配列vDの個別要素Loop用
  Dim vX As Variant '結果書き出し先の値を格納するために準備
  Dim rD As Range '起点セル用
  Dim myDic As Object '"Scripting.Dictionary"事後バインディング用
  Dim i As Long, ii As Long 'Loopカウント用
  
  '比較起点セルを変数にセット。(どちらかというと、記述を簡単にしたいから)
  Set rD = Range("D1") 'ActiveCell
  '比較対象範囲の値を=Range().Valueで2次元配列に格納。
  With rD.Offset(, -3)
    vA = Range(.Cells, .End(xlDown).Offset(, 1)).Value
  End With
  '比較元の値を2次元配列に格納。
  With Range(rD, rD.End(xlDown))
    vD = .Value
    '結果書き出し先の値を2次元配列に格納。
    With .Offset(, 1)
      vX = .Value
      'オブジェクトmyDicとして"Scripting.Dictionary"を作成。
      Set myDic = CreateObject("Scripting.Dictionary")
      '比較対象をdicに格納。この時、セル範囲から一旦配列に格納したものをLoopして高速化。
      For i = 1 To UBound(vA)
        'myDic.Exists(キー値)…キーが既にmyDicにあれば(重複していれば)Trueを返す。 _
        なのでNot…重複していない時だけ、配列の2番目の次元(2列目と考えてください) _
        の値をDictionaryのアイテムとして格納する。正式な書き方は↓?
        'If Not myDic.exists(vA(i, 1)) Then myDic.Add Key:=vA(i, 1), Item:=vA(i, 2)
        If Not myDic.exists(vA(i, 1)) Then myDic(vA(i, 1)) = vA(i, 2)
      Next i
      '比較元を格納した配列をLoopする。
      For Each v In vD
        'For...Each使用のため、配列要素数をカウントしながら。
        ii = ii + 1
        'Dictionary.Exists(キー値)=Trueで存在確認して、書き出し用配列にItemをセット。
        If myDic.exists(v) Then vX(ii, 1) = myDic.Item(v)
      Next v
      '書き出し先セルをクリアする。(配列から書き出す時、一旦クリアしないと遅い)
      .ClearContents
      '配列から一括書き込み。
      .Value = vX
    End With
  End With
  Set myDic = Nothing
  Set rD = Nothing
End Sub

1 hits

【36749】データを取得する便利なマクロですが、処理を速くするには? カド 06/4/12(水) 14:43 質問
【36750】Re:データを取得する便利なマクロですが、... Statis 06/4/12(水) 14:53 発言
【36751】Re:データを取得する便利なマクロですが、... カド 06/4/12(水) 14:58 発言
【36753】Re:データを取得する便利なマクロですが、... Statis 06/4/12(水) 15:08 回答
【36754】Re:データを取得する便利なマクロですが、... カド 06/4/12(水) 15:37 お礼
【36756】Re:データを取得する便利なマクロですが、... Statis 06/4/12(水) 15:57 回答
【36757】Re:データを取得する便利なマクロですが、... カド 06/4/12(水) 16:37 お礼
【36760】Re:データを取得する便利なマクロですが、... Statis 06/4/12(水) 17:01 回答
【36763】超高速処理でしたよ。なんてね。 カド 06/4/12(水) 17:52 お礼
【36764】蛇足でしたらごめんなさい。 Ned 06/4/12(水) 20:13 発言
【36771】Re:蛇足でしたらごめんなさい。 カド 06/4/13(木) 6:13 お礼
【36772】ほんとに超高速でした。 カド 06/4/13(木) 6:53 お礼
【36796】やはり1秒で処理できました。 カド 06/4/14(金) 8:40 お礼
【37191】大きな問題があることに気づきました。 カド 06/4/25(火) 15:23 質問
【37197】Re:大きな問題があることに気づきました。 Ned 06/4/25(火) 16:18 発言
【37223】Re:大きな問題があることに気づきました。 Ned 06/4/26(水) 10:05 発言
【37247】Re:大きな問題があることに気づきました。 カド 06/4/26(水) 21:34 お礼
【37249】こちらこそ。勉強させて頂きました^ ^ Ned 06/4/26(水) 23:10 発言
【36752】Re:データを取得する便利なマクロですが、... Kein 06/4/12(水) 15:00 回答
【36755】Re:データを取得する便利なマクロですが、... カド 06/4/12(水) 15:41 お礼
【36758】Re:データを取得する便利なマクロですが、... Kein 06/4/12(水) 16:51 回答
【36762】Re:データを取得する便利なマクロですが、... カド 06/4/12(水) 17:22 お礼

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