Excel VBA質問箱 IV

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

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


10554 / 76734 ←次へ | 前へ→

【71726】Re:表の整理
発言  UO3  - 12/4/3(火) 12:39 -

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

こんにちは
ご理解いただけたようでなによりです。

>UO3さんはどうやって、「子Dictionary」なるものが作れると知ることが出来たのでしょうか?

う〜ん、なんとなくです?
この例は、少なからず、掲示板などの回答としてでていますし、回答者さんの中には
「自分が発見した!皆さんもどうぞ」なんてコメントする人もいます。
その人は、本当に、ご自分で発見されたんでしょうし、同じく、私も発見?
Dictionaryに限らず、私の場合は、できる、できないの前に、
「こんなことができたらいいなぁ」とか「こんなふうにやるとできるべきなのになぁ」なんて考えます。
(VBAだけじゃなく、エクセルの操作でも)
で、やってみると、「おっ!できるじゃん」とか「あぁ、やっぱりだめだよね」
最初は、たとえばユーザーフォーム上のコンロロールを配列的に扱うために、
配列を用意して、そこに「クラス」を登録することからはじめたような記憶があります。
(この部分は、参考書に、よく記載されていますので)
で、思考(?)の順序としては
・クラスもオブジェクトだよね
・じゃぁ、配列にその他のオブジェクトをいれられたら、便利かも。
・で、やってみます。結果は「おっ!できるじゃん」です。
・そのあと、Dictionaryの中身の実態も配列だよね。じゃぁ、その中身にDictionaryというオブジェクトを
 いれることができれば、そのキーごとの「子Dictionary」を保持することができるんじゃないかな?
・で、やってみます。またまた結果は「おっ!できるじゃん」す。
こんな経緯でしたね。

私は手軽に扱えるので、もっぱら、この方法なんですが、本当のエキスパートさんになると
Dictionaryのデータという「窮屈」な場所をつかうのではなく、私が言う、「子Dictionary」を
「データ保持クラス」といった目的の「クラス」を生成して扱ってらっしゃいますね。
このほうが、どんな形のデータももてますし、データ処理のためのコードすら持てます。

>この記述ですが、本当なのでしょうか?

まず、Dictionary は「かなり速い」ツールです。でも、圧倒的に一番かというと、まずますという
ところなんだろうなと思います。「天才」ではなく「秀才」ですね。もちろん、「秀才」ですから
「並の人」より、光り輝いているんです。

たとえば、以下のサンプルは、きわめて単純なレイアウトをきわめて単純なロジックで扱った場合の
比較です。ほとんど差はありませんが、「秒以下」のところで「ほんの少し」差がでます。
これが、もっともっと複雑なレイアウトで複雑なマッチングロジックになると、極端な場合、
Dictionary処理が1.5倍ぐらいかかるケースもありえます。

・まず、DataGen を実行してください。
 これは、結構時間がかかりますけど、がまんしてください。
 Sheet1 のA列,B列に50,000行のランダムな値をセットします。
 Test1,Test2を実行すると、Sheet1 がかわってしまいますので、比較を公平にするために
 1つ実行したら、Sheet2 から セルの内容をSheet1 にコピペしてESCキーでリセットしてから
 もう1つを実行してください。

Sub TestGen()
  Dim i As Long
  Dim x As Long
  Dim z As Long
  
  With Sheets("Sheet1")
    .Cells.Clear
    For i = 1 To 50000
      x = Int((1000) * Rnd + 1)
      z = Int((100) * Rnd + 1)
      .Cells(i, "A").Value = "A" & Format(x, "0000")
      .Cells(i, "B").Value = z
    Next
    .Cells.Copy Sheets("Sheet2").Range("A1")
  End With
  
End Sub

