• ベストアンサー

ExcelVBAでJavaのHashtableのような機能

ExcelVBAの初心者です。 VBAなどで、JavaのHashtableのクラスにあたるような機能は何かありますでしょうか。 redim Preserveなどで、追加することはできても、removeしたときに サイズがその分縮小されるような機能を実現したいのですが、 ご教授いただけますと幸いです。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

> このDictionaryをリストとして表示させたいのですが、 > JavaのListModelのようにデータの変更があるごとに > 項目が置き換わるようなことは可能でしょうか。 調べてみましたが、同じようなものは残念ながらないようです。 クラスを定義してwrappingするという手もExcel VBAだと使えないので さてどうしたものでしょうか。 無理やりですが、ひとつモジュールを割いて、そのモジュールのみで 辞書が見えるようにしておき、辞書に対する操作はそのモジュール 内の手続きを通して行うようにするというのはどうでしょうか? 自前で情報を管理することになりますが、更新を検知することは できますので、それで処理の引き金にすることはできるのではないかと。

tatapata
質問者

お礼

sakusaker7さん、ありがとうございました。 何とか教えていただいた既存の機能の中で、うまく立ち回って補いたいと思います。 今後も何かありましたら、よろしくお願いいたします。

その他の回答 (3)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

「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 メソッドを使います。

tatapata
質問者

補足

sakusaker7さん、ありがとうございます。 なんとか希望通りの動作をさせることができました。 さて、続いて質問させていただきたいのですが、 このDictionaryをリストとして表示させたいのですが、 JavaのListModelのようにデータの変更があるごとに 項目が置き換わるようなことは可能でしょうか。 重ねての質問で恐縮ですが、何卒お願いいたします。

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.2

再度の登場です。 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 ------------------------------------------------------- なぜ質問のようなことが必要なのか少し具体的に提示すると より的確な回答が寄せられると思います。  

tatapata
質問者

お礼

onlyromさん、ありがとうございました。 御礼が遅れてしまい、大変申し訳ありませんでした。 いただいた回答を元に、工夫してみたいと思います。 また何かありましたら、何卒よろしくお願いします。

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.1

こんにちは。 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 ---------------------------------------------------------------- 勘違いしてましたら平にご容赦願います。  

関連するQ&A