- ベストアンサー
エクセル、不特定行数の条件分岐マクロについて
- エクセルで不特定行数の条件分岐マクロを作成したい場合、以下のように書けば良いです。
- Range関数を使用して、範囲を指定し、セルの値を比較します。
- 条件に応じて、別の値を設定することができます。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
回答No.3です。 >まだすぐに理解出来ていないので確認させて下さい。 まず、 Range("A4:A" & Range("A" & Rows.Count).End(xlUp).Row).Offset(, 1) という部分に関しては、質問者様も使っておられるのですから、説明は不要かと思います。 その頭の所にWithが付いて、 With Range("A4:A" & Range("A" & Rows.Count).End(xlUp).Row).Offset(, 1) となっていますから、その構文が記述されている所から、 End With と記述されている所までは、 Range("A4:A" & Range("A" & Rows.Count).End(xlUp).Row).Offset(, 1) というセル範囲に対して処理を行う事になります。 【参考URL】 Office TANAKA > 今さら聞けないVBA > Withって何ですか? http://officetanaka.net/excel/vba/beginner/16.htm 次に、 .FormulaR1C1 = "=IF(AND(ISNUMBER(RC[-1]),RC[-1]>=0)," _ & "LOOKUP(RC[-1],{0,50,70,100;""不可"",""可"",""良"",""優""}),"""")" という記述の所で、先述のWithで指定しておいたセル範囲内にある全てのセルに、 =IF(AND(ISNUMBER(A4),A4>=0),LOOKUP(A4,{0,50,70,100;"不可","可","良","優"}),"") というワークシート関数を入力しています。 但し、R1C1形式でワークシート関数を入力していますから、B4セルに入力される関数は =IF(AND(ISNUMBER(A4),A4>=0),LOOKUP(A4,{0,50,70,100;"不可","可","良","優"}),"") ですが、B5セルに入力される関数は、 =IF(AND(ISNUMBER(A5),A5>=0),LOOKUP(A5,{0,50,70,100;"不可","可","良","優"}),"") になり、B6セルに入力される関数は、 =IF(AND(ISNUMBER(A6),A6>=0),LOOKUP(A6,{0,50,70,100;"不可","可","良","優"}),"") になります。 そしてこのままでは、 >データベース毎回読み出してくるのでVBAで必要なんです。 という条件がある事に関して不都合が生じるかも知れませんから、 .Value = .Value という記述の所で、関数で処理した結果、セルに表示されている値と同じ値を、同じセル範囲のセルに入力し直しています。(値のみ貼り付けと同じ様な処理となります) 【参考URL】 moug モーグ > 即効テクニック > Excel VBA > セル操作関連のテクニック > セルの値だけをコピーする http://www.moug.net/tech/exvba/0050145.html
その他の回答 (3)
- kagakusuki
- ベストアンサー率51% (2610/5101)
次の様なやり方もあります。(実質的にはワークシート関数で処理しています) Sub Macro() With Range("A4:A" & Range("A" & Rows.Count).End(xlUp).Row).Offset(, 1) .FormulaR1C1 = "=IF(AND(ISNUMBER(RC[-1]),RC[-1]>=0)," _ & "LOOKUP(RC[-1],{0,50,70,100;""不可"",""可"",""良"",""優""}),"""")" .Value = .Value End With End Sub
お礼
回答有難う御座います。 変数は使わないやり方なんですね。 まだすぐに理解出来ていないので確認させて下さい。 まずは御礼まで。
- yaritsusozai
- ベストアンサー率59% (50/84)
添付画像を見る限りでは、VLOOKUPでやりたいのかな?という印象を受けますが、あえてマクロでやりたいという事であれば、 Sub yu() Dim j As Long, ten As Long, x As String For j=4 To Cells(ActiveSheet.Rows.Count, 1).End(xlup).Row ten=Val(Cells(j,1).Value) Select Case ten Case 100 x = "優" Case Is >= 70 x = "良" Case Is >= 50 x = "可" Case Else x = "不可" End Select Cells(j, 2).Value = x Next End Sub という感じに。
お礼
回答有難う御座います。 右の表はわかりやすく例をと思って載せたのですが逆にわかりにくくなってしまって申し訳御座いません。 参考書読んでも変数がピンとこなくてつまづいているので壁を越えなければと思っています。
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! VBAでないとダメですか? どうしてもというコトであれば、右側の表は不要で Sub Sample1() Dim i As Long For i = 4 To Cells(Rows.Count, "A").End(xlUp).Row With Cells(i, "A") Select Case .Value Case 100 .Offset(, 1) = "優" Case Is >= 70 .Offset(, 1) = "良" Case Is >= 50 .Offset(, 1) = "可" Case Else .Offset(, 1) = "不可" End Select End With Next i End Sub という感じでできると思います。 関数の場合、今回は区分けが少ないのでIF関数のネストでやると B4セルに =IF(A4="","",IF(A4=100,"優",IF(A4>=70,"良",IF(A4>=50,"可","不可")))) としてオートフィルで下へコピー! ↓の画像のような対応表を作成しておけばB4セルは =IF(A4="","",VLOOKUP(A4,D$4:E$7,2,1)) で大丈夫だと思います。 ※ 一旦マクロを実行すると数式は消えてしまいますので、両方の共存はできません。m(_ _)m
お礼
回答有難う御座います。 データベース毎回読み出してくるのでVBAで必要なんです。 やっぱり変数が必要ですか。 前から、変数でつまづいているので勉強させていただきます。
お礼
先週仕事が忙しくなってしまったのと理解がなかなか出来なく御礼が遅くなり大変申し訳御座いません。 せっかく変数以外のコードを教えていただいたのですが今回は変数を使ったコードで何とか作る事が出来ました。 しかし「ベストアンサー」とさせていただきましたのは他に回答いただいた方には誠に申し訳ないのですが ご紹介いただいたリンクサイトにありました 『マクロやVBAについて、何となくはわかるけど、本当のところは知らないとか、マクロ記録したり、ネットで拾ったコードを寄せ集めて作ってるけど、実は基本的なことがわかってないんだよな』という状況がぴったりでその辺を察していただき有難う御座いました。一壁乗り越える為にVBA講習に一度参加してみたいとも思うのですが何せ高額すぎて・・・」