Sub Test1()
  Dim dic As Object
  Dim c As Range
  Dim myTime As Double
  
  myTime = Timer   '計測開始
  
  Application.ScreenUpdating = False
  Set dic = CreateObject("Scripting.Dictionary")
  
  With Sheets("Sheet1")
    With .Range("A1", .Range("A" & .Rows.Count).End(xlUp))
      For Each c In .Cells
        If c.Value > dic(c.Value) Then dic(c.Value) = c.Offset(, 1).Value
      Next
    End With
    .Columns("C:D").Clear
    .Range("C1").Resize(dic.Count).Value = WorksheetFunction.Transpose(dic.keys)
    .Range("D1").Resize(dic.Count).Value = WorksheetFunction.Transpose(dic.items)
  End With
  Application.ScreenUpdating = True
  
  MsgBox Timer - myTime
  
End Sub

Sub Test2()
  Dim dic As Object
  Dim c As Range
  Dim myTime As Double
  Dim v() As Variant
  Dim k As Long
  Dim oldkey As Variant
  Dim maxNum As Long
  
  myTime = Timer   '計測開始
  
  Application.ScreenUpdating = False
  
  With Sheets("Sheet1")
    With .Range("A1", .Range("A" & .Rows.Count).End(xlUp))
      .Resize(, 2).Sort key1:=.Range("A1"), order1:=xlAscending
      ReDim v(1 To .Rows.Count, 1 To 2)
      For Each c In .Cells
        If c.Value <> oldkey Then
          k = k + 1
          maxNum = 0
        End If
        If c.Offset(, 1).Value > maxNum Then maxNum = c.Offset(, 1).Value
        oldkey = c.Value
        v(k, 1) = oldkey
        v(k, 2) = maxNum
      Next
    End With
    .Columns("C:D").Clear
    .Range("C1").Resize(k, 2).Value = v
  End With
  Application.ScreenUpdating = True
  
  MsgBox Timer - myTime

End Sub

20 hits

【71555】表の整理 ドカ 12/3/16(金) 20:43 質問
【71557】Re:表の整理 ドカ 12/3/16(金) 20:54 発言
【71559】Re:表の整理 何か変じゃないですか 12/3/16(金) 22:44 発言
【71561】Re:表の整理 ドカ 12/3/17(土) 4:42 発言
【71560】Re:表の整理 UO3 12/3/16(金) 23:09 発言
【71562】Re:表の整理 ドカ 12/3/17(土) 4:57 お礼
【71564】Re:表の整理 UO3 12/3/17(土) 9:39 回答
【71671】Re:表の整理 ドカ 12/3/27(火) 14:10 質問
【71672】Re:表の整理 UO3 12/3/27(火) 16:43 発言
【71673】Re:表の整理 UO3 12/3/27(火) 17:20 発言
【71674】Re:表の整理 ドカ 12/3/27(火) 20:11 発言
【71675】Re:表の整理 ドカ 12/3/28(水) 9:08 お礼
【71676】Re:表の整理 UO3 12/3/28(水) 10:34 発言
【71677】Re:表の整理 ドカ 12/3/28(水) 11:10 発言
【71678】Re:表の整理 UO3 12/3/28(水) 15:08 発言
【71679】Re:表の整理 UO3 12/3/28(水) 15:13 発言
【71683】Re:表の整理 ドカ 12/3/28(水) 20:34 お礼
【71688】Re:表の整理 ドカ 12/3/30(金) 8:29 質問
【71689】Re:表の整理 ドカ 12/3/30(金) 9:06 質問
【71690】Re:表の整理 UO3 12/3/30(金) 10:27 発言
【71691】Re:表の整理 UO3 12/3/30(金) 11:46 発言
【71692】Re:表の整理 UO3 12/3/30(金) 21:10 発言
【71720】Re:表の整理 UO3 12/4/2(月) 14:10 発言
【71724】Re:表の整理 ドカ 12/4/3(火) 7:59 お礼
【71728】Re:表の整理 UO3 12/4/3(火) 13:16 発言
【71731】Re:表の整理 UO3 12/4/3(火) 16:54 発言
【71725】Re:表の整理 ドカ 12/4/3(火) 8:15 質問
【71726】Re:表の整理 UO3 12/4/3(火) 12:39 発言
【71727】Re:表の整理 UO3 12/4/3(火) 12:44 発言
【71736】Re:表の整理 ドカ 12/4/4(水) 15:59 お礼

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