
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.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さんにしたいと考えます。
皆さん、多くの代替案を提案して頂き、ありがとうございました。
No.7
- 回答日時:
今手元にVBの環境が無いので、コードサンプルはちょっと出せないんですが、VB6でもクラスを定義して、NEWで使うことはできたはずです。
この似非オブジェクト指向機能を使って、内部に配列を持ち、参照用のメソッド(Function)だけを定義したクラスを、プロジェクトメンバへ公開すれば、目的は達せられるかと思うんですが、これでは駄目ですかね。
どうしても配列として公開することがマストである場合は、どうしようもありませんが・・・。
回答ありがとうございます。
自前でそれ用のクラスを用意するということでしょうか。
すみません。不要なクラスはなるべく使いたくないんです。
うーん、なんでCのように1行でズバッと書けないのかなぁ。。。
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
回答ありがとうございます。
すみません。その方法はさすがにあまり美しくないですね(^^;;;
でも呼び出し側から見ると、あたかも定数配列を参照しているのと全く変わりありませんね!
やっぱり1行でズバッと書くということに拘ると、そんな書き方はなさそうですね。
ありがとうございました。
No.5
- 回答日時:
#2です。
配列の要素を定数として定義はできますが、配列そのものを書き換え不能にする事はできません。
JAVAと同じです・・・。
C/C++ならできますよね?(ポインタの受け渡しも含めて)
Rubyでも参照時のfreeze宣言ができます。
また.NETでも、Readonlyの構造体を宣言する事によって、同様の処理が可能です。
どうしてもVB6でやるなら、ユーザー定義構造体とゲッター用のメンバメソッドを作成すれば、同様の処理に近づくと思われます・・・。
配列の中の要素を書き換えるかどうかは、実装側の問題かと思いますが・・・。
あえて凍結させるメリット、必要性を感じられません・・・。
再び回答ありがとうございます。
>どうしてもVB6でやるなら、ユーザー定義構造体とゲッター用のメンバメソッドを作成すれば、同様の処理に近づくと思われます・・・。
うーん、今回はそこまで凝る必要はないので、諦めます。
Const a() As String = Array("A", "B") のような感じで、ズバッ!と1行で、シンプル&スマートな書き方が欲しかったのです。
>あえて凍結させるメリット、必要性を感じられません・・・。
確かにメリット・必要性はないかもしれませんが、うちのプロジェクトはゴチャゴチャしてて、
自分が作ったソースをいろいろな人が勝手に触ってイジるため、「この値は変えるなよ!」っていうことを明確にして
物理的に編集できないようにしておきたかったんです。
(コメントで「触るな!」って書いておくのも不安だったもんで…)
No.2
- 回答日時:
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では無理なのでしょうか???
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
VB6 配列を初期化したい
Visual Basic(VBA)
-
配列を関数に渡す方法
Visual Basic(VBA)
-
Form_Load と Form_Activate のタイミング
Visual Basic(VBA)
-
-
4
VBのFunctionで、配列を引数や返却値にできますか?
Visual Basic(VBA)
-
5
VB6でユーザー定義型がNothingかどうか調べるには?
Visual Basic(VBA)
-
6
CloseとDisposeの違い
Visual Basic(VBA)
-
7
VBの「As String * 128」とは?
Visual Basic(VBA)
-
8
VB6で配列の最大値を簡単に求める。
Visual Basic(VBA)
-
9
モジュールとクラスの違いってなんなんですか?
Visual Basic(VBA)
-
10
VB6.0-整数と余りを求める
Visual Basic(VBA)
-
11
【VB6.0】 あるフォームから他のフォームへ値を受け渡したい
Visual Basic(VBA)
-
12
Filter関数を用いた結果、何も検索されなかった場合
Visual Basic(VBA)
-
13
VB6のプロジェクトロードエラーについて
Visual Basic(VBA)
-
14
VBのReturnの使い方
Visual Basic(VBA)
-
15
VB6 String型変数の文字数制限
IT・エンジニアリング
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【UWSC】URL内の数字部分を可変...
-
配列のペースト出力結果の書式...
-
コンボボックスのインデックス...
-
(STL) vectorとlistの違い
-
レコードセットの中身を配列に...
-
グラフの「項目軸ラベルに使用...
-
Segmentation Fault (メモリ制限?)
-
VBScriptでCSVファイルを読み出...
-
Redim とEraseの違いは?
-
複数のtextboxの処理を一括で行...
-
VBA 変数名に変数を使用したい。
-
ワークテーブルの作成について
-
非同期のプロセス間通信(パイプ...
-
XMLでデータとして画像を指定す...
-
2の補数の計算について
-
2つ目のレコードの値を取得す...
-
StrConvでUnicodeに変換出来な...
-
Accessで別mdbのテーブルをコピー
-
【C#】textBoxの指定行のデータ...
-
INT64対応のprintf系関数はあり...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
C#でbyte配列から画像を表示さ...
-
エクセルでXY座標に並べられた...
-
Dir関数で読み取り順を操作でき...
-
vba フィルター 複数条件 3つ以...
-
配列のペースト出力結果の書式...
-
複数のtextboxの処理を一括で行...
-
Excelのメモリ(配列)の上限は2G...
-
配列の中の最大値とそのインデ...
-
大量の変数を定義するにはどう...
-
Excel2010のinputboxで複数デー...
-
COBOLの基本的な事なので...
-
構造体配列内の文字列検索のよ...
-
VBAでMODE関数をつくる
-
Redim とEraseの違いは?
-
VBScriptでCSVファイルを読み出...
-
VB6のメモリ解放に関して
-
VB.NETの配列にExcelから読み込...
-
Segmentation Fault (メモリ制限?)
-
ActiveReports(アクティブレポ...
おすすめ情報