- ベストアンサー
ExcelVBAでJavaのHashtableのような機能
ExcelVBAの初心者です。 VBAなどで、JavaのHashtableのクラスにあたるような機能は何かありますでしょうか。 redim Preserveなどで、追加することはできても、removeしたときに サイズがその分縮小されるような機能を実現したいのですが、 ご教授いただけますと幸いです。 よろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> このDictionaryをリストとして表示させたいのですが、 > JavaのListModelのようにデータの変更があるごとに > 項目が置き換わるようなことは可能でしょうか。 調べてみましたが、同じようなものは残念ながらないようです。 クラスを定義してwrappingするという手もExcel VBAだと使えないので さてどうしたものでしょうか。 無理やりですが、ひとつモジュールを割いて、そのモジュールのみで 辞書が見えるようにしておき、辞書に対する操作はそのモジュール 内の手続きを通して行うようにするというのはどうでしょうか? 自前で情報を管理することになりますが、更新を検知することは できますので、それで処理の引き金にすることはできるのではないかと。
その他の回答 (3)
- sakusaker7
- ベストアンサー率62% (800/1280)
「JavaのHashTable」のようなものということなら、こういうものがあります。 Dim vKey Dim sItem, sMsg Dim oDict Set oDict = CreateObject("Scripting.Dictionary") oDict.Add "One", "Engine" oDict.Add "Two", "Wheel" oDict.Add "Three", "Tire" oDict.Add "Four", "Spanner" For Each vKey in oDict sItem = oDict.Item(vKey) sMsg = sMsg & sItem & vbCrLf Next MsgBox sMsg 辞書から削除するには oDict.Remove "KEY" のように Remove メソッドを使います。
補足
sakusaker7さん、ありがとうございます。 なんとか希望通りの動作をさせることができました。 さて、続いて質問させていただきたいのですが、 このDictionaryをリストとして表示させたいのですが、 JavaのListModelのようにデータの変更があるごとに 項目が置き換わるようなことは可能でしょうか。 重ねての質問で恐縮ですが、何卒お願いいたします。
- onlyrom
- ベストアンサー率59% (228/384)
再度の登場です。 ReMoveメソッドを使うなら、Collectionオブジェクトもあります。 ----------------------------------------------------- Sub Test() Dim R, Msg Dim myCol As New Collection myCol.Add "AAA" myCol.Add "BBB" myCol.Add "CCC" Msg = Msg & myCol.Count & Chr(10) For Each R In myCol Msg = Msg & R & Chr(10) Next R myCol.Remove 2 '●2番目の要素”BBB”を削除 Msg = Msg & myCol.Count & Chr(10) For Each R In myCol Msg = Msg & R & Chr(10) Next R MsgBox Msg End Sub ------------------------------------------------------- なぜ質問のようなことが必要なのか少し具体的に提示すると より的確な回答が寄せられると思います。
お礼
onlyromさん、ありがとうございました。 御礼が遅れてしまい、大変申し訳ありませんでした。 いただいた回答を元に、工夫してみたいと思います。 また何かありましたら、何卒よろしくお願いします。
- onlyrom
- ベストアンサー率59% (228/384)
こんにちは。 Javaにはとんと無知ですが回答がないようなので。 >redim Preserveなどで、追加することはできても >removeしたときにサイズがその分縮小されるような機能を ReDimは配列変数に動的にメモリ領域の再割り当てを行うものですから 当然、増だけではなく、減もできるわけですよね。 ------------------------------------------------------- Sub Test() Dim Msg As String Dim R As Integer Dim N As Integer Dim myArray() N = 3 ReDim myArray(N) For R = 0 To N myArray(R) = R + 1000 Next R N = 5 ReDim Preserve myArray(N) For R = 4 To N myArray(R) = R + 5000 Next R '------------------------------ '配列を1つ少なくする N = N - 1 ReDim Preserve myArray(N) '------------------------------- For R = LBound(myArray) To UBound(myArray) Msg = Msg & R & " " & myArray(R) & Chr(10) Next R MsgBox Msg End Sub ---------------------------------------------------------------- 勘違いしてましたら平にご容赦願います。
お礼
sakusaker7さん、ありがとうございました。 何とか教えていただいた既存の機能の中で、うまく立ち回って補いたいと思います。 今後も何かありましたら、よろしくお願いいたします。