• 締切済み

VBA初心者です。教えてください

エクセルで次の式を作ってみました。表示対象はK15のセルです。 =IF(K14="","",IF(AND(K13="○",K14<=0.00000001),"A", IF(AND(K13="○",K14>=0.00000001,K14<=0.0000099),"B", IF(AND(K13="△",K14>=0.00000001,K14<=0.0000099),"D", IF(AND(K13="○",K14>=0.00001,K14<=0.0002),"C", IF(AND(K13="○",K14>=0.0002,K14<=0.099),"D", IF(AND(K13="△",K14>=0.0002,K14<=0.077),"D", IF(K13="×","E","D"))))))))  この数式をVBAで記述したいのですが、どなたか教えてください。 希望1 K13,14の値を変更するたびに反映されるようにしたいと思っております。 希望2 K~Mまでの範囲も指定したいです。 宜しくお願いします。

みんなの回答

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.4

こういう条件でしょうか。 △の時の条件は特に見る必要がなさそうですが……。 ・K13が空白なら、空白 ・K13が×なら、E ・K13が○で、   ・0.0000001以下 ならA   ・0.0000099以下 ならB   ・0.0002以下 ならC ・それ以外は、D Private Sub Worksheet_Change(ByVal Target As Range)   If (Target.Address <> "$K$13") And (Target.Address <> "$K$14") Then Exit Sub   sMark = Range("K13").Text   nData = Range("K14")   sAlphabet = "D"   If sMark = "" Then     sAlphabet = ""   ElseIf sMark = "×" Then     sAlphabet = "E"   ElseIf sMark = "○" Then     Select Case nData       Case Is <= 0.0000001         sAlphabet = "A"       Case Is <= 0.0000099         sAlphabet = "B"       Case Is <= 0.0002         sAlphabet = "C"     End Select   End If   Range("K15") = sAlphabet End Sub

nayanndemasu3
質問者

お礼

こんな初心者に、ご丁寧に回答いただき有難うございます。 早速、作成し勉強させていただきます。

  • jcctaira
  • ベストアンサー率58% (119/204)
回答No.3

nayanndemasu3さん はじめまして。 プログラムは「見やすさ」と「正確さ」が重要だと思います。 下記のようにプログラムを修正してみました。 主な所を説明します。 1.関数化  関数にしておけばEXCELのユーザ関数でも使用できるし、他の人が同様な処理を使用する時  このまま関数を複写すれば使える等…結構使いやすくなります。 2.見やすさ  ・見やすいと修正があっても間違いが少ないです。   IF~ElseIF~End If 文よりSelect case 文の方がわかりやすくなることが多いと思います。  ・個人的ですが    Case 列13 = "△" And (列14 => 0.00000001 And 列14 <= 0.0000099) とするより変数を真ん中にするとイメージが 0.00000001 ~ 0.0000099 になり分かりやすい気が…    Case 列13 = "△" And (0.00000001 <= 列14 And 列14 <= 0.0000099)   3.正確さ  K13が○で K14が0.00000991 (最後に1をつけています)の場合、Caseから抜けてしまいます。     Case 列13 = "○" And 列14 <= 0.0000099       判断 = "B"     Case 列13 = "○" And 列14 <= 0.0002       判断 = "C"   とした方が、Caseから漏れることはないと思います。   Sub test()   Range("K15") = 判断(Range("K13"), Range("K14"))   Range("L15") = 判断(Range("L13"), Range("L14"))   Range("M15") = 判断(Range("M13"), Range("M14")) End Sub Function 判断(列13 As Variant, 列14 As Variant) As String   Select Case True     Case 列13 = ""       判断 = ""     Case 列13 = "○" And 列14 <= 0.00000001       判断 = "A"     Case 列13 = "○" And 列14 <= 0.0000099       判断 = "B"     Case 列13 = "○" And 列14 <= 0.0002       判断 = "C"     Case 列13 = "○" And 列14 <= 0.099       判断 = "D"     Case 列13 = "△" And (0.00000001 <= 列14 And 列14 <= 0.0000099)       判断 = "D"     Case 列13 = "△" And (0.0002 <= 列14 And 列14 <= 0.077)       判断 = "D"     Case 列13 = "×"       判断 = "E"     Case Else       判断 = "D"   End Select End Function 余談ですが、上記のロジックだと以下のCase文でも良いのように思いますが… 結果が"D"の判断は要らないように思えます。 Function 判断(列13 As Variant, 列14 As Variant) As String   Select Case True     Case 列13 = ""       判断 = ""     Case 列13 = "○" And 列14 <= 0.00000001       判断 = "A"     Case 列13 = "○" And 列14 <= 0.0000099       判断 = "B"     Case 列13 = "○" And 列14 <= 0.0002       判断 = "C"     Case 列13 = "×"       判断 = "E"     Case Else       判断 = "D"   End Select End Function 以上です。頑張ってVBAを勉強して下さい。

