人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: kaiketsu
●カテゴリ:コンピュータ
✍キーワード:VBA キー 記述 連想配列
○ 状態 :終了
└ 回答数 : 4/5件

▽最新の回答へ

1 ● GreenStar
●27ポイント

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

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

◎質問者からの返答

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


2 ● GreenStar
●27ポイント

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

3 ● SALINGER
●26ポイント

この前の質問のような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/


4 ● robbie21
●10ポイント

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

'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/

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