VBA に関する質問です。あるrange (A5:B30)を指定して、A列をキー、B列を値にするような 連想配列(dictionaryobject)をつくりたいのです。簡単に取り込める方法はあるでしょうか? excel2003 です。直接指定するのは無理なら、range を上から順に処理する each 文みたいな記述を簡単にできないでしょうか? range の位置を取得して、どこまであるかをチェックして、for 文でまわすことはもちろんできるのですが、簡単に記述する方法があったら教えてください。

回答の条件
  • URL必須
  • 1人2回まで
  • 13歳以上
  • 登録:2010/03/13 19:54:38
  • 終了:2010/03/20 19:55:03

回答(5件)

id:GreenStar No.1

GreenStar回答回数192ベストアンサー獲得回数462010/03/13 20:20:28

ポイント27pt

残念ですが! Dictionaryのメソッドには一括代入がありません!!  無理です!!

http://msdn.microsoft.com/ja-jp/library/cc427974.aspx

id:kaiketsu

では、次善の策として、range を使って each 文みたいなので簡単化はできないでしょうか? 

2010/03/13 20:43:02
id:GreenStar No.2

GreenStar回答回数192ベストアンサー獲得回数462010/03/13 20:48:33

ポイント27pt

rangeとeachを使った例。重複を避けるための処理を削れば短くなりますが、それはケースバイケース。

http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_dictionary.ht...

Sub rei21_1()
 Dim myDic As Object, myKey
 Dim c, myVal
 Dim i As Long
 Set myDic = CreateObject("Scripting.Dictionary")
 ' ---(1)元データを配列に格納
 myVal = Range("A2", Range("A" & Rows.Count).End(xlUp)).Value
   ' ---(2)myDicへデータを格納
   For Each c In myVal
     If Not c = Empty Then
       If Not myDic.Exists(c) Then
         myDic.Add c, ""
       End If
     End If
   Next
   ' ---(3)Keyの書き出し
   myKey = myDic.Keys
   For i = 0 To myDic.Count - 1
     Cells(i + 2, 4) = myKey(i)
   Next i
 Set myDic = Nothing
End Sub
id:SALINGER No.3

SALINGER回答回数3430ベストアンサー獲得回数9692010/03/13 21:05:36

ポイント26pt

この前の質問のような1から始まるIDと名称の組み合わせならば出来ないことも無いです。

例えば、

    Dim myDic As Object
    Set myDic = CreateObject("Scripting.Dictionary")
    
    Set myDic = Range("B5:B30")

このようにするとキーは1から順に入るので、一括で入れることができます。

キーが連番ではない場合は素直にForNext(For Eachでも出来ないこともないが処理は変わらない)でよろしいかと思います。

http://q.hatena.ne.jp/

id:robbie21 No.4

robbie21回答回数34ベストアンサー獲得回数12010/03/15 05:41:14

ポイント10pt

以下の様な関数を作っておけばどうでしょうか。

'RangeToDictionary ----- Range から Dictionary を作成する
Function RangeToDictionary(r As Range)
    Dim Dic
    Set Dic = CreateObject("Scripting.Dictionary")
    Dim Pair As Range
    For Each Pair In r.Rows
        Dim Key As String
        Key = Pair.Cells(1, 1).Value
        Dim Val As String
        Val = Pair.Cells(1, 2).Value
        
        If Not Dic.Exists(Key) Then
            Dic.Add Key, Val
        End If
    Next
    Set RangeToDictionary = Dic
End Function

'RangeToDictionary の使い方サンプル
Sub testRangeToDic()
    Dim d
    Dim Target As Range
    Set Target = Range("A5:B30")
    
    Set d = RangeToDictionary(Target)
    '^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
    '値の確認
    Debug.Print d(Range("A5").Value)
    Debug.Print d(Range("A30").Value)

End Sub

---

URLはダミーです

http://www.cocoaliz.com/excelVBA/index/48/

質問者が未読の回答一覧

 回答者回答受取ベストアンサー回答時間
1 p332 36 33 3 2010-03-13 23:00:16
  • id:SALINGER
    私の回答は間違いですね。
    連想配列にはならないのでスルーしておいてくください。
  • id:robbie21
    上記robbie21の回答について補足
    Dictionary Objectのキーが数値だったり文字列だったりすると面倒(1と"1"が区別される)なので、文字列に統一して格納するコードになっています。
    なので、値を取り出すときもキーを文字列で与えないと失敗します。



    ちなみに連想配列は作らずに、Vlookup関数を使って直接値を取り出す方法も考えてみました。

    Sub testRLookup()
    Debug.Print RLookUp("A", Sheet1.Range("A5:B30"))
    Debug.Print RLookUp("X", Sheet1.Range("A5:B30"))
    End Sub

    Function RLookUp(Val, r)
    RLookUp = WorksheetFunction.VLookup(Val, r, 2, False)
    End Function

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません