質問
定数配列の書き方
- 投稿日時:2005/06/28 09:55
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件)
- 最新から表示
- 回答順に表示
- ベストアンサーのみ表示
No.8ベストアンサー10pt
- 回答日時:2005/06/28 14:20
何度も恐縮です・・・。
どうしても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
- 回答日時:2005/06/28 14:04
今手元にVBの環境が無いので、コードサンプルはちょっと出せないんですが、VB6でもクラスを定義して、NEWで使うことはできたはずです。
この似非オブジェクト指向機能を使って、内部に配列を持ち、参照用のメソッド(Function)だけを定義したクラスを、プロジェクトメンバへ公開すれば、目的は達せられるかと思うんですが、これでは駄目ですかね。
どうしても配列として公開することがマストである場合は、どうしようもありませんが・・・。
この回答へのお礼
回答ありがとうございます。
自前でそれ用のクラスを用意するということでしょうか。
すみません。不要なクラスはなるべく使いたくないんです。
うーん、なんでCのように1行でズバッと書けないのかなぁ。。。
No.6
- 回答日時:2005/06/28 13:59
> 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
- 回答日時:2005/06/28 13:26
#2です。
配列の要素を定数として定義はできますが、配列そのものを書き換え不能にする事はできません。
JAVAと同じです・・・。
C/C++ならできますよね?(ポインタの受け渡しも含めて)
Rubyでも参照時のfreeze宣言ができます。
また.NETでも、Readonlyの構造体を宣言する事によって、同様の処理が可能です。
どうしてもVB6でやるなら、ユーザー定義構造体とゲッター用のメンバメソッドを作成すれば、同様の処理に近づくと思われます・・・。
配列の中の要素を書き換えるかどうかは、実装側の問題かと思いますが・・・。
あえて凍結させるメリット、必要性を感じられません・・・。
この回答へのお礼
再び回答ありがとうございます。
>どうしてもVB6でやるなら、ユーザー定義構造体とゲッター用のメンバメソッドを作成すれば、同様の処理に近づくと思われます・・・。
うーん、今回はそこまで凝る必要はないので、諦めます。
Const a() As String = Array("A", "B") のような感じで、ズバッ!と1行で、シンプル&スマートな書き方が欲しかったのです。
>あえて凍結させるメリット、必要性を感じられません・・・。
確かにメリット・必要性はないかもしれませんが、うちのプロジェクトはゴチャゴチャしてて、
自分が作ったソースをいろいろな人が勝手に触ってイジるため、「この値は変えるなよ!」っていうことを明確にして
物理的に編集できないようにしておきたかったんです。
(コメントで「触るな!」って書いておくのも不安だったもんで…)
No.4
- 回答日時:2005/06/28 13:05
おそらく、どの言語でも出来ない。
この回答へのお礼
回答ありがとうございます。
C言語の場合、次のようにしてできます。
const char *a[] = {"A", "B"};
VBでは何とかしてできないかと思って。
No.3ベストアンサー20pt
- 回答日時:2005/06/28 12:55
残念ですが、VBでご希望のことをすることはできません。
この回答へのお礼
回答ありがとうございます。
「無理」ってのを証明するのはなかなか難しいですが、pen_pen_penさんはVBに詳しそうですね。
pen_pen_penさんがそう仰るなら、やっぱり無理なのでしょうね。
残念!
No.2
- 回答日時:2005/06/28 11:19
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では無理なのでしょうか???
No.1
- 回答日時:2005/06/28 10:10
配列の定数定義は無理だったような気がします。
プロシージャ内で
Dim astrTest() As string = {"A", "B", "C"}
なら文法的にはOKだと思いますが質問者さんの
やりたいことと合ってるかは分かりません。。
この回答へのお礼
回答ありがとうございます。
プロシージャ内の書き方でOKなのですが、
上記の書き方も試したのですが、やはり構文エラーとなってしまいます。
上記の書き方はVBというよりも、Cの書き方ですよね。
やはりVBで定数配列を書くのは無理なのでしょうか???
このQ&Aを見た人はこんなQ&Aも見ています
- 4Excel-VBAの配列「Public Const」について
- 5動的配列が存在(要素が有る)か否かを判定できますか?
- 6EXCEL VBA で現在開いているブックのファイル名を取得する方法
- 7Excel VBA シート名をすべて取得し、一覧をシートに入力したい
- 8Excel(VBA)で配列の要素数を調べるには?
- 9VBAにて新規ブックへ既存シートのコピー
- 10VBAでの戻り値と引数について
- 11VBA オブジェクトが空かどうか判定する
- 12VBAの質問です 数値を文字列に
- 13VBA マクロ実行時エラー 1004
- 14VB上で実行中の無限ループの止め方
- 15Excel VBA コンボボックスの初期値の設定について
- 16エクセルVBAのIf,Then 構文でOr条件とAnd条件の結合方法?
- 17ExcelのVBAでフォルダ指定ができるダイアログボックスを出す方法
- 18エクセルVBA 「On Error GoTo 0」について
- 19EXCELの日付データを文字列に変換したい
- 20Excell VBA にて配列に定数を代入する方法
注目の記事
バレンタインQ&A集2013
初心者でも安心の手作りチョコレシピや男女で異なるバレンタインの本音など女性のお役立ち情報が満載です。
このQ&Aを見た人がよく見るQ&A
このカテゴリで人気のQ&Aランキング
- 4VBAにて新規ブックへ既存シート...
- 5VB上で実行中の無限ループの止め方
- 6VBAで別エクセルファイルから指定エ...
- 7Exel VBA 別ブックから該当データ...
- 8Sub ***( ) と Private Sub ***( ) ...
- 9テキスト氏名、日付とExcel表の連動
- 10TextBoxに半角数字のみの入力しかで...
- 11DoEvents関数って何?
- 12DataGridViewで、選択した行の値を...
- 13EXCELのVBAでRange("A1:C4")を変数...
- 14エクセルVBAでファイル・シート名を...
- 15VBA初心者の勉強法とお勧めの書籍
- 16MSDNとTechNetは何が違うのでし...
- 17他言語で言うcontinue文
- 18エクセル(Excel) ワイルドカード *...
- 19Functionの戻り値を配列にしたいの...
- 20マクロ セルの値に応じてセルに色を...