• ベストアンサー

ExcelVBA Select Caseについて

Select Case Cells(i, k) Case "" Case "AB","EF","G","IJ","K",,"LM","S","MNO","P","T","V","Z" 処理1 Case "CDE","H" 処理2 Case Else 処理3 End Select 上記の文字を条件にして処理を変えたいのですが、まったく同じ条件の分岐がマクロ上に数箇所あります(それぞれ処理は違います) コピーして貼り付けてしまえばいいのですが、見栄えが悪くなるし、訂正が発生したら直すのが大変だし、という状態です 最初に変数か何かに入れておいて、そこで比較できればかなりすっきりするのでは? と思いついたのですが、書き方が分かりません もしかしたら構文の関係で出来ないのかもしれませんが、できるとしたらかなりうれしいです 教えて下さい、よろしくお願いします

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 これは、Excel独特の方法ですが、以下のようにすればよいのではありませんか? ただし、これは、大文字・小文字の区別がありません。私は、以下のような使い方をして、モジュール間でも、利用できるようにしています。だったら、配列変数自体をグローバル変数にしたら良いとは思うかもしれませんが、壊れたことを考えると、以下のようなオトナシイ作り方が良いと思います。もちろん、しょせん、False, True を返すだけなら、自分でユーザー定義関数を作ってもよいと思います。もう少し、治まりのよいコードにはなると思います。 '------------------------------------------------------- '標準モジュール Public Const A As String = "AB,EF,G,IJ,K,LM,S,MNO,P,T,V,Z" Public Const B As String = "CDE,H" '------------------------------------------------------- '任意のモジュール Sub DiversedSelect()   Dim v As String   Dim i As Integer   Dim k As Integer   Dim arA As Variant   Dim arB As Variant   i = 1: k = 1   arA = Split(A, ",")   arB = Split(B, ",")   v = Cells(i, k).Value   If v = "" Then Exit Sub      If Not IsError(Application.Match(v, arA, 0)) Then     処理1   ElseIf Not IsError(Application.Match(v, arB, 0)) Then     処理2   Else     処理3   End If End Sub

jobvba
質問者

お礼

知らないコードが多々あります・・・ 勉強になります!回答ありがとうございました!

すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.3

文字と比較する部分を関数として分離して、 Private Function getOperationCode(s As String) Select Case s Case "" getOperationCode = 0 Case "AB", "EF", "G", "IJ", "K", "LM", "S", "MNO", "P", "T", "V", "Z" getOperationCode = 1 Case "CDE", "H" getOperationCode = 2 Case Else getOperationCode = 3 End Select End Function として、モジュール中では Select Case getOperationCode(Cells(i, k)) Case 1 処理1 Case 2 処理2 Case 3 処理3 End Select で処理するのはどうでしょうか? また、それぞれの処理がどのようなものかにもよりますが、処理を行う部分もサブルーチンにして、 Private Sub doOperation(commandCode As Integer, operationCode As Integer) ... End Sub として、モジュール中では doOperation 1, getOperation(Cells(i, k)) とか doOperation 2, getOperation(Cells(i, k)) として、commandCodeで指定した各々の処理を行うのはどうでしょうか? この場合、いっそ両方一緒にして doOperation 1, Cells(i, k) で、doOperation内でgetOperationCodeを呼ぶようにするというのもあるかと思います。 p.s. Select Case (InStr(",AB,EF,G,IJ,K,LM,S,MNO,P,T,V,Z,", "," & cells(i, k) & ",") > 0) * 2 + (InStr(",CDE,H,", "," & cells(i, k) & ",") > 0) * 1 + (cells(i, k) = "") * 3 + 3 Case 1 処理1 Case 2 処理2 Case 3 処理3 End Select と言うのだと1行で判断できます。 でも、かえって分かりにくくて意味がないのですが・・・

jobvba
質問者

お礼

回答ありがとうございました!

すると、全ての回答が全文表示されます。
  • FEX2053
  • ベストアンサー率37% (7995/21384)
回答No.1

そういうときの「サブルーチン」です。 http://www.tsucchy.com/Excel/vb5_3.html (中央やや下を見て下さい) 要するに、"select"部分を一つのプログラムにしてしまい、 それを、必要な場所で"call xx"として呼び出す方法です。

jobvba
質問者

お礼

サブルーチン化するのは思いつきませんでした・・・ 回答ありがとうございました!

すると、全ての回答が全文表示されます。

関連するQ&A