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 など)も管理の面から使いたくありません。
クラスモジュール内だけで完結させるテクニックがないでしょうか。
No.1ベストアンサー
- 回答日時:
何のためにコードを短くしたいのでしょうか?
例えば配列に入れたとすると、i の値に応じて1つの文字列が欲しいだけなのに
その前にすべてを配列に入れなければなりません。
一番速いのは最初の Select Case の形でしょう。
それでもコードを短くしたいというのなら、Array関数ですかね。
Str = Array("", "momo", "sakura" ・・・"tsubaki")(i)
ありがとうございます。
コード利用者から見れば、ファイルサイズは小さく(=コードは短く)、速いというのは重要ですね。
コード保守の面から見れば、コードは判りやすいのが重要。
両立させるのは、難しいですね。
スピードの比較もやってみます。
No.6
- 回答日時:
masnoskeさん
こんにちは。
【クラスモジュール内だけで完結】は微妙ですが、管理上一番適しているのは、EXCEL表を使用します。
例えば管理用シート(名前は自由に)を作り、A1セルにmomo、A2セルにsakura……A100セルにtsubaki
と入力し、範囲(A1:A100)に名前をつけます。例えば【木】とします。
変数Iから、特定の木の種類を求める時は Range("木")(I) で求められます。
コードはすっきりするし、データの管理も表でわかりやすくなるかと思います。
※必要なら、管理シートを隠せばユーザからはわかりません。
ご検討ください。
No.5
- 回答日時:
strに代入する文字に,がないなら(,があるなら|等を利用する)
dim str as string
i = 2
としておくと
str = split("momo,sakura,・・・,,,,,tsubaki",",") (i)
で"sakura"が取れてしまうので、最も短いかなあと思いますが、
お薦めしません!
修正する必要がでたときにわからなくなるのがオチです。
他の方が書いておられるarrayを使う方法や質問文の方法(私もこちらが一番早いと思うが。)のほうが
いいです。
書いてあるメソッドの全体が俯瞰しにくいとかが質問の動機なら、
該当部分だけをfunctionにして、
str =funSetStr(i)
とかかいて、funSetStr()のほうに書けばいいだけです。
No.4
- 回答日時:
配列の要素番号と配列の値の対応を一致させたら仕舞いではないのか。
VBAではx=Array(””、"桃"、”桜",・・・)
これでstr=x(2)で"桜がStrに入るだろう..。
VBAでクラスモジュールなんて言う人が、こんなことを聞くなんて。
ーー
文字列が同じ長さなら、全部結合した文字列から、あり場所は番号で探せる。
ーー
あえて最大長に合わすすために後ろのスペースをいれる方法もある。その場合後尾のスペースは、Trimでけずれる。
x="momo sakura tsubaki・・・"(最大長を7と仮定)
2の分は Mid(x,(2-1)*7+1,7) で取れる。あとTrimをかます。
No.3
- 回答日時:
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つが思いついたが、どっちもいまいちな感じですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- JavaScript 以前の質問だと、どの条件でも配列が表示されてしまいます。 1 2022/07/09 11:40
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- Visual Basic(VBA) いつもお世話になります 下記のコード実行すると エラーになります わかるかた教えてくれませんでしょう 6 2022/12/17 15:01
- Visual Basic(VBA) エクセルのVBAでダブルクリックでチェックを入れたあと 1 2022/10/26 20:30
- Visual Basic(VBA) select caseの入れ子 3 2023/03/08 18:48
- Visual Basic(VBA) ワークシートチェンジで曜日を表示する方法 1 2023/03/04 21:51
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Excel(エクセル) エクセルVBA Msgboxでの変数の活用 4 2023/07/23 08:33
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
C#でbyte配列から画像を表示さ...
-
vba フィルター 複数条件 3つ以...
-
エクセルでXY座標に並べられた...
-
定数配列の書き方
-
OutOfMemoryExceptionの回避策...
-
構造体配列の特定のメンバーをF...
-
画像ファイルを配列に格納する方法
-
配列の中の最大値とそのインデ...
-
Excel2010のinputboxで複数デー...
-
Dir関数で読み取り順を操作でき...
-
動的配列のメリット・デメリッ...
-
構造体配列内の文字列検索のよ...
-
エクセル VBA 変数を一括で宣言...
-
COBOLの基本的な事なので...
-
Excelマクロ:配列データからグ...
-
VB6で、一次元配列と二次元配列...
-
DBから取得した値を配列へ代入する
-
コンボボックスのインデックス...
-
VB.NETの配列にExcelから読み込...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
vba フィルター 複数条件 3つ以...
-
C#でbyte配列から画像を表示さ...
-
Excel2010のinputboxで複数デー...
-
エクセルでXY座標に並べられた...
-
構造体配列の特定のメンバーをF...
-
定数配列の書き方
-
コンボボックスのインデックス...
-
OutOfMemoryExceptionの回避策...
-
Dir関数で読み取り順を操作でき...
-
CheckBoxの配列化
-
構造体配列内の文字列検索のよ...
-
COBOLの基本的な事なので...
-
Redim とEraseの違いは?
-
VBAで配列引数を値渡しできない...
-
2次元配列の初期値
-
配列の中の最大値とそのインデ...
-
VB6からの移行したいけど、VB.N...
-
大量の変数を定義するにはどう...
-
VB6のメモリ解放に関して
おすすめ情報