プロが教えるわが家の防犯対策術!

Excel2003 の VBA でクラスモジュールを作成しています。

Select Case文で Caseが多い場合にコードを短くするテクニックがありませんか。

Select Case i
  Case 1
    str = "momo"
  Case 2
    str = "sakura"
      ・
      ・
      ・
  Case 100
    str = "tsubaki"
End Select

のようなコードです。
配列に入れることも考えましたが、

str(1) = "momo"
str(2) = "sakura"
     ・
     ・
     ・
str(100) = "tsubaki"

となって、コードを短くする効果は僅かです。
クラスモジュールなので、ワークシートにデータを入れておくテクニックは使えません。
また、外部ファイル(*.txt など)も管理の面から使いたくありません。

クラスモジュール内だけで完結させるテクニックがないでしょうか。

A 回答 (6件)

何のためにコードを短くしたいのでしょうか?



例えば配列に入れたとすると、i の値に応じて1つの文字列が欲しいだけなのに
その前にすべてを配列に入れなければなりません。

一番速いのは最初の Select Case の形でしょう。

それでもコードを短くしたいというのなら、Array関数ですかね。

Str = Array("", "momo", "sakura" ・・・"tsubaki")(i)
    • good
    • 0
この回答へのお礼

ありがとうございます。
コード利用者から見れば、ファイルサイズは小さく(=コードは短く)、速いというのは重要ですね。
コード保守の面から見れば、コードは判りやすいのが重要。
両立させるのは、難しいですね。
スピードの比較もやってみます。

お礼日時:2011/11/23 11:09

masnoskeさん


こんにちは。

【クラスモジュール内だけで完結】は微妙ですが、管理上一番適しているのは、EXCEL表を使用します。

例えば管理用シート(名前は自由に)を作り、A1セルにmomo、A2セルにsakura……A100セルにtsubaki
と入力し、範囲(A1:A100)に名前をつけます。例えば【木】とします。

変数Iから、特定の木の種類を求める時は Range("木")(I) で求められます。
コードはすっきりするし、データの管理も表でわかりやすくなるかと思います。
※必要なら、管理シートを隠せばユーザからはわかりません。

ご検討ください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/11/23 14:59

strに代入する文字に,がないなら(,があるなら|等を利用する)


dim str as string
i = 2
としておくと
str = split("momo,sakura,・・・,,,,,tsubaki",",") (i)
で"sakura"が取れてしまうので、最も短いかなあと思いますが、
お薦めしません!
修正する必要がでたときにわからなくなるのがオチです。

他の方が書いておられるarrayを使う方法や質問文の方法(私もこちらが一番早いと思うが。)のほうが
いいです。

書いてあるメソッドの全体が俯瞰しにくいとかが質問の動機なら、
該当部分だけをfunctionにして、
str =funSetStr(i)
とかかいて、funSetStr()のほうに書けばいいだけです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/11/23 14:58

配列の要素番号と配列の値の対応を一致させたら仕舞いではないのか。


VBAではx=Array(””、"桃"、”桜",・・・)
これでstr=x(2)で"桜がStrに入るだろう..。
VBAでクラスモジュールなんて言う人が、こんなことを聞くなんて。
ーー
文字列が同じ長さなら、全部結合した文字列から、あり場所は番号で探せる。
ーー
あえて最大長に合わすすために後ろのスペースをいれる方法もある。その場合後尾のスペースは、Trimでけずれる。
x="momo sakura tsubaki・・・"(最大長を7と仮定)
2の分は Mid(x,(2-1)*7+1,7) で取れる。あとTrimをかます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/11/23 14:59

1) :を使って1行に何個も文を書く


 Select Case i:Case 1: str = "momo": Case 2: str = "sakura": .... : Case 100: str = "tsubaki": End Select
 行は短くなるけど、文字数としてはこっちの方が上か?

2) Array関数を使う
 str = Array("momo", "sakura", .... , "tubaki")

の2つが思いついたが、どっちもいまいちな感じですね。
    • good
    • 1
この回答へのお礼

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

お礼日時:2011/11/23 14:55

下記の方法もありますね。

すでにANo.1さんが書かれていますが。
定義部
Dim vrnArray As Variant
Dim i As Integer
Dim str As String
vrnArray = Array(, "A", "B", "C", "D", "E", _
"F", "G", "H", "I", "J")
実行部
str = vrnArray(i) 'iは1から
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/11/23 14:55

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