Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Professional : Excel 2007)
Dictionaryで複数アイテム
投稿日時: 19/02/12 12:56:32
投稿者: FILETUBE

DictionaryでKEY項目はA,B,C,D列でITEM項目がF,G,H列の場合
ITEMが1列の場合下記のコードでOKですが、3列ある場合
どのうようなコードになるのか分かる方おられましたら
教えて頂けないでしょうか。
宜しくお願いします。
 
  'Dictionaryへ退避
    Dim dic As Object
    Dim vLst As Long
    Dim y As Long
    vLst = wks.Range("A1").SpecialCells(xlLastCell).Row
    Set dic = CreateObject("Scripting.Dictionary")
    For y = 1 To vLst
        If wks.Cells(y, 1).Value <> "" Then
           dic.Add wks.Cells(y, 1).Value & wks.Cells(y, 2).Value & _
                   wks.Cells(y, 3).Value & wks.Cells(y, 4).Value, wks.Cells(y, 6).Value
        End If
    Next
    '処理
        
    '元に戻し
    For y = 1 To vLst
        wks.Cells(y, 6).Value = dic(wks.Cells(y, 1).Value & wks.Cells(y, 2).Value & _
                                    wks.Cells(y, 3).Value & wks.Cells(y, 4).Value)
    Next

回答
投稿日時: 19/02/12 13:02:00
投稿者: WinArrow
投稿者のウェブサイトに移動

3つのセルを文字列結合した作業列を使ってキーを1つにすることです。

投稿日時: 19/02/12 18:56:31
投稿者: FILETUBE

WinArrowさん、回答ありがとうございました。
 
キーは連結しましたが、ITEMも連結するのでしょうか?
また元に戻す時は、分解になるのでしょうか?

回答
投稿日時: 19/02/12 19:18:20
投稿者: mokutachi

なぜ退避にDictionaryが必要なのか、セル範囲をまとめて配列にしとくのはだめなのか
なんて思ったりしますが まあそれは置いといて
 
Itemは配列にしたらどうですか? FGHならつながってるから。
 
 
Keyはただつなげないで間にTabとか入れとくと安全かも。

回答
投稿日時: 19/02/12 19:39:46
投稿者: WinArrow
投稿者のウェブサイトに移動

FILETUBE さんの引用:
WinArrowさん、回答ありがとうございました。
 
キーは連結しましたが、ITEMも連結するのでしょうか?
また元に戻す時は、分解になるのでしょうか?

 
ITEM項目って何?
 
キー値の対応したデータのこと?
 
元の戻すのはキー値ではなく、データの方でしょう。
ですから、分解できるように細工(工夫)することです。
例えば、vbTabのような文字列として使用しないコードを使えばよいでしょう。

回答
投稿日時: 19/02/12 19:59:18
投稿者: WinArrow
投稿者のウェブサイトに移動

ITEMの扱い方ヒント
 
Dim dic As Object, Rx As Long, wks As Worksheet, Var
 
    Set wks = ActiveSheet
    Set dic = CreateObject("Scripting.Dictionary")
     For Rx = 1 To 6
         If wks.Cells(Rx, "A").Value <> "" Then
            dic.Add wks.Cells(Rx, "A").Value & wks.Cells(Rx, "B").Value & _
                    wks.Cells(Rx, "C").Value & wks.Cells(Rx, "D").Value, wks.Cells(Rx, "F").Value & vbTab & wks.Cells(Rx, "G")
         End If
     Next
     Rx = 0
     For Each Var In dic
        Rx = Rx + 1
        wks.Cells(Rx, "K").Resize(, 2).Value = Split(dic.Item(Var), vbTab)
    Next

投稿日時: 19/02/12 21:24:16
投稿者: FILETUBE

回答ありがとうございました。
Itemはkeyに対応したデータ項目になります。
また、戻す項目もデータ項目になります。
 
セットの方はvbTabで連結はわかりました。
分解の方のsplitを調べてみます。

回答
投稿日時: 19/02/13 05:07:47
投稿者: mokutachi

Dictionary の必要性の疑問は残りますが
Item側がつながったセル範囲なら前にも書いたけどそのまま使えそうですが
 

 

    Dim ob As Object
    Dim i As Long
    Dim v As String
    
    Set dic = CreateObject("Scripting.Dictionary")
    
    For i = 1 To 10
        v = Join(Array(Cells(i, 1).Value, Cells(i, 2).Value, Cells(i, 3).Value), vbTab)
        dic(v) = Cells(i, 5).Resize(, 3).Value
    Next
    
    For i = 1 To 10
        v = Join(Array(Cells(i, 1).Value, Cells(i, 2).Value, Cells(i, 3).Value), vbTab)
        Cells(i, 10).Resize(, 3).Value = dic(v)
    Next

 
key列 ABC
Item列 EFG
復元列 JKL 

回答
投稿日時: 19/02/13 06:17:26
投稿者: simple

Join,Splitの活用については、既に指摘いただいたとおりと思います。
 
itemに、結果そのものをすべて保持する考えもありますが、
実際に必要になるのはkeyのうち一部などであれば、
必要になったときにシートから取得すればよいと考えて、
itemに行番号を保持しておくという考え方もありますね。
使用場面によりますけれども。
# いわば「遅延処理」的考え方ですね。

投稿日時: 19/02/13 12:59:52
投稿者: FILETUBE

回答ありがとうございます。
Joinも使ったことがありませんでした。
こちらも試してみます。
 
いろいろご指導ありがとうございます。