nayanndemasu3
質問者

お礼

こんな初心者に、ご丁寧に回答いただき有難うございます。 早速、試してみました。 思い通りの内容に驚いています。 本当に、有難うございました。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

こんばんは! IF関数をネストするとかなり長い数式になってしまいますが、 整理すると結局↓の画像のような表の感じになるのではないでしょうか? (空白部分は数式の条件が見当たらなかったので敢えて空白にしています。) もしこれでよいのであれば、簡単な数式で対応できると思います。 空白部分は適当に入力してください。 仮に↓の表をSheet2に作成したとします。 操作するSheetがSheet1の場合 Sheet1のK15セルに =IF(K14="","",VLOOKUP(K14,Sheet2!$A:$E,MATCH(K13,Sheet2!1:1,0),1)) という数式を入れ、M15セルまでオートフィルでコピー! これで完了です。 どうしてもVBAでやりたい!というコトであれば、無理やりになりますが・・・ 画面左下の操作したいSheet見出し上で右クリック → コードの表示 → VBE画面に ↓のコードをコピー&ペーストして、K13~M14セルにデータを入力してみてください。 Private Sub Worksheet_Change(ByVal Target As Range) 'この行から If Application.Intersect(Target, Range("K13:K14")) Is Nothing Or Target.Count <> 1 Then Exit Sub With Target If .Row = 14 Then If .Value = "" Then .Offset(1) = "" Else Select Case .Value Case Is < 0.00000001 Select Case .Offset(-1) Case "○" .Offset(1) = "A" Case "△" .Offset(1) = "" '←当てはまる条件がないので空白にしている Case Else .Offset(1) = "E" End Select Case Is < 0.00001 Select Case .Offset(-1) Case "○" .Offset(1) = "B" Case "△" .Offset(1) = "D" Case Else .Offset(1) = "E" End Select Case Is < 0.002 Select Case .Offset(-1) Case "○" .Offset(1) = "C" Case "△" .Offset(1) = "" '←当てはまる条件がないので空白にしている Case Else .Offset(1) = "E" End Select Case Is < 0.1 Select Case .Offset(-1) Case "○" .Offset(1) = "D" Case "△" .Offset(1) = "D" Case Else .Offset(1) = "E" End Select End Select End If Else Select Case .Value Case "○" Select Case .Offset(1) Case Is < 0.00000001 .Offset(2) = "A" Case Is < 0.00001 .Offset(2) = "B" Case Is < 0.0002 .Offset(2) = "C" Case Is < 0.1 .Offset(2) = "D" End Select Case "△" Select Case .Offset(1) Case Is < 0.00000001 .Offset(2) = "" '←こちらも同上 Case Is < 0.00001 .Offset(2) = "D" Case Is < 0.0002 .Offset(2) = "" '←こちらも・・・ Case Is < 0.1 .Offset(2) = "D" End Select Case Else .Offset(2) = "E" End Select End If End With End Sub 'この行まで ※ お示しの数式で重複する部分があり(0.00000001のように)はっきり区切りが判りませんので 適当に不等号を入れています。m(_ _)m

nayanndemasu3
質問者

お礼

うまく行きました有難うございます。 いろいろと勉強になります。

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

条件がおかしい。 K13が"○"で、K14=0.00000001だったら "A"なの?"B"なの? 無テストですが以下をThisWorkbookにでもペーストし、 セルK15に式[=MyFunc(K13, K14)を設定してみてください。 ※1の行で、F9キー押下してブレクポイント作っておいて、F8でステップ実行しながら 確認してください。 function MyFunc(strK13 as string, dblK14 as double) as string  MyFunc = "D"  ''※1  select case strK13  case ""   MyFunc = ""  case "○"   select case dblK14   case <=0.00000001    MyFunc = "A"   case <=0.0000099    MyFunc = "B"   case <=0.00001    ''ここは"D"で良いのかな?   case <=0.0002    MyFunc = "C"   case <=0.099    MyFunc = "D"   end select  case "△"     ''K14の値に関わらず、常に"D"  case "×"    MyFunc = "E"  end select end function

関連するQ&A