- ベストアンサー
エクセルのマクロで複数条件分岐を自動化する方法
- エクセルのマクロを使用して、セルの値に基づいて複数条件分岐を自動化する方法をご紹介します。
- セルの内容に応じて、特定の値を別のセルに自動的に入力することができます。
- これにより、手作業で値を入力する手間を省くことができます。また、マクロを使って自動化することで、条件が増えてもコードの追加を行うだけで対応できます。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
次の様にされては如何でしょうか。 Sub 科目自動入力() Dim a As Long, myArray As Variant, i As Long myArray = Array("売上", 700, "切手", 756, "レター", 756, "残業", 746, "食事", 746, "旅費", 755, "交通費", 755) a = 6 '内容が空白になるまで繰り返す Do Until Cells(a, 4).Value = "" For i = 0 To UBound(myArray) - 1 Step 2 If Cells(a, 4).Value Like "*" & myArray(i) & "*" Then Cells(a, 7).Value = myArray(i + 1) Next i a = a + 1 Loop End Sub
その他の回答 (4)
- mt2015
- ベストアンサー率49% (258/524)
項目が後から増えたり減ったりするなら、項目とデータを一覧にしてその一覧を参照するようにした方がいいです。 以下のサンプルではJ4:K20を一覧として使用する例です。 Sub Sample() Dim a As Integer a = 6 aList = Range("J4:K20") '内容が空白になるまで繰り返す Do Until Cells(a, 4).Value = "" '一覧に空白が出るか、一致する項目があるまで繰り返す For i = 1 To UBound(aList) If aList(i, 1) = "" Then Exit For If Cells(a, 4).Value Like "*" & aList(i, 1) & "*" Then Cells(a, 7).Value = aList(i, 2) Exit For End If Next i a = a + 1 Loop End Sub
お礼
ありがとうございます、 シートに項目とデータを書いておけば 今後の更新においてマクロを書き換えなくても すむのですね 勉強になりました
- f272
- ベストアンサー率46% (8467/18128)
こんな感じでどうでしょう。 Sub hogehoge() With Range("D6", Range("D" & Rows.Count).End(xlUp)).Offset(, 3) .Formula = "=LOOKUP(0,0/FIND($A$6:$A$12,D6),$B$6:$B$12)" End With End Sub A列とB列の6行目から12行目には 売上 700 切手 756 レター 756 残業 746 食事 746 旅費 755 交通費 755 が書かれていることが前提です。
お礼
ありがとうございます VLOOKUPとマクロを組み合わせての方法 勉強になりました。
- mshr1962
- ベストアンサー率39% (7417/18945)
Sub 科目自動入力() Dim a As Integer Dim x As Integer a = 6 '内容が空白になるまで繰り返す Do Until Cells(a, 4).Value = "" x = 0 Select Case Cells(a, 4).Value Case is like "*売上*" x = 700 Case is like "*切手*" x = 756 Case is like "*レター*" x = 756 Case is like "*残業*" x = 746 Case is like "*食事*" x = 746 Case is like "*旅費*" x = 755 Case is like "*交通費*" x = 755 End Select Cells(a, 7).Value = x a = a + 1 Loop End Sub
お礼
ご回答ありがとうございます、 未熟なせいか ためしてみてうまくつかいこなせませんでしたが 勉強していきたいとおもいます
- ushi2015
- ベストアンサー率51% (241/468)
こんにちは スマートかどうかは別として、こんな感じで、 Sub test1() With Range("D6", Range("D" & Rows.Count).End(xlUp)).Offset(, 3) .Formula = "=IF(ISERROR(FIND(""売上"",$D6,1))," & _ "IF(ISERROR(FIND(""切手"",$D6,1))," & _ "IF(ISERROR(FIND(""レター"",$D6,1))," & _ "IF(ISERROR(FIND(""残業"",$D6,1))," & _ "IF(ISERROR(FIND(""食事"",$D6,1))," & _ "IF(ISERROR(FIND(""旅費"",$D6,1))," & _ "IF(ISERROR(FIND(""交通費"",$D6,1))," & _ "0," & _ "755)," & _ "755)," & _ "746)," & _ "746)," & _ "756)," & _ "756)," & _ "700)" .Value = .Value End With End Sub Sub test2() Dim v(1 To 7, 1 To 2) Dim r As Range Dim i As Long Dim j As Long Dim d As Range Dim g As Variant v(1, 1) = "売上": v(1, 2) = 700 v(2, 1) = "切手": v(2, 2) = 756 v(3, 1) = "レター": v(3, 2) = 756 v(4, 1) = "残業": v(4, 2) = 746 v(5, 1) = "食事": v(5, 2) = 746 v(6, 1) = "旅費": v(6, 2) = 755 v(7, 1) = "交通費": v(7, 2) = 755 Set d = Range("D6", Range("D" & Rows.Count).End(xlUp)) g = d.Offset(, 3).Value For Each r In d j = j + 1 For i = 1 To UBound(v, 1) If InStr(1, r.Value, v(i, 1)) > 0 Then g(j, 1) = v(i, 2) Exit For End If Next Next d.Offset(, 3).Value = g End Sub 2番目のコードの変数vは書き方を変えて、セル上のデータをセットする事も 出来ます。 条件が増えた場合にコードを修正するか、セル上にセットした条件を追加するか どちらがいいかによります。
お礼
2種類も回答を下さってありがとうございます。 両方とも今後の参考にさせてください。
お礼
ご回答ありがとうございました、 配列を使った方法 とっても参考になりました。