Excel VBA質問箱 IV

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

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


14734 / 76738 ←次へ | 前へ→

【67493】Re:Dictionaryについて
回答  UO3  - 10/12/9(木) 10:21 -

引用なし
パスワード
   ▼八家九僧陀 さん:

おはようございます

本件に限っては、Dictionaryを使わずとも、Hirofumiさんからでているコードのような処理、
あるいは、VBAを使わなくても、並び替え をした上で、データ->集計 で簡単に必要列の
個人別合計は取得できますので【いかんせん、実稼動させる期限がせまり余裕がなくあせっています。】
のであれば、手作業をお奨めします。
また、この集計をマクロ記録すれば、基本的なコードを取得できますのでそれをベースにブラッシュアップすれば
VBAによる実行もできるかと思います。

ただ、今後のことも含めて、Dictionaryを身に付けておきたいという目的であれば、それはそれとして
以下にコード案をアップします。

・Dictionaryは、処理効率は、かなり優れている。しかしながら、大量データの突合せ処理を
 おこなう場合は、並び替え->ループによるマージロジック のほうが、より優れている。
 (というか、圧倒的に優れている)
・一方、ループによるマージロジックは、コードそのものが、けっして平易ではなく、バグつぶしに
 時間がかかることが多い。一方、Dictionaryは、いってみれば【ばかちょんカメラ】で、ロジックに
 悩むこともほとんどなく、コード部品としては、むしろ、初心者向き。
・また、他の機能(たとえばFileSystemObject)と比べ、圧倒的にメソッドやプロパティが【少なく】
 誰でも短期間に覚えることができるという利点もある。
・要素の格納という面では配列やCollectionに似ているが、要素の追加、上書き、取り出しにおいて
 両者よりも簡単に扱える部分が多い。

以下のサンプル、転記先シートのタイトル行と、各列の書式はセット済みという前提です。

Sub Sample()
 Dim dic As Scripting.Dictionary
 'Microsoft Scrinting Runtime 参照設定済みでなければ
 'Dim dic As Object
 Dim i As Long
 Dim id As String
 Dim pcode As String
 Dim v As Variant
 Dim myA As Range
 
 Set dic = New Scripting.Dictionary
 'Microsoft Scrinting Runtime 参照設定済みでなければ
 'Set dic = CreateObject("Scripting.Dictionary")
 Application.ScreenUpdating = False
 
 With Worksheets("支給台帳")
  For i = 2 To .Range("C" & .Rows.Count).End(xlUp).Row
   id = .Cells(i, "C").Value
   pcode = .Cells(i, "D").Value
   If Not dic.Exists(id) Then
    dic(id) = Array(id, pcode, 0, 0, 0)
   End If
   v = dic(id)
   v(2) = v(2) + .Cells(i, "CN").Value
   v(3) = v(3) + .Cells(i, "CO").Value
   v(4) = v(4) + .Cells(i, "BZ").Value
   dic(id) = v
  Next
 End With
 
 With Worksheets("年調データ")
  Set myA = Intersect(.UsedRange, .UsedRange.Offset(1, 0))
  If Not myA Is Nothing Then myA.ClearContents
  Set myA = Nothing
  .Range("A2").Resize(dic.Count, 5).Value = _
    Application.Transpose(Application.Transpose(dic.Items))
 End With
 
 Set dic = Nothing
 Application.ScreenUpdating = True
 
End Sub

0 hits

【67485】Dictionaryについて 八家九僧陀 10/12/9(木) 1:45 質問
【67487】Re:Dictionaryについて Hirofumi 10/12/9(木) 8:33 回答
【67490】Re:Dictionaryについて Hirofumi 10/12/9(木) 9:29 回答
【67505】Re:Dictionaryについて Hirofumi 10/12/9(木) 18:05 発言
【67507】Re:Dictionaryについて 八家九僧陀 10/12/9(木) 18:15 お礼
【67511】Re:Dictionaryについて Hirofumi 10/12/9(木) 19:03 回答
【67575】Re:Dictionaryについて 八家九僧陀 10/12/15(水) 0:48 お礼
【67492】Re:Dictionaryについて kanabun 10/12/9(木) 10:00 発言
【67500】Re:Dictionaryについて kanabun 10/12/9(木) 16:12 発言
【67506】Re:Dictionaryについて Hirofumi 10/12/9(木) 18:06 発言
【67508】Re:Dictionaryについて 八家九僧陀 10/12/9(木) 18:22 お礼
【67510】Re:Dictionaryについて kanabun 10/12/9(木) 18:46 発言
【67512】Re:Dictionaryについて kanabun 10/12/9(木) 19:11 発言
【67576】Re:Dictionaryについて 八家九僧陀 10/12/15(水) 0:57 お礼
【67577】Re:Dictionaryについて kanabun 10/12/15(水) 9:25 発言
【67582】Re:Dictionaryについて 八家九僧陀 10/12/15(水) 22:30 お礼
【67493】Re:Dictionaryについて UO3 10/12/9(木) 10:21 回答
【67494】Re:Dictionaryについて kanabun 10/12/9(木) 11:19 発言
【67496】Re:Dictionaryについて UO3 10/12/9(木) 14:18 発言
【67499】Re:Dictionaryについて kanabun 10/12/9(木) 16:06 発言
【67509】Re:Dictionaryについて 八家九僧陀 10/12/9(木) 18:31 お礼

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