• ベストアンサー

定数配列の書き方

VB6で定数を定義する場合は次の通りです。   Const strTest As String = "TEST" では、定数配列を定義する場合はどのように書けばいいのでしょう?   Const astrTest() As String = Array("A", "B", "C")      '→NG   Const astrTest(0 To 2) As String = Array("A", "B", "C")  '→NG いろいろな書き方を試して見たのですが、上記のような書き方でも文法的にエラーになるようです。 どのように書けばいいのでしょうか? それとも定数を配列で定義するのは無理なんでしょうか?

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

  • ベストアンサー
回答No.3

残念ですが、VBでご希望のことをすることはできません。

typeman
質問者

お礼

回答ありがとうございます。 「無理」ってのを証明するのはなかなか難しいですが、pen_pen_penさんはVBに詳しそうですね。 pen_pen_penさんがそう仰るなら、やっぱり無理なのでしょうね。 残念!

その他の回答 (7)

回答No.8

何度も恐縮です・・・。 どうしてもArrayじゃないとダメなんでしょうか? Collectionを使用すれば参照のみ可能です。 例えば・・・、 dim co as new collection co.add "a" co.add "b" co.add "c" co.item(index)で参照可能。 co.item(index)="xxx"代入不可。 Arrayじゃないし、1行でズバッとという訳には行きませんが、 メンバメソッド定義したりするよりは楽・・・。

typeman
質問者

お礼

度々回答ありがとうございます。 先ほど、今回作るツールの仕様ボリュームが大幅に膨れ上がって、 6個ほどだった定数データがべらぼうになったので、 今回はtaka451213さんも仰っているコレクションなりディクショナリなどの データ構造で行くと思います。 ただ、定数を単体で定義できても、配列で定義できないのは、やはり最後まで「何で?」って感じが残りますね。 最後に、本質問に関する純粋で明快な回答は#3さんであろうと思われるので、良回答は#3さんにしたいと考えます。 皆さん、多くの代替案を提案して頂き、ありがとうございました。

  • you-m
  • ベストアンサー率58% (190/327)
回答No.7

今手元にVBの環境が無いので、コードサンプルはちょっと出せないんですが、VB6でもクラスを定義して、NEWで使うことはできたはずです。 この似非オブジェクト指向機能を使って、内部に配列を持ち、参照用のメソッド(Function)だけを定義したクラスを、プロジェクトメンバへ公開すれば、目的は達せられるかと思うんですが、これでは駄目ですかね。 どうしても配列として公開することがマストである場合は、どうしようもありませんが・・・。

typeman
質問者

お礼

回答ありがとうございます。 自前でそれ用のクラスを用意するということでしょうか。 すみません。不要なクラスはなるべく使いたくないんです。 うーん、なんでCのように1行でズバッと書けないのかなぁ。。。

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.6

> C言語の場合、次のようにしてできます。 > const char *a[] = {"A", "B"}; おっと。十数年もCをやってないので忘れていました。 そういえば、CからVBに転向したとき同様な疑問を持っていました。 VBで書けないので、冗長だけど関数にしています。 Public Function astrTest(byval n as integer) As String select case n case 0: astrTest = "A" case 1: astrTest = "B" case 2: astrTest = "C" end select end function       

typeman
質問者

お礼

回答ありがとうございます。 すみません。その方法はさすがにあまり美しくないですね(^^;;; でも呼び出し側から見ると、あたかも定数配列を参照しているのと全く変わりありませんね! やっぱり1行でズバッと書くということに拘ると、そんな書き方はなさそうですね。 ありがとうございました。

回答No.5

#2です。 配列の要素を定数として定義はできますが、配列そのものを書き換え不能にする事はできません。 JAVAと同じです・・・。 C/C++ならできますよね?(ポインタの受け渡しも含めて) Rubyでも参照時のfreeze宣言ができます。 また.NETでも、Readonlyの構造体を宣言する事によって、同様の処理が可能です。 どうしてもVB6でやるなら、ユーザー定義構造体とゲッター用のメンバメソッドを作成すれば、同様の処理に近づくと思われます・・・。 配列の中の要素を書き換えるかどうかは、実装側の問題かと思いますが・・・。 あえて凍結させるメリット、必要性を感じられません・・・。

typeman
質問者

お礼

再び回答ありがとうございます。 >どうしてもVB6でやるなら、ユーザー定義構造体とゲッター用のメンバメソッドを作成すれば、同様の処理に近づくと思われます・・・。 うーん、今回はそこまで凝る必要はないので、諦めます。 Const a() As String = Array("A", "B") のような感じで、ズバッ!と1行で、シンプル&スマートな書き方が欲しかったのです。 >あえて凍結させるメリット、必要性を感じられません・・・。 確かにメリット・必要性はないかもしれませんが、うちのプロジェクトはゴチャゴチャしてて、 自分が作ったソースをいろいろな人が勝手に触ってイジるため、「この値は変えるなよ!」っていうことを明確にして 物理的に編集できないようにしておきたかったんです。 (コメントで「触るな!」って書いておくのも不安だったもんで…)

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.4

おそらく、どの言語でも出来ない。

typeman
質問者

お礼

回答ありがとうございます。 C言語の場合、次のようにしてできます。 const char *a[] = {"A", "B"}; VBでは何とかしてできないかと思って。

回答No.2

Dim aaa aaa = Array("a", "b", "c", "d", "e", "f", "g")

typeman
質問者

お礼

回答ありがとうございます。 すみませんが、その書き方も違います。 それは定数配列ではなく、ふつうの変数配列ではないですか? Dim aaa aaa = Array("a", "b", "c", "d", "e", "f", "g") aaa(3) = "XXX" 上記のように3行目で値の書き換えができてはいけません。 上記でコンパイルすると、「コンパイルエラー:定数には値を代入できません。」と表示されないまま、 ふつうにコンパイルできてしまいます。 それではダメなのです。 すみません。 やはりVBでは無理なのでしょうか???

  • lasichi
  • ベストアンサー率31% (122/389)
回答No.1

配列の定数定義は無理だったような気がします。 プロシージャ内で Dim astrTest() As string = {"A", "B", "C"} なら文法的にはOKだと思いますが質問者さんの やりたいことと合ってるかは分かりません。。

typeman
質問者

お礼

回答ありがとうございます。 プロシージャ内の書き方でOKなのですが、 上記の書き方も試したのですが、やはり構文エラーとなってしまいます。 上記の書き方はVBというよりも、Cの書き方ですよね。 やはりVBで定数配列を書くのは無理なのでしょうか???

関連するQ&A

  • VBでの単純な質問!配列に定数を一発で入れる方法ありますか?

    単純な質問です。 Const B = "0123456789" ←定数 DIM A(10) AS String   ←配列 と言う定義に対して、 A = B と言った方法で、一発でデータをセットして各配列に、 以下のようなデータをセットしようと思っています。 A(0) = 0 A(1) = 1 A(2) = 2 A(3) = 3 A(4) = 4  ・  ・ A(9) = 9 他の言語では再定義などで可能ですが、 VBではいかにしてやるのでしょうか? 定数を個別に切り分けてセットするのが面倒くさいので、ご存知の方いらっしゃれば、宜しくお願いします。

  • VBのString型の配列をVCで受け取るには?

    VBでString型の配列として定義されている変数を VCのプログラムで受け取るにはどうすればよいのでしょうか? 試しにVBでString型の配列を作って DLLのC_TESTというファンクションを呼び出すという 処理を作ってみたのですが、コンパイルエラーになってしまいます。 なにかおかしいところありますか? そもそもVCにはString型ってないんですよね? プログラミング初心者ですので、変な言葉遣いに なってるかもしれませんが宜しくお願いします。 VB Declare Function C_TEST Lib "\test.dll" (ByVal data() As String) As Integer Dim A(1) As String dim rtn as Integer A(0)="あああ" A(1)="いいい" rtn= C_TEST(A) VCのプログラム int _stdcall C_TEST(LPSTR A[2] ){ AfxMessageBox( A[0] ); return(0); }

  • PHP5でクラス定数が使えますが

    PHP5でクラス定数が使えますが 以下のようにFで A + Eや A | Eなどとすると、 Parse errorとなります。 クラス定数は数値、文字列、配列のみで、組み合わせは不可という仕様で良いのでしょうか? PHP5の仕様書というものはネット上で存在しているのでしょうか? 英語でも構いませんので、ご存知の方教えてください。 class Test { const A=1; const B="2"; const C=array(3); const E=4; const F=A+E; // ここでエラー } この場合の対策ですが、素直にPHP4のように defineを使えば良いでしょうか?

    • ベストアンサー
    • PHP
  • VBAの配列

    VBAの配列の処理でこまっています。 dim test as Variant test = Array( _ Array("Aさん", 65, 70, 45), _ Array("Bさん", 80, 10, 90)) とした成績データがありまして、あとから(定義の段階でなく)、"Cさん", 70, 70, 75をtest変数に追加したい場合、どのようにすればよいのでしょうか? また、これ(test)を戻り値にした場合、正しく左辺値にはいるのでしょうか?オブジェクトの解放などの問題も知りたいです。 function seiseki () as variant ... 上の処理 seiseki = test end function ...  dim cp as Variant cp = seiseki() 'cp変数にコピーされるのでしょうか?

  • 配列のソートと削除

    String型のstrToRemoveで与えられた文字列を配列から探し、あればそれ以降の配列の数字をすべて左にシフトします。 なので配列の大きさは1小さくなります。その結果の配列をreturnで返します。 例) ({"A","B","C","D","B"}, "B")配列1にBがあるのでそれ以降の文字列をすべて左にシフト→ {"A","C","D","B"} ({"A","B","C","D","B"}, "A") 配列0にAがあるのでそれ以降の文字列を左にシフト→ {"B","C","D","B"} プログラムは以下のように組みました。 public class ArrayFun { public String[] oneRemoved(String[] array, String strToRemove) { int count = 0; for (int i = 0; i < array.length; i++) {      if (strToRemove.equals(array[i]) && count == 0) {        for (int j = i; j < array.length - 1; j++) {          array[j] = array[j + 1];        }          count++;      } }      array = new String[array.length - 1];      array[array.length - 1] = null;      return array; } } ちなみにcountは、一度シフトすればもう同じ文字列がそれ以降の配列にあってもシフトはしないので、countでシフトしたかどうかを判断しようと思い付けました。 これでテストメソッドも作るのですが、 import static org.junit.Assert.*; import org.junit.Test; public class ArrayFunTest { @Test public void testoneRemoved() { ArrayFun af = new ArrayFun(); String[] a1 = {"A","B","C","D","B" };//元の配列 String[] a2 = {"A","BB","CCC","DDD","B"};//元の配列 String[] a3 = {"B","C","D","B"};//シフト後の配列 String[] a4 = {"A","BB","CCC","DDD","B"};//シフト後の配列 assertEquals(a3, af.oneRemoved(a1, "A")); assertEquals(a4, af.oneRemoved(a2, "NotHere")); } } 以上のように組むと、assertEqualsの真ん中に黒線が入って自動的に@SuppressWarnings("deprecation")が加えられてしまいます。 実行結果は、({"A","B","C","D","B"}, "A") の例だと、配列0にB が入るはずがnullになっている、とエラーがでます。 どのようにしたら正常に動かせるでしょうか?宜しくお願いします。

    • ベストアンサー
    • Java
  • 多次元配列のカウント+1の仕方

    多次元配列のカウント+1の仕方 下記のような多次元配列(ちなみに、これって二次元配列ですか?)があるとき、 常に、「2列目の0がある数+1」を返すようにしたいのですが、 どうすればよいのでしょうか? $data[0][1]とか$data[1][1]とか$data[2][1]とかの意味です。 下記の例でいくと、2列目に0が3つあるので、数値の4を返したいのですが…、 ■$data 1,0,A1,B1,C1 2,0,A2,B2,C2 3,0,A3,B3,C3 4,2,A4,B4,C4 ■var_dump($data); array(4) { [0]=> array(5) { [0]=> string(1) "1" [1]=> string(1) "0" [2]=> string(2) "A1" [3]=> string(2) "B1" [4]=> string(2) "C1" } [1]=> array(5) { [0]=> string(1) "2" [1]=> string(1) "0" [2]=> string(2) "A2" [3]=> string(2) "B2" [4]=> string(2) "C2" } [2]=> array(5) { [0]=> string(1) "3" [1]=> string(1) "0" [2]=> string(2) "A3" [3]=> string(2) "B3" [4]=> string(2) "C3" } [3]=> array(5) { [0]=> string(1) "4" [1]=> string(1) "2" [2]=> string(2) "A4" [3]=> string(2) "B4" [4]=> string(2) "C4" } }

    • ベストアンサー
    • PHP
  • VBからDLLへ多次元配列を渡す/配列の添え字

    C++で作ったdllにVBAから配列を渡して、計算結果を再びVBAに戻して、アウトプットはVBAで、ということをしています。(経験豊富な方への相談です。) 具体的には、渡したい配列の先頭アドレスをlong型で記憶し、そのlong型の配列を受け渡ししています。 ただ、ご存知の方が多いかもしれませんが、VBAとC++では配列の添え字の順序が逆になっており、非常に面倒です。どういうことかといいますと、 Dim array(0 to 4, 0 to 9) as long をdllに渡し、array(2,6)を参照したい場合、C++では(Cでの配列名をc_arrayとし、これに先頭アドレスを入れると)、 c_array[(4+1)*6 + 2 ]; としなければならないと思います。これをプリプロセッサで #define C_ARRAY(a,b) c_array[(4+1)*b + a] としたらVBでの配列の感覚で扱えますが、この擬似配列C_ARRAY(a,b)を関数に渡すときなどは結局同じ混乱が再び生じることになってしまいます。 これを、何らかの方法で、簡潔に解決することはできないものでしょうか? VBA(エクセルを念頭においています)のほうで配列の添え字の順序をC++のそれに沿うように変更できたりしたら非常にうれしいですが、無理でしょうか?

  • Access VBA での配列

    Access VBAで下記のような配列(ジャグ配列?)を作りたいと考えています。 添字[0] = ("0A","0B","0C") 添字[1] = ("1A","1B","1C","1D") VB.NETでは下記のような感じで書けたと思います。 Dim strArray(1) As Object strArray(0) = New String(2) {"0A", "0B", "0C"} strArray(1) = New String(3) {"1A", "1B", "1C", "1D"} 分かりましたら是非教えてください。 お願いします。

  • Generic.Listに1次元配列の配列を格納したい(VB2005)

    VB2005の質問です。 変数ghogeにString型の1次元配列の配列を格納したいと考えています。 ----------------------------------------------- 'a) Dim hoge()() As string = _       {New string() {"a1", "b1", "c1"}, _       New string() {"a2", "b2", "c2"}, _       New string() {"a3", "b3", "c3"}} Dim ghoge As New Generic.List(of )   'b) MessageBox.Show(ghoge(1)(1))      ' "b2"と表示したい ----------------------------------------------- 質問内容は、(a)を(b)の初期値として設定するにはどのようにすればよいか、ということです。 (b)がGeneric.ListでなくArrayListの場合だと、   Dim ghoge As New ArrayList(hoge) でhoge配列を格納できますが、Generic.Listの場合はどのような構文にすればよいでしょうか。 現在は、下記のような処理でghogeに値を格納しています。 ------------------------------------------------------------ Dim ghoge As New Generic.List(Of Generic.List(Of String)) Dim aryhoge1 As New Generic.List(Of String)(New String() {"a1", "b1", "c1"}) Dim aryhoge2 As New Generic.List(Of String)(New String() {"a2", "b2", "c2"}) gary_hoge.Add(ary_hoge1) gary_hoge.Add(ary_hoge2) MessageBox.Show(gary_hoge(1)(1))    ' "b2"と表示される ------------------------------------------------------------ どうぞよろしくお願い致します。

  • PHPのクラスで定数配列を作りたい

    こんばんわ。 PHP5.6で勉強しています。5.6を選んだのは事例が多いと思ったからです。 文字列の定数配列が作れるならば、クラスの定数配列も作れるだろうと思っていましたが うまくできません。 イメージ的には以下のような感じです。 クラスで定数配列を作成することはできますでしようか? class AnimalItem { protected $_eng ; protected $_jpn ; protected $_deu ; function __construct( $eng, $jpn, $deu ) { $this->_eng = $eng ; $this->_jpn = $jpn ; $this->_deu = $deu ; } } class Foo { // const ANIMALS = array( 'dog', 'cat', 'bird'); const ANIMALS = array( new AnimalItem( 'dog', '犬', 'Hund' ) ,new AnimalItem( 'cat', '猫', 'Katze' ) ,new AnimalItem( 'bird', '鳥', 'Vogel' ) ); }

    • ベストアンサー
    • PHP

専門家に質問してみよう