• ベストアンサー

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 上記の文字を条件にして処理を変えたいのですが、まったく同じ条件の分岐がマクロ上に数箇所あります(それぞれ処理は違います) コピーして貼り付けてしまえばいいのですが、見栄えが悪くなるし、訂正が発生したら直すのが大変だし、という状態です 最初に変数か何かに入れておいて、そこで比較できればかなりすっきりするのでは? と思いついたのですが、書き方が分かりません もしかしたら構文の関係で出来ないのかもしれませんが、できるとしたらかなりうれしいです 教えて下さい、よろしくお願いします

  • jobvba
  • お礼率60% (166/274)

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

  • ベストアンサー
  • 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% (7987/21355)
回答No.1

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

jobvba
質問者

お礼

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

関連するQ&A

  • VBA Select Caseについて

    エクセルVBAでLike演算子とSelectCase構文を組み合わせたいのですが、以下ではエラーになってしまいます。 どう修正すればいいのでしょうか? ABCを含む文字列、DEFを含む文字列、その他、についての処理の分岐方法です。 Private Sub Worksheet_Change(ByVal Target As Range) Select Case Target.Value Case Like "*ABC*" `処理A Case Like "*DEF*" `処理B Case Else `処理C End Select End Sub

  • エクセルVBAでSelect...Caseの構文

    エクセルVBAで ■ Select...Caseの構文は、次(構文1)のようになっているとのことですが、 構文2のような、意味でネストして使う使い方は許されているのでしょうか。 (参考 QNo.1965604 の#7に,#8に関係したところをお聞きします。) (構文1) Select Case 変数  Case 値1    変数が値1の時の処理  Case 値2    変数が値2の時の処理  Case Else    他のCaseに合わない場合(その他)の処理 End Select (構文2) Select Case 変数a  Case 値1    変数aが値1の時の処理       Select Case 変数b            Case 値1            変数bが値1の時の処理            Case 値2            変数bが値2の時の処理       Case Else        変数bが、他のCaseに合わない場合(その他)の処理 End Select  Case 値2    変数aが値2の時の処理  Case Else    変数aが、他のCaseに合わない場合(その他)の処理 End Select

  • Select Case文でこのようなことは可能でしょうか?

    こんにちは。 「Select Case」の条件の一つに、文字列で○○を含むというのは指定できるのでしょうか? 例えば・・・ Select Case strName Case "ABC" 処理1 Case "D"を含む 処理2 Case Else 処理3 End Select 上記の様なことがしたいのですが、可能でしょうか? 可能でしたら、「"D"を含む」の部分はどのように書いたらいいですか?? 教えてください。宜しくお願いしますm(_ _)m

  • Select Case について

    Sub dummy() Dim Dummy As Worksheet Dim SheetName As String Dim i As Integer Dim GEN As Long Dim OTA As Long With Sheets("入力") '3行目~22行目まで For i = 3 To 22 SheetName = Sheets("入力").Range("D3").Value On Error Resume Next Set Dummy = Sheets(SheetName) 'もしシートがあれば・・・ If Err.Number = 0 Then Select Case .Cells(i, 14).Value Case "TK-001" OTA = Sheets("TK-001").Range("B65536").End(xlUp).Row + 1 Sheets("TK-001").Range("B" & OTA).Value = .Cells(i, "H").Value Sheets("TK-001").Range("I" & OTA).Value = .Cells(i, "I").Value Sheets("TK-001").Range("F" & OTA).Value = .Cells(i, "K").Value Sheets("TK-001").Range("G" & OTA).Value = .Cells(i, "L").Value Sheets("TK-001").Range("J" & OTA).Value = .Cells(i, "M").Value End Select 'シートが無ければ・・・ Else '原紙をコピーする Sheets("原紙").Copy BEFORE:=Sheets(1) 'シートの名前を市場コードにする Sheets(1).Name = SheetName End If Next End With On Error GoTo 0 End Sub 上記の通りマクロを組みましたが、以下の事を行うのに悩んでいます。 (1)Select Case が100通りあるのですが、全てCaseを入れるのではなく  もっと簡単な方法はありますか?  ※『リスト』シートを作っており、B1~B100までcaseになるコードが入力されています。  例:   B    1  TK-001    2  TK-002    3  TK-003        ・        ・        ・   100   TK-100 というシートを作っています。 (2)今のマクロではどんな値でもシートがなければシートを作ってしまう状態ですが、  もし『リスト』シートの中に値があればシートを作る、無ければ作らないというマクロは可能ですか  

  • エクセルVBAの Select Case構文

    Range("A1")に数式が入っています。 Select Caseで エラーだった場合 計算結果が正数だった場合 計算結果が負数だった場合 計算結果が"特定の文字"だったばあい その他 で分岐したいのですが、どのように記述すればよいのでしょうか? 以下、わたしの失敗例です。AAAでもプラスと出てしまいます。エラー値の判別がわかりません。 Sub TEST() Select Case Cells(1, 1) Case Is > 1: MsgBox "プラス" Case Is < 0: MsgBox "マイナス!" Case "AAA": MsgBox "AAA" Case Else: MsgBox "やり直し" End Select End Sub

  • excel マクロ 「select case」への条件盛り込み方法について

    初めまして。 仕事にて、EXCELに工程遅延の原因を記入しているのですが、 同じ理由(約50種類あります)を何度も記入する必要があるため、 理由ごとに番号を割り振って、ボタン一つで記入できるようにしたいと思っています。 そこで、下記のようにマクロを作成してみたのですが、 現状では、例えばCells(1, 1)に何かを特記していた場合、 記入後にこのマクロを実行してしまうと、Cells(1, 1)の特記が、 上書きにより消えてしまいます。 そこで、Cells(num, 1)が空白であれば、Cells(num, 1)に上書きする、 という条件を付加したいのですが、可能でしょうか。 EXCELマクロの本を参考に作成しているのですが、 組み合わせの方法が分かりません。 お時間がある方いらっしゃいましたら、 ご検討よろしくお願い致します。 Sub 理由挿入() Dim num As Integer For num = 1 To 100 Select Case Cells(num, 2).Value Case 1 Cells(num, 1).Value = "理由1" Case 2 Cells(num, 1).Value = "理由2" Case 3 Cells(num, 1).Value = "理由3" Case 4 Cells(num, 1).Value = "理由4" End Select Next End Sub

  • エクセル マクロ CASEの使い方

    超初心者です。よろしくお願いします。 以前にこのような使い方を教わりました。 Sub test1() Select Case Cells(ActiveCell.Row, "b").Value Case "夏" test2 Case "冬" test3 End Select End Sub 夏と冬で条件を分けているのですが、これを変えて Cells(ActiveCell.Row, "b").Value が空白じゃないときにtest2を実行して空白のときにtest3を実行するためにはどのように書いたら良いですか?

  • VB6 case文について

    select case a case "1" and "2"    処理 case "3"    処理 end select という記述が出来るのですが、case "1" and "2" という記述は 変数a の値がどうなったとき条件をみたすのでしょうか? 初心者でして小も無い質問かもしれませんがよろしくお願いいたします。

  • GoTo文とかSelect文の処理の仕方に関して

    Excel VBAに関しての質問です。 コードを書いていてGoTo文とかSelect Case文を使いますが、 例えば、GoTo文で飛ばされた間のコードは処理時間に影響するのでしょうか? また、Select Case文で該当しなかった命令文は処理時間に影響するのでしょうか?? 以下の命令文があります。 Sub TEST() Dim A As Long For i = 1 To 10 Cells(i, 1) = A A = A + 1 Next i GoTo B For i = 1 To 10 Cells(i, 2) = A A = A + "あ" Next i B: End Sub これ、GoTo文で飛ばさないと、「型がちがうよ!」って怒られてしまいます。 (もちろん、例えとしてで、こんなコードは、いまでは書かなくなりましたが(汗)) ということは、GoTo文で飛ばされたコードはシングルクォーテーションで くくられたことと同じになるんでしょうか? GoTo B 'For i = 1 To 10 'Cells(i, 2) = A 'A = A + "あ" 'Next i B: そもそも私のイメージでは、シングルクォーテーションで囲まれた範囲は、 演算処理とは関係なく無視されるみたいにイメージしていたんですけど、 いくら、シングルクォーテーションで囲んだとしても、その範囲が膨大に大きく多い文字数だと、 やっぱり処理時間に影響するものなのでしょうか?? Select Case文を使うときに、 Select Case 条件式 Case 条件1 すんごく長いコード Case 条件2 すんごく長いコード ・ ・ ・ End Select って、続くとします。 条件に一致していないところは演算処理に影響を及ぼさないのでしょうか?? もちろん、長いコードを書けば、ファイルのサイズは大きくなるでしょうが、演算処理の速さに影響するものなのかな??ってのがとても気になりました。 ご存じの方おりましたら、ご指南くださいませ。 ちなみに、私はまだVBAを勉強し始めてまだ間もない若輩者でして、GoTo文などは、とりあえず「ここ要らないかも」って思ったところに使用するくらいで、高度な使用の仕方はしておりません。 それと、私はExel VBAしかプログラミング言語を知らないので、VBAではこうだけど、別の言語の似た命令だと、影響したり、しなかったり。。。するよ。みたいなお話も聞けたら幸いです。 どうぞ、よろしくお願いいたします。

  • エクセル VBA Select case の繰り返し処理

    エクセル VBA Select case の繰り返し処理がうまくいきません。 セルB5に条件となる文字列(AAA、BBB、CCC...)があり、 セルC5にAAAなら10、BBBなら20、CCCなら30といった具合に出力し、 セルB6⇒C6、B7⇒C8と順々にセルB50⇒C50まで続けて処理したいのですがどのように対処すればよろしいでしょうか? For~Nextを使って繰り返し処理したいのですが、お分かりの方がいればご教授のほどよろしくお願いします。

専門家に質問してみよう