
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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 数式が消える 1 2023/03/19 16:55
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- Excel(エクセル) エクセルVBA、ファイル名をセルの値で保存の方法を教えてください。 おそれいります。こちらで数々のエ 6 2023/06/30 22:17
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) あるフォルダーのファイルを違う親フォルダーのサブフォルダーに移したい 11 2023/02/15 19:00
- Excel(エクセル) このコードに追記事項の仕方を教えて下さい。 以下のコード内容に出てくる。セルH3が空白の場合、エラー 4 2023/08/03 00:22
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Visual Basic(VBA) 【マクロ】フォルダにファイルが1つも無い時に、ファイルがありませんとメッセージを表示する 4 2022/08/28 08:48
このQ&Aを見た人はこんなQ&Aも見ています
-
VB6 配列を初期化したい
Visual Basic(VBA)
-
配列を関数に渡す方法
Visual Basic(VBA)
-
VBのFunctionで、配列を引数や返却値にできますか?
Visual Basic(VBA)
-
-
4
Form_Load と Form_Activate のタイミング
Visual Basic(VBA)
-
5
VB6でユーザー定義型がNothingかどうか調べるには?
Visual Basic(VBA)
-
6
CloseとDisposeの違い
Visual Basic(VBA)
-
7
【VB6.0】 あるフォームから他のフォームへ値を受け渡したい
Visual Basic(VBA)
-
8
VB6 String型変数の文字数制限
IT・エンジニアリング
-
9
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
10
モジュールとクラスの違いってなんなんですか?
Visual Basic(VBA)
-
11
色を定数にしたいのですが
Visual Basic(VBA)
-
12
VB6.0-整数と余りを求める
Visual Basic(VBA)
-
13
VBの「As String * 128」とは?
Visual Basic(VBA)
-
14
ウォッチ式の文字数制限について
Visual Basic(VBA)
-
15
Chr(13)とChr(10)の違いは?
PowerPoint(パワーポイント)
-
16
複数アドレスにメール送信した場合に、一つでも宛先アドレスが間違っていた
Yahoo!メール
-
17
Filter関数を用いた結果、何も検索されなかった場合
Visual Basic(VBA)
-
18
VB6.0で、DLLを動的に参照したい
Visual Basic(VBA)
-
19
VBのReturnの使い方
Visual Basic(VBA)
-
20
VB6で配列の最大値を簡単に求める。
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
vba フィルター 複数条件 3つ以...
-
C#でbyte配列から画像を表示さ...
-
構造体配列の特定のメンバーをF...
-
Dir関数で読み取り順を操作でき...
-
エクセルでXY座標に並べられた...
-
レコードセットの中身を配列に...
-
配列のペースト出力結果の書式...
-
POSTリクエストの投げ方
-
VBAで配列引数を値渡しできない...
-
定数配列の書き方
-
VBAのワークシート関数で配列の...
-
配列からのCSVファイルの作...
-
大量の変数を定義するにはどう...
-
CheckBoxの配列化
-
COBOLの基本的な事なので...
-
EXCELを使って、アクセスログを...
-
デバイスマネージャーの一覧取得
-
複数のtextboxの処理を一括で行...
-
エクセル(VBA)の空白配列の削除...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
vba フィルター 複数条件 3つ以...
-
C#でbyte配列から画像を表示さ...
-
配列の中の最大値とそのインデ...
-
エクセルでXY座標に並べられた...
-
Dir関数で読み取り順を操作でき...
-
配列のペースト出力結果の書式...
-
COBOLの基本的な事なので...
-
複数のtextboxの処理を一括で行...
-
構造体配列の特定のメンバーをF...
-
大量の変数を定義するにはどう...
-
CheckBoxの配列化
-
Excelのメモリ(配列)の上限は2G...
-
VB6のメモリ解放に関して
-
ReDim PreserveよりもReDimが遅い
-
Excel2010のinputboxで複数デー...
-
定数配列の書き方
-
コンボボックスのインデックス...
-
EXCELを使って、アクセスログを...
-
レコードセットの中身を配列に...
おすすめ情報