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も見ています
-
あるあるbotに投稿したけど採用されなかったあるある募集
あるあるbotに投稿したけど採用されなかったあるあるをこちらに投稿してください
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
VB6 配列を初期化したい
Visual Basic(VBA)
-
VB6でユーザー定義型がNothingかどうか調べるには?
Visual Basic(VBA)
-
VB6.0-整数と余りを求める
Visual Basic(VBA)
-
-
4
Excel-VBAの配列「Public Const」について
Visual Basic(VBA)
-
5
VBPをダブルクリックするとたまに「メソッドは失敗しました " オブジェクト」と出るのですが?
Visual Basic(VBA)
-
6
配列を関数に渡す方法
Visual Basic(VBA)
-
7
VB6とVB.NETでNullの扱いが違う?
Visual Basic(VBA)
-
8
Visual Basic 6.0 コンボボックスのChangeイベントが発生しません
Visual Basic(VBA)
-
9
VB6 String型変数の文字数制限
IT・エンジニアリング
-
10
VBの「As String * 128」とは?
Visual Basic(VBA)
-
11
VB6のメモリ解放に関して
Visual Basic(VBA)
-
12
VB6 開発環境のエディタに行番号を表示
Visual Basic(VBA)
-
13
VBのReturnの使い方
Visual Basic(VBA)
-
14
上下の位置揃えについて
Visual Basic(VBA)
-
15
構造体をコレクションに入れて扱いたいのですが…
コレクション
-
16
VB6.0のIsNull関数に相当するもの
Visual Basic(VBA)
-
17
構造体のコピー
Visual Basic(VBA)
-
18
フォーム間での変数の受け渡し
Visual Basic(VBA)
-
19
Form_Load と Form_Activate のタイミング
Visual Basic(VBA)
-
20
VisualBasic6.0のFormat関数でmSecを表示したい
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列のペースト出力結果の書式...
-
VBA 変数名に変数を使用したい。
-
配列をランダムに並び替えても...
-
Excelのメモリ(配列)の上限は2G...
-
Segmentation Fault (メモリ制限?)
-
EXCELを使って、アクセスログを...
-
二分探索について
-
Excel2010のinputboxで複数デー...
-
COBOLの基本的な事なので...
-
配列からのCSVファイルの作...
-
CheckBoxの配列化
-
配列の中から最大値だけ取り出...
-
VBAのワークシート関数で配列の...
-
構造体配列の一部初期化!!!
-
Redim とEraseの違いは?
-
Dir関数で読み取り順を操作でき...
-
手動または分散トランザクショ...
-
Excel VBAでフォルダ内の全テキ...
-
【C++/CLI】int型からString型...
-
Access 2010で実行時エラー3061
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
C#でbyte配列から画像を表示さ...
-
vba フィルター 複数条件 3つ以...
-
エクセルでXY座標に並べられた...
-
Dir関数で読み取り順を操作でき...
-
Excel2010のinputboxで複数デー...
-
構造体配列の特定のメンバーをF...
-
Redim とEraseの違いは?
-
配列のペースト出力結果の書式...
-
COBOLの基本的な事なので...
-
大量の変数を定義するにはどう...
-
DBから取得した値を配列へ代入する
-
EXCEL VBAの課題です
-
VBScriptでCSVファイルを読み出...
-
VBAでMODE関数をつくる
-
配列の中の最大値とそのインデ...
-
定数配列の書き方
-
構造体配列内の文字列検索のよ...
-
CheckBoxの配列化
-
Excelのメモリ(配列)の上限は2G...
おすすめ情報