• ベストアンサー

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

  • ASPのReDim Preserveについて

    いつもお世話になります。 ASP(VBScript)で教えて頂きたいことがあります。 VBScriptにはJavaでいうArrayListのようなコレクション機能がないので、動的配列を実現するためには ReDim PreserveやScripting.Dictionaryを使用しなければなりませんよね。 そこで、DBから取得したレコードを、ループする度毎にReDim Preserveを使用し、データをセットするよう な実装をしていました。すると、ReDim Preserveは問題があるのでやめた方がよい、と言われました。 具体的には、ReDim Preserveをすることによって、新たに配列を作成し、古い内容をコピーするため、 倍々にメモリを食いつぶしていくことになり、それが大きくなるとどんどん遅くなっていき、そしてメモリリーク になる、ということでした。 自分なりに調べてみたのですが、そのような記事を見つけることができませんでしたし、JavaのArrayList でも内部的には配列を持っており、配列の再作成などをやっています。 ○○百万件などといった大量件数を扱う際は、それはメモリリークにならないような設計、実装をしなければ ならないとは思うのですが、それはどの言語でも共通で言えることであって、特別にVBScriptではやめた方がよい、 とは思えません。 ReDim Preserveを使用しても、先に述べたような認識をもっていれば問題ないと思うのですが、どうでしょうか。 VBScriptは、こういう仕組みだから駄目なんだ、という理由があるのでしょうか。もしあれば、根拠となる サイトなど教えて頂けると嬉しいのですが。。。 宜しくお願い致します。

  • ExcelVBAでPowerPointの操作

    表題の件、質問いたします。 Excelの機能である、マクロ記録を使用して PowerPoint(PPT)を操作してみたが、コードが残っているのは Excelで操作した内容のみとなってしまいます。 ExcelVBAでPPTにExcelグラフの貼り付けや、テキストを追加したいのですが どうやったらよろしいんですか? 参考にコードを記載して頂けると助かります。 それでは、皆様宜しくお願い致します。 ※VBA初心者ですので、易しい内容でお願いします。。。

  • 動的配列確保

    JAVA初心者です。 VBでのRedim Preserve、CのreallocみたいなものはJAVAには無いのでしょうか? 要はあらかじめ配列数がわかっていない時に動的配列確保を行いたいのです。 Objectではなく、基本クラスのint、byte等の配列に使いたいと思っております。 ArrayListが近い事が出来そうだったのですが、Objectにしか使用出来ないので、 断念しました。教えてください。

    • ベストアンサー
    • Java
  • NullPointerExceptionについて

    tomcatとeclipseでweb開発をする初心者っです。コンソールで以下のようなエラーが出るのですが、どういう対処すればよろしいのでしょうか?ご教授お願いします。 Error occurred during initialization of VM java.lang.NullPointerException at java.util.Hashtable.hash(Unknown Source) at java.util.Hashtable.remove(Unknown Source) at java.lang.System.initProperties(Native Method) at java.lang.System.initializeSystemClass(Unknown Source) 以上よろしくお願いします。

  • RubyでJavaのInterfaceに相当するものはありますか?

    RubyでJavaのInterfaceに相当するものはありますか? Ruby 上で Javaの interface のようなものものを実現するには、どうしたらよ いのでしょうか? Rubyは型を宣言しないので機能的には interface は不要ですが。 クラスを実装する人に、あるクラスに実装しなければいけないメソッドを伝える (強制する)目的としての interface 的な使い方をしたいのです。 宜しくお願いいたします。

  • Javaでは多重継承ができない、の意味が分からない

    「Javaでは多重継承ができない」「インターフェイスでは多重継承できる」の意味が分かりません。 「インターフェイス」の多重継承とは、あくまでも擬似多重継承であって、本当の多重継承とは機能が異なる、ということなのでしょうか? それとも、多重継承はあくまでもクラスに対して行う言葉であり、それをインターフェイスで実現しているから、擬似なのでしょうか? つまり、機能としては完全に多重継承と同一? あるいは、それ以外? インターフェイスで可能なら、Javaで多重継承ができないという表現はおかしいように思うのですが…。 例えば、Javaのクラスでは多重継承できない、という言い方だと、また違った意味になるのでしょうか?

    • ベストアンサー
    • Java
  • Java3D

    Java3DのAPIを使って作成されたプログラムを、修正、機能追加 しています。 自分は初心者で、API仕様をwebで探したりしているのですが、 英語だったり、難しすぎたりでわかりません。 入門となるような文献教えてください。 お願いします。

    • ベストアンサー
    • Java
  • javaがどうしてもインストールできません

    javaがどうしてもインストールできません 色々と検索し出来ることをやってみましたが(下記)どうしても【選択した機能は現在使用できないネットワークリソースにあります。 [OK]をクリックして再実行するか、インストールパッケージjre1.6.0_12.msiを含むフォルダに対する代替えパスを以下のボックスに入力します。】【Java(TM)6Update20の古いバージョンを削除することができません。 技術的に詳しい方にお問い合わせください。】の繰り返しです。 ・Windows Installer Clean UpをインストールしてJava Auto Updater2.0 2.1をRemoveする ・fire fox、Windowsブラウザにインストールされていたjavaをフォルダごと削除 ・jre-6u12-windows-i586-p.exeをインストールする ・fire fox削除→インストール ・javaオフラインをインストール(出来ませんでしたが・・・) どうしたらjavaをインストール出来るのでしょうか。 非常に困っております。どうか宜しくお願い致します。 OSはVistaです。 ちなみにプログラムの追加と削除にjavaはありません。

  • java アプリケーションをjava アプレットに

    java超初学者です。詳しいかたご教授願います。 java アプリケーションをjava アプレットに書き換えたいのですが、具体的にはどう書き換えを行ったらいいのか修正をお願いします。 (文字制限があるので、14個あるクラスファイルの中で(内1つはhtmlファイル)、メインメソッドを持つ実行クラスだけのせています。) Appletを継承させる、属性をメインクラスとコンストラクタはpublic にする、 mainメソッドを削除し、initメソッドへ書き換える、サイズ指定は<applet>タグで指定する。等調べましたが 具体的にわかりません。特にコンストラクタとメインメソッドの部分のアプレットへの書き換えがわかりませんでした。 宜しくお願い致します。 //実行クラスです。 import java.awt.*; import java.awt.event.*; /** *ゲームクラス(ここから始まる)<p> *画面の作成 */ public class Game extends Frame { /** * メインクラス */ public static void main(String args[]) { //フレームの作成 new Game(); } /** * 引数なしのコンストラクタ */ Game() { //*** ウィンドウの初期化 //タイトル super("Shooting Game"); //クローズボタンによる終了処理の実装 addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) { System.exit(0); } }); setSize(500, 500); //ウィンドウのサイズ //*** キャンバスの初期化 MyCanvas mc = new MyCanvas(); add(mc); //フレームにキャンバスを追加 setVisible(true); //ウィンドウの表示 //ゲームデータの初期化 mc.init(); //スレッドを作成 mc.initThread(); } }

  • VBAでオブジェクトの配列の配列の削除をすると動作異常になります

    VBA(Excel2000)でオブジェクト指向のお勉強をしておりますが、ミスか言語仕様か分からないトラブルがあり、困っております。 簡単な碁(碁盤を再現し、活き死に程度を判定する)のプログラムを作成していますが、クラス石の配列であるクラス群を作成し、更にクラス群の配列を石の黒・白別に標準モジュールで定義しています。一塊の石の群が死んでいると判定した時、その群を削除しようとするのですが、redim preserve 群の配列(添字-一番最後の)を実行すると、群の配列全体にアクセスできなくなってしまいます。redimする前に、Nothingを代入するとか、もとの群(石の配列)にNothingを代入してからredimするとかしてみましたが、事態は変わりませんでした。 仕様なのか、勘違いしているのか、クラスの使い方が分かっていないのか..アドバイスお願いします。

専門家に質問してみよう