• ベストアンサー

case文以外の方法について

Excelのマクロについて質問です。 今select caseを使用してマクロを組んでおります。 Select Case Range("a1").Value   Case "登録" or "追加"     Range("b1").Value = "1" End Select 上記のような感じにしておりますが、caseの条件式の部分が 長くなりそうなので、リストを見てフラグをたてるような感じに したいのですが、何かいい方法はないでしょうか。

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

  • ベストアンサー
  • ASIMOV
  • ベストアンサー率41% (982/2351)
回答No.3

ちょっと、というか、かなりトリッキーな方法ですが --------------------------------------------- Sub Ts()  S = "登録追加削除更新"  A = Left(Range("A1").Value, 2)  Range("B1").Value = (1 + InStr(S, A)) / 2 End Sub --------------------------------------------- 比較する文字列を全部つないで一つの文字列にしてしまい A1の文字と比較し、何番目に有るかで、数値に変換してしまいます

chirorin22
質問者

補足

情報ありがとうございます。 上のをちょっとカスタマイズしてみて動かしてみましたが、 結論、case文に似てますので、どうしようかと思ってます。 別シートにリストを作成してそこからひっぱりだすことも 考えてます。

その他の回答 (4)

noname#223623
noname#223623
回答No.5

Collectionオブジェクトを使う方法。Excelを使えない環境で投稿してるので、動作検証ができません。おおむね合ってると思いますがエラーが出たらごめんなさい。Excelのバージョンによっても書き方が変わるかもしれないのでWebで検索するか、ヘルプで確認してください。  Dim col As Collection  Set col = New Collection    ' 「col.Add Item, Key」と書くとcolに要素を追加できる  ' ItemはRange("b1").Valueに代入する値  ' KeyはRange("a1").Valueから取得できる文字列  col.Add "1", "登録"  col.Add "1", "追加"  col.Add "2", "削除"  col.Add "3", "更新"    ' colから値を取得してB1セルに代入する  Range("b1").Value = col(Range("a1").Value) この書き方は、どの条件の処理もB1セルへの代入だからできることです。#4さんのおっしゃるように、処理が違うならCase文を重ねるのも仕方ないかもしれません。

参考URL:
http://www.moug.net/tech/exvba/0150076.htm
chirorin22
質問者

お礼

URLなどありがとうございます。 結論からだとやはりcase文で考えられるパターンを追加していくしか なさそうですね..

  • rivoisu
  • ベストアンサー率36% (97/264)
回答No.4

Caseで該当したときの処理が規則性がある(ほとんど同じで対象セルだけが違うなど)ならば条件と対象とを一覧表にしてVlookupなどを使うことはできますが、処理が大きく異なれば地道にCase文を連ねるしかないでしょう。 該当したときの処理をうまく汎用化できれば短くすることも可能な場合が多い。

chirorin22
質問者

お礼

情報ありがとうございます。 case文しかなさそうですが、 別シートにリスト作ってそこからひっぱってくるような 感じなのを作ろうかとちょっと思ってます。

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.2

たとえばD列に条件を入れておいて For i = 1 To Range("D" & Rows.Count).End(xlUp).Row Select Case Range("a1").Value Case Range("D" & i).Value Range("b1").Value = "1" Exit For End Select Next i というのはいかがですか

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

if 変数 = "条件1" then ’条件1の処理 elseif 変数 = "条件2" then ’条件2の処理 elseif 変数 = "条件3" then ’条件3の処理   (中略) elseif 変数 = "条件n" then ’条件nの処理 else 'どれでもなかった end if という書き方はありますが、結局列挙です。 >  Case "登録" or "追加" いくつ位を想定されてます? 想定させるCASEを配列に入れておいて、FOR文で比較しては?

chirorin22
質問者

補足

指摘ありがとうございます。 一部を載せてしまったので申し訳なかったのですが、 for文も考えました。 ちょっと考えてみます。

関連するQ&A

  • select case文について

    リストから選択とリストに無い値の入力のリストへの追加をしたく、あちこちの情報をつぎはぎで下記のようにVBAで動かそうとしましたが、うまく動いてくれません。 前(Case A)は動くのですが、あと(Case 2)が機能しません。 それと、3つ以上をSelectCaseで組む場合の方法も合わせてお願いします。 Private Sub Worksheet_Change(ByVal Target As Range) Dim c As Range Dim LastR As Long Select Case Target.Address(0, 0) Application.EnableEvents = False Case "D1" With Worksheets("Sheet2") LastR = .Range("A36636").End(xlUp).Row Set c = .Range("A1:A" & LastR).Find( _ Target.Value, , xlValues, xlWhole, xlByColumns, xlPrevious, True) If c Is Nothing Then If vbNo = MsgBox("リストに追加しますか?", _ vbYesNo, "追加の確認") Then Application.EnableEvents = True Exit Sub End If .Range("A" & LastR + 1).Value = Target.Value .Range("A1:A" & LastR + 1).Name = "リストA" End If With Target.Validation .Delete .Add Type:=xlValidateList, Formula1:="=リストA" .ShowError = False End With Case "E1" With Worksheets("Sheet2") Set c = .Range("B1:B" & LastR).Find( _ Target.Value, , xlValues, xlWhole, xlByColumns, xlPrevious, True) If c Is Nothing Then If vbNo = MsgBox("リストに追加しますか?", _ vbYesNo, "追加の確認") Then Application.EnableEvents = True Exit Sub End If .Range("B" & LastR + 1).Value = Target.Value .Range("B1:B" & LastR + 1).Name = "リストB" End If End Select End With With Target.Validation .Delete .Add Type:=xlValidateList, Formula1:="=リストB" .ShowError = False End With Application.EnableEvents = True End Sub

  • Select Case の条件式

    VBAの初心者です。 家計簿の品目に対して値段を自動で入力したいです。 以下のように、Select Case の条件式の指定方法で、 列に入力された文字列の条件に対して、 自動でとなりのセルに入力したいのですが解らなくて困っております。 Sub TEST() ' A列セルの条件(文字列)でとなりのセルに文字列を入れたい Select Case Range("A1").Value 'A1をどうすればいいのでしょうか。 Case "a": Range("列のセルのとなりに入力したい").Value = "リンゴ" Case "o": Range("列のセルのとなりに入力したい").Value = "オレンジ" Case "b": Range("列のセルのとなりに入力したい").Value = "バナナ" Case Else: Range("列のセルのとなりに入力したい").Value = "error" End Select End Sub ご存じの方がおられましたら教えていただけませんでしょうか。 よろしくお願いします。

  • 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)今のマクロではどんな値でもシートがなければシートを作ってしまう状態ですが、  もし『リスト』シートの中に値があればシートを作る、無ければ作らないというマクロは可能ですか  

  • エクセルの select case文

    Dim i For i = 1 To 5 Select Case Cells(i, "A") Case "午前" Range("w1").Select Selection.Copy  Cells(i, "C").Select ActiveSheet.Paste Case "午後" Range("x1").Select Selection.Copy Cells(i, "d").Select ActiveSheet.Paste  End Select Next i Dim j For j = 1 To 5 Select Case Cells(j, "A") Case "関東" Range("y1").Select Selection.Copy  Cells(j, "e").Select ActiveSheet.Paste Case "関西" Range("z1").Select Selection.Copy Cells(i, "F").Select ActiveSheet.Paste  End Select Next i 毎回皆様にはお世話になっています。 あるセルを参照してその入力結果により 違うセルを貼り付けるマクロを組みました。 参照するセルが複数個(この例だと2セル)あるので それぞれに変数を宣言してfor nextで まわしています。 この内容を変数ひとつだけで すっきりと記述することは可能でしょうか? 参照するセルや判別する内容が増えると 記述が膨大になって マクロが 見にくくなるので 良い方法がありましたら 御教授ねがいます。

  • 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

  • VBA のエラーがわかりません・・・w

    Sub Worksheet_Change(ByVal Target As Range) Dim 初期値 As Integer Dim 増減値 As Integer Select Case Target.Address Case "$C$5" Select Case Target.Value Case 1 Range("C6").Value = 24 Range("D5").Value = 600 Range("D6").Value = 0 Range("E5").Value = 400 Range("E6").Value = 0 Range("B7").Value = "★1 MaxAttackPoint:700 / MaxDeffencePoint:900" Case 2 Range("C6").Value = 32 Range("D5").Value = 1000 Range("D6").Value = 0 Range("E5").Value = 500 Range("E6").Value = 0 Range("B7").Value = "★2 MaxAttackPoint:1100 / MaxDeffencePoint:1300" End Select Case "$D$5" Select Case Range("C5").Value Case 1 初期値 = 600 Case 2 初期値 = 1000 Case Else Exit Sub End Select If Target.Value < 初期値 Then 増減値 = 4 Else 増減値 = 8 Range("D6").Value = (初期値 - Target.Value) / 100 * 増減値 Case "$E$5" Select Case Range("C5").Value Case 1 初期値 = 400 Case 2 初期値 = 500 Case Else Exit Sub End Select If Target.Value < 初期値 Then 増減値 = 4 Else 増減値 = 8 Range("E6").Value = (初期値 - Target.Value) / 200 * 増減値 End Select End Sub Sub Worksheet_Change(ByVal Target As Range) Select Case Target.Address Case "$F$5" Select Case Target.Value Case "炎" Range("F6").Value = 4 Case "水" Range("F6").Value = 4 End Select   Case "$G$5" Select Case Target.Value Case "ドラゴン" Range("G6").Value = -8 Case "海竜" Range("G6").Value = -8 End Select Case "$H$5" Select Case Target.Value Case "ドラゴン" Range("H6").Value = -16 Case "海竜" Range("H6").Value = -16 End Select Case "$I$5" Select Case Target.Value Case "○" Range("I6").Value = 40 Case "×" Range("I6").Value = 0 End Select End Select End Sub とあるカードゲームのステータス決定を行う為に組まれたマクロです。 作成者は私だけではないのですが、もう何回もしつこく質問をしているため 気が引けてしまい、こちらで質問することにしました・・・w   エラー内容は 2つ目のSub Worksheet_Change(ByVal Target As Range)の 「Worksheet_Change」の名称が間違っています。 という事でした。何を入れればいいのかサッパリです(;´ω)   エラーの改善方法について教えてください。 宜しくお願いします

  • Excel2003 上手く動かなくなってしまいました!!

    お世話になっております。 以前こちらでご教授いただいたマクロを登録して 上手い事 動作していて助かっていたのですが 自分が変な所をイジってしまった為に 上手く動作しなくなってしまいました。 どこが おかしいのか、再度ご教授ください。 宜しくお願い致します。 Private Sub Worksheet_Change(ByVal Target As Range) Dim rOne As Range For Each rOne In Target Select Case (rOne.Value) Case 1 Range("Q" & rOne.Row).Select Case 2 Range("Y" & rOne.Row).Select Case 3 Range("AA" & rOne.Row).Select Case Else End Select Next rOne というマクロをいただき、リストで 1~3の数字を選ぶようにしていたのですが そのリストをイジってしまい、 1、あああ 2、いいい 3、ううう というように文字列を挿入した結果「Q」「Y」「AA」列にセルが飛ばなくなってしまいました。 解決方法をご教授ください。 宜しくお願い致します。

  • Select Case文についてご教授お願いします。

    助けて下さい。Select Case文についてご教授お願いします。現在VB2008にてプログラムを作成しているのですが、どうにも煮詰まってしまいました。 作成内容は、Excelの任意のSheetから文字をVB上のTextBox1~50に呼び出し、その内いくつかをCheckBoxとButtonを使用してRichTextBox1に表示させると共に、TextBox51に入力した文字をExcelから呼び出した任意の文字に対応したセルへ保存というものです。Excelからの呼び出しにIf文を使用しているため、同一プロシージャ内で別のIf文を使用してしまうと、先のIf文で決めた変数が反映されないためSelect Case文を使用して保存をさせようとしているのですが上手くいきません。以下に現在のコードを記載しますのでよろしくお願いいたします。 Private Sub Button1_Click~ Excel取得コード If RadioButton1.Checked = True AndAlso RadioButton13.Checked = True Then 'Sheetと列を選択 tuki = CType(Book.Worksheets.Item(2), Microsoft.Office.Interop.Excel.Worksheet) 'Sheet情報 COLUMN1 = "B" '列1情報 COLUMN2 = "F" '列2情報 ・ ・ ・ End If 'ここから先は指定したTextBoxをRichTextBoxに表示(先のIf文内の変数は未使用) RichTextBox1.Clear() If Me.CheckBox1.Checked = True Then RichTextBox1.Text = TextBox1.Text End If If Me.CheckBox2.Checked = True ThenIf RichTextBox1.Text <> "" Then RichTextBox1.Text = RichTextBox1.Text & "・" End If RichTextBox1.Text = RichTextBox1.Text & TextBox2.Text End If ・ ・ ・ End If 'ここから保存指示=エラー箇所 Select Case tuki.Range(COLUMN1 & "3").Value Case RichTextBox1.text = tuki.Range(COLUMN1 & "3").Value tuki.Range(COLUMN2 & "3").Value = TextBox51.Text Book.Save() という感じで作成しているのですが「String "" から型 'Boolean' への変換は無効です」と表示されます。 他のケースではIf文の変数をSelect Caseに対応できたので、この方法を選択しました。 基本的にSelect Caseの使い方が誤っていると思うのですが解決策が見つかりませんでした。 他の方法も含めて、良い案がありましたらご教授お願いいたします。 長文申し訳ありません。

  • Excelのマクロでの色の取得とループ方法

    はじめまして。 マクロ初心者です。 Excelのセルを使って地方別の日本地図を作成しています。 イメージとしてはこれのExcel版といった感じです。 http://hp-sozai.net/tm-map/nt03.html やりたいことは、別表の数字によってこの地方を色分けするマクロの作成です。 現在抱えている問題は、1.色の設定方法の改善、2.条件の設定方法の改善、3.現在のマクロの記述方法をシンプルにできないか、の3点です。 マクロは現在下記のように記述しています。 Sub 地方() Hokkaido = Range("T4").Value Select Case Hokkaido Case "" Range("P4").Interior.Color = QBColor(15) Case 1 To 4999 Range("P4").Interior.Color = QBColor(11) Case 5000 To 9999 Range("P4").Interior.Color = QBColor(9) Case 10000 To 14999 Range("P4").Interior.Color = QBColor(2) Case 15000 To 19999 Range("P4").Interior.Color = QBColor(10) Case 20000 To 24999 Range("P4").Interior.Color = QBColor(14) Case 25000 To 29999 Range("P4").Interior.Color = QBColor(13) Case 30000 To 34999 Range("P4").Interior.Color = QBColor(12) End Select Tohoku = Range("T5").Value Select Case Tohoku Case 1 To 4999 Range("O8,O9,P7:P10").Interior.Color = QBColor(11) Case 5000 To 9999 Range("P4").Interior.Color = QBColor(9) Case 10000 To 14999 Range("P4").Interior.Color = QBColor(2) Case 15000 To 19999 Range("P4").Interior.Color = QBColor(10) Case 20000 To 24999 Range("P4").Interior.Color = QBColor(14) Case 25000 To 29999 Range("P4").Interior.Color = QBColor(13) Case 30000 To 34999 Range("P4").Interior.Color = QBColor(12) End Select ・ ・ ・ (こを全地方分) End Sub 1.色の設定方法の改善と2.条件の設定方法の改善について: 現在それぞれの地方ごとにセルA1:B7に凡例を作成しています。 凡例はセルAにフォントの色指定で着色した■、 セルBに0以上5000未満などの条件を入力してあります。 例: A  B ■ 1以上5000未満 色は上記の通りマクロで直接指定していて、この■の色を変更してもマクロの色は変わりません。 これをリンクさせて、■の色が変更されたらマクロにも反映されるようにしたいと思っています。 条件についても同様で、Bの値が変わったらマクロの値も変わるように設定できたらいいのですが。。 3.現在のマクロの記述方法をシンプルにできないか、について: 見ての通り、今のマクロは同じ事を地方ごとに記述していて非常に長いものになっています。 これをもう少しシンプルに記述できないかと思っているのですが、 セルの範囲も地方によってさまざまなので上手いループが思いつかず行き詰まっています。 是非アイディアをいただけるとありがたいです。 どうぞよろしくお願いいたします。

  • select case文について

    VB6.0のSelect Case文について質問です。 現在、ある文字列(mojiretu)の中から特定の文字を検索して その文字が文字列(mojiretu)の中に存在したらチェックボックスにチェックという一連の処理を行いたいのですがうまくいきません>< このSelect Case文のどこを直すべきでしょうか? select case mojiretu case instr(mojiretu,"abc") chk1.value=1 case instr(mojiretu,"def") chk2.value=1 case else chk3.value=1 end select

専門家に質問してみよう