[[20170509130254]] 『Dictionary』(xy) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『Dictionary』(xy)

[[20170508211130]] のマナさんのマクロを Dictionaryを使用すると

 どのようなマクロで書くのでしょうか

< 使用 Excel:unknown、使用 OS:unknown >


 >Dictionaryを使用すると 

 私は、その必要性を余り感じないのですが、
 Dictionaryを使用した例が知りたい理由を教えて頂けませんか?

 それによって書き方も違ってくるような気がします。 
 (兎に角、使えばいいってものでもないですよね?)

(半平太) 2017/05/09(火) 13:33


Scripting.Dictionaryを使うと、キーとアイテムという2つの情報を紐付けられます。例えば、子の名前をキーとし、親の名前をアイテムにすると、子の名前から親の名前を、ループ処理無しで一発で得られるようになります。

ですが、リンク先の例では、親の名前に対する子の名前を列挙、というケースですよね。これだと、親の名前をキーにすれば?、と思うかも知れませんが、キーは重複してはいけない原則があるので、そういう使い方はできません。なので、Dictionaryを使うのは逆効果であり、考えるだけ無駄、という事になります。
(???) 2017/05/09(火) 14:05


考え直すと、子の名前は全く辞書化には使わず、親の名前と転記した行番号で辞書1。親の名前と子の人数で辞書2。
こういう構成にして、元データ数分ループしながら親と子の名前を別シートに代入しつつ、以下の処理にすれば、辞書を有効利用できそうです。どんなマクロを書けば良いのかは、ご自身でやってみるべき。

・既存の親なら、得られた行位置を利用。子の人数を+1。
・新規の親なら、最終行に+1してから、両方の辞書に1項目追加。
(???) 2017/05/09(火) 15:02


 半平太様、???様
 たいへん失礼しました。
 (マナ)さんのマクロを例題として、Dictionaryを理解しようと思いました。
 失礼しました。
(xy) 2017/05/09(火) 15:35

 >(マナ)さんのマクロを例題として、Dictionaryを理解しようと思いました。

 そこなんですけど、何故この例題にDictionaryが使えそうと思ったのですか?
  それが肝心なんですけど。

 一般論としては、Dictionary はアッチコッチにあるキーを統合して処理するのが得意技ですよね?
 しかし、くだんの例題は、既にキー(=整理番号)が一塊になってるんですから、名寄せの必要はないですよね?

 そちらの動機が見えなければ、こちらも(目標が見えていないのですから)アイデアを出しようもないです。
 今回、フリガナ問題および異なった家族構成の問題を孕んでいますので、
 多分、そこに絡めた動機をお聞かせいただけるのかなと思っています。

(半平太) 2017/05/09(火) 16:35


>何故この例題にDictionaryが使えそうと思ったのですか?

たぶん、カリーニンさんが引用された [[20170326090845]] 
で、βさんが、Dictionaryを使ったコードを提示されていたからかも。
深い意味はなく、Dictionaryの勉強でしょうか?

こんな感じで、使ってみました。

 Option Explicit

 Sub test()
    Dim dic As Object
    Dim c As Range
    Dim n As Long
    Dim m As Long

    Set dic = CreateObject("scripting.dictionary")

    For Each c In Range("A2", Range("A" & Rows.Count).End(xlUp))
        n = c.Value
        If Not dic.exists(n) Then
            Set dic(n) = c.Offset(, 2)
        Else
            Set dic(n) = Union(dic(n), c.Offset(, 2))
        End If
    Next

    Range ("E1"), CurrentRegion.ClearContents
    Columns("A:B").Copy Range("E1")
    Columns("E:F").RemoveDuplicates Columns:=1

    For Each c In Range("E2", Range("E" & Rows.Count).End(xlUp))
        n = c.Value
        dic(n).Copy
        c.Offset(, 2).PasteSpecial Transpose:=True
        m = WorksheetFunction.Max(m, dic(n).Count)
    Next

    With Range("G1")
        .Value = "子1"
        .AutoFill .Resize(, m)
    End With

 End Sub

(マナ) 2017/05/09(火) 19:58


半平太様
>多分、そこに絡めた動機をお聞かせいただけるのかなと思っています
すみません。私は(ぐらたん)さんでありませんので・・

マナ様
私なりに みなおしてみました。
ありがとうございました。

お二人のご親切な対応に感謝します。
(xy) 2017/05/10(水) 14:36


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.