VBA: Select Caseを短くしたい

このQ&Aのポイント
  • Excel2003のVBAでクラスモジュールを使用している場合、Select Case文でCaseが多い場合にコードを短くするテクニックをご紹介します。
  • 配列にデータを入れることや外部ファイルの使用を避けたい場合、クラスモジュール内で完結する方法があります。
  • この方法を使うと、コードを短くすることができます。
回答を見る
  • ベストアンサー

VBA: Select Caseを短くしたい

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 など)も管理の面から使いたくありません。 クラスモジュール内だけで完結させるテクニックがないでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • yorozu_ya
  • ベストアンサー率54% (76/140)
回答No.1

何のためにコードを短くしたいのでしょうか? 例えば配列に入れたとすると、i の値に応じて1つの文字列が欲しいだけなのに その前にすべてを配列に入れなければなりません。 一番速いのは最初の Select Case の形でしょう。 それでもコードを短くしたいというのなら、Array関数ですかね。 Str = Array("", "momo", "sakura" ・・・"tsubaki")(i)

masnoske
質問者

お礼

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

その他の回答 (5)

  • jcctaira
  • ベストアンサー率58% (119/204)
回答No.6

masnoskeさん こんにちは。 【クラスモジュール内だけで完結】は微妙ですが、管理上一番適しているのは、EXCEL表を使用します。 例えば管理用シート(名前は自由に)を作り、A1セルにmomo、A2セルにsakura……A100セルにtsubaki と入力し、範囲(A1:A100)に名前をつけます。例えば【木】とします。 変数Iから、特定の木の種類を求める時は Range("木")(I) で求められます。 コードはすっきりするし、データの管理も表でわかりやすくなるかと思います。 ※必要なら、管理シートを隠せばユーザからはわかりません。 ご検討ください。

masnoske
質問者

お礼

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

  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.5

strに代入する文字に,がないなら(,があるなら|等を利用する) dim str as string i = 2 としておくと str = split("momo,sakura,・・・,,,,,tsubaki",",") (i) で"sakura"が取れてしまうので、最も短いかなあと思いますが、 お薦めしません! 修正する必要がでたときにわからなくなるのがオチです。 他の方が書いておられるarrayを使う方法や質問文の方法(私もこちらが一番早いと思うが。)のほうが いいです。 書いてあるメソッドの全体が俯瞰しにくいとかが質問の動機なら、 該当部分だけをfunctionにして、 str =funSetStr(i) とかかいて、funSetStr()のほうに書けばいいだけです。

masnoske
質問者

お礼

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

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答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をかます。

masnoske
質問者

お礼

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

回答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つが思いついたが、どっちもいまいちな感じですね。

masnoske
質問者

お礼

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

  • samtomsan
  • ベストアンサー率55% (1060/1897)
回答No.2

下記の方法もありますね。すでに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から

masnoske
質問者

お礼

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

関連するQ&A

  • VBAクラスで、プロパティを使わずに、データを受け渡すには?

    はじめまして。 最近、クラスモジュールを使い始めたのですが、 別のクラスに、プロパティを使わずに、 データを受け渡すには、どうすればいいのでしょうか? たとえば、次の2つのクラスがあったとします。 (両方ともString型の読み取り専用のプロパティがある) 'クラスA Private m_Str_A as string Public Property Get Str_A() as String Str_A = m_Str_A End Property 'クラスB Private m_Str_B as string Public Property Get Str_B() as String Str_B = m_Str_B End Property ここで、クラスAで使用したm_Str_Aのデータを クラスBのm_Str_Bへ渡したいのですが、、、、。 別のプロパティを作ればいいだろうと考えたのですが、 それでは、値の変更が可能になってしまいます。 使用環境は、Excel2000 VBA、Windows2000です。 いろいろ調べてみたところ、他の言語か、VB.NETでない と無理そうなことが書かれていました。 仕事場では、他の言語は使用できないので、困ってます。 何か良い方法がありましたら、よろしくおねがいします。

  • クラスモジュールの使い方が詳しく書かれたVBAの本

    VBAを勉強中のものです。 クラスモジュールを使いこなせるようになりたいのですが それについてよく書かれている本はありますでしょうか? VBAの勉強している際に読む本は、標準モジュールにコードを記載するよう書かれています。 ご存知の方がいらっしゃいましたらご回答お願いします。

  • Excel VBA 配列について

    Excel VBA 配列について質問させてください。 画像のようなコードですと、ケース1では問題なく動くのですが、 ケース2になると「インデックスが有効範囲にありません」 ケース3になると「型が一致しません」 となります。 セル範囲を配列に入れ、取り出す方法(ケース2) カンマ区切りの数字を配列に入れ、取り出す方法(ケース3) を教えてください。 よろしくお願いします。

  • VBAもしくはVB6:クラスの中でクラスは使える?

    EXCEL2010にて、VBAでプログラミングしております。 クラスモジュールを用いてクラスを自分で作成して、 作成したクラスを標準モジュール内で使用するのは普通ですが、 クラスモジュールを用いてクラスを自分で作成して、 作成したクラスを、更に別のクラスモジュールの中に記述することは可能ですか? このようなクラスの中に別のクラスが入っている状態(クラスの入れ子)で、 まともに動くものでしょうか? 詳しい方、御教授よろしくお願いいたします。

  • Access SELECT INTO に関する質問です。

    Access SELECT INTO に関する質問です。 いつもお世話になっております。 Access 2002 VBAなのですが、 http://okwave.jp/qa/q4994969.html の内容にちなんだご質問です。 VBAで、SELECT INTO で作成したテーブルを そのままTransferSpreadsheetでExcelに吐き出したいと思っております。 しかし、TransferSpreadsheetでは引数にテーブル名しか指定できないため、 任意のソートがされていない状態でExcel出力されてしまいます。 なにか、任意のソートをした状態でExcel出力できる方法はありますか? TransferSpreadsheetでExcel出力した後、 Excel VBAコードを埋め込んで、Excelで並び替えを行うしかないのでしょうか? よろしくお願いいたします。

  • VBA case判定で

    Excel2010 Win7使用 VBA独学中の初心者です。 下記のcase判定でTrueなのに、Trueと判定してもらえません。 解決策を教えて頂けると助かります。 また、もっとスマートな方法があれば、 併せて教えて頂けると助かります。 例) hの中に"早い"という文字列がある場合  Case InStr(h, "早い") > 0 において、InStr=1が入っている場合でも Trueと判定されず、次のcaseに移行してしまいます。 Sub chg2() Dim r As Long Dim c As Long Dim day As Long Dim dc As Long Dim h As String day = Right(Range("S5"), 2) Select Case day Case 28 dc = 30 Case 29 dc = 31 Case 30 dc = 32 Case 31 dc = 33 End Select For r = 53 To Range("A52").End(xlDown).Row Step 2 For c = 3 To dc h = Cells(r, c) Select Case h Case InStr(h, "早い") > 0   h = Replace(h, "早い", "a")   Case InStr(h, "遅い") > 0 h = Replace(h, "遅い", "b")   ・   ・   ・  End Select Next c Next r End Sub

  • EXCEL2000(VBA) イベントの取得について

    EXCEL2000のVBAで多くのコマンドボタンを設置したのですが、 これは面倒だと思って、Collectionプロパティを使ってコード部では うまくボタンを配列で扱えるようになったのですが、問題はボタンが押された時のイベント時です。 VB6.0とかだとコマンドボタンのオブジェクト名自体に配列を付けることが出来て、 尚かつ、このボタンを押された時、配列の何番目のがクリックされたのかなど、 Private Sub xxxxx_Click(Index As Integer) のように出来たと思います。 VBA(EXCEL2000)でCollectionでとった配列の何番目のボタンを押されたなど、 配列の要素を取得することは可能でしょうか?

  • VBAでのマクロ削除

    複数のExcelファイルを読み込み必要なデータのみをsheet1に寄せ集め最後にExcel形式で保存するというコードを書きました。保存したExcelファイルは、次回同じVBAのコードからWorkbooks.Open Filenameで開く必要があるため、マクロを削除してから保存しないといけないことに気付きました。 ACompo = ExcelWorkbook1.VBProject.VBComponents.Item("module1") ExcelWorkbook1.VBProject.VBComponents.Remove (ACompo) 最終的にやりたいことは、3つのフォームと2つの標準モジュールを削除したい(ワークブックモジュールにもコード書いてありますのでそれも) ということになります。 よろしくお願いします。

  • Excel VBAでのコードの書き分け方

    Excel VBAについてご質問します。 プロジェクトの項目を見ると、 Sheet1 ThisWorkbook 標準モジュール などさまざまあると思います。 これらに対して、どこにコードを書いていくべきなのかがわかりません。 例えば、Sheet1にボタンを配置して、それがクリックされたときの動作についてはSheet1に書けばいいのだと思います。 ですが、いろんなシートのコード、フォームのコードなどから呼び出される関数はThisWorkbookか標準モジュールのどちらに書けばいいのか悩んでいます。 それ以外のケースも含めて、一般的にこういう風に使い分けをするというのがありましたら、ぜひ教えてください。 よろしくお願いいたします。

  • VBAでオブジェクトの配列の配列の削除をすると動作異常になります

    VBA(Excel2000)でオブジェクト指向のお勉強をしておりますが、ミスか言語仕様か分からないトラブルがあり、困っております。 簡単な碁(碁盤を再現し、活き死に程度を判定する)のプログラムを作成していますが、クラス石の配列であるクラス群を作成し、更にクラス群の配列を石の黒・白別に標準モジュールで定義しています。一塊の石の群が死んでいると判定した時、その群を削除しようとするのですが、redim preserve 群の配列(添字-一番最後の)を実行すると、群の配列全体にアクセスできなくなってしまいます。redimする前に、Nothingを代入するとか、もとの群(石の配列)にNothingを代入してからredimするとかしてみましたが、事態は変わりませんでした。 仕様なのか、勘違いしているのか、クラスの使い方が分かっていないのか..アドバイスお願いします。