質問

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

いろいろな書き方を試して見たのですが、上記のような書き方でも文法的にエラーになるようです。

どのように書けばいいのでしょうか?

それとも定数を配列で定義するのは無理なんでしょうか?

通報する

回答 (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行でズバッとという訳には行きませんが、
メンバメソッド定義したりするよりは楽・・・。

この回答へのお礼

度々回答ありがとうございます。
先ほど、今回作るツールの仕様ボリュームが大幅に膨れ上がって、
6個ほどだった定数データがべらぼうになったので、
今回はtaka451213さんも仰っているコレクションなりディクショナリなどの
データ構造で行くと思います。

ただ、定数を単体で定義できても、配列で定義できないのは、やはり最後まで「何で?」って感じが残りますね。

最後に、本質問に関する純粋で明快な回答は#3さんであろうと思われるので、良回答は#3さんにしたいと考えます。

皆さん、多くの代替案を提案して頂き、ありがとうございました。

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

どうしても配列として公開することがマストである場合は、どうしようもありませんが・・・。

この回答へのお礼

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

> 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
      

この回答へのお礼

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

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

配列の中の要素を書き換えるかどうかは、実装側の問題かと思いますが・・・。
あえて凍結させるメリット、必要性を感じられません・・・。

この回答へのお礼

再び回答ありがとうございます。

>どうしてもVB6でやるなら、ユーザー定義構造体とゲッター用のメンバメソッドを作成すれば、同様の処理に近づくと思われます・・・。
うーん、今回はそこまで凝る必要はないので、諦めます。
Const a() As String = Array("A", "B") のような感じで、ズバッ!と1行で、シンプル&スマートな書き方が欲しかったのです。

>あえて凍結させるメリット、必要性を感じられません・・・。
確かにメリット・必要性はないかもしれませんが、うちのプロジェクトはゴチャゴチャしてて、
自分が作ったソースをいろいろな人が勝手に触ってイジるため、「この値は変えるなよ!」っていうことを明確にして
物理的に編集できないようにしておきたかったんです。
(コメントで「触るな!」って書いておくのも不安だったもんで…)

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

この回答へのお礼

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

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

この回答へのお礼

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

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

この回答へのお礼

回答ありがとうございます。
すみませんが、その書き方も違います。
それは定数配列ではなく、ふつうの変数配列ではないですか?

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

上記のように3行目で値の書き換えができてはいけません。
上記でコンパイルすると、「コンパイルエラー:定数には値を代入できません。」と表示されないまま、
ふつうにコンパイルできてしまいます。
それではダメなのです。
すみません。
やはりVBでは無理なのでしょうか???

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

この回答へのお礼

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

このQ&Aは役に立ちましたか?19 件

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

新しく質問する

新しく質問する

このカテゴリで人気のQ&Aランキング