• ベストアンサー

エクセルの関数について

エクセルで、以下のことを行いたいと思っています。 どのようにすれば宜しいでしょうか。 セルJ9に文字列"S"が入力されたら、セルF9、セルG10に文字列"×"を表示、セルI12に文字列"-"を表示させ、セルJ9にそれ以外の入力であればセルF9、G10、I12には何も表示させない。 ※但し、セルF9に文字列"S"以外が入力された時(何も表示させない時)は、セルF9、G10、I12の直接入力を優先させる。

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

  • ベストアンサー
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.5

おはようございます。 > If c.Value = "RES" Or c.Value = "JP" Or c.Value = "MIN" Or c.Value = "res" ・・・ Then > と長くなってしまいましたが そんなにたくさんあるなら、SelectCase構文に書き換えましょう。 Private Sub Worksheet_Change(ByVal Target As Range) With Target If .Column <> 10 And .Column <> 4 Then Exit Sub If .Row < 9 Then Exit Sub x = ActiveCell.SpecialCells(xlLastCell).Row Application.Calculation = xlCalculationManual Application.ScreenUpdating = fales If .Column = 10 Then If Selection.Count > 1 Then Set Rng = Range(Cells(9, 10), Cells(x, 10)) Else Set Rng = Target End If For Each c In Rng Select Case c.Value Case "S" c.Offset(0, -4).Value = "×" c.Offset(1, -3).Value = "×" c.Offset(3, -1).Value = "-" Case Else c.Offset(0, -4).Value = "" c.Offset(1, -3).Value = "" c.Offset(3, -1).Value = "" End Select Next Else If Selection.Count > 1 Then Set Rng = Range(Cells(9, 4), Cells(x, 4)) Else Set Rng = Target End If For Each c In Rng Select Case c.Value Case "RES", "JP", "MIN", "res", "jp", "res" c.Offset(0, 4).Value = "-" c.Offset(0, 9).Value = "-" Case Else c.Offset(0, 4).Value = "" c.Offset(0, 9).Value = "" End Select Next End If End With Set Rng = Nothing Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub

poppoyaya
質問者

お礼

merlionXX様 ありがとうございました。 処理も早くなり、スマートになりました。 本当に助かりました。

その他の回答 (5)

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.6

すみません、#5のコードにうっかりミスがありました。 上から7行目を Application.ScreenUpdating = False 下から14行目を Case "RES", "JP", "MIN", "res", "jp", "min" に修正してください。

poppoyaya
質問者

お礼

ご丁寧にどうもありがとうございました。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.4

こんばんは。 ではこれでいかが? Private Sub Worksheet_Change(ByVal Target As Range) With Target If .Column <> 10 And .Column <> 4 Then Exit Sub If .Row < 9 Then Exit Sub x = ActiveCell.SpecialCells(xlLastCell).Row If .Column = 10 Then Set Rng = Range(Cells(9, 10), Cells(x, 10)) For Each c In Rng If c.Value = "S" Then c.Offset(0, -4).Value = "×" c.Offset(1, -3).Value = "×" c.Offset(3, -1).Value = "-" Else c.Offset(0, -4).Value = "" c.Offset(1, -3).Value = "" c.Offset(3, -1).Value = "" End If Next Else Set Rng = Range(Cells(9, 4), Cells(x, 4)) For Each c In Rng If c.Value = "RES" Or c.Value = "JP" Then c.Offset(0, 4).Value = "-" c.Offset(0, 9).Value = "-" Else c.Offset(0, 4).Value = "" c.Offset(0, 9).Value = "" End If Next End If End With Set Rng = Nothing End Sub "RES"に"JP"を追加し、複数選択時もエラーが出ないようにしてみました。

poppoyaya
質問者

お礼

merlionXX様 本当にありがとうございました。 完成しました。 条件を増やすのはOrを使えば良かったんですね。 If c.Value = "RES" Or c.Value = "JP" Or c.Value = "MIN" Or c.Value = "res" ・・・ Then と長くなってしまいましたが、上記のようにしました。 本日ポイント発行して締め切らさせて頂きます。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.3

If Target.Column <> 4 Then Exit Sub ということですからD列に「RES」と入力された場合の条件追加ですね? Private Sub Worksheet_Change(ByVal Target As Range) With Target If .Column <> 10 And .Column <> 4 Then Exit Sub If .Row < 9 Then Exit Sub If .Column = 10 Then If .Value = "S" Then .Offset(0, -4).Value = "×" .Offset(1, -3).Value = "×" .Offset(3, -1).Value = "-" Else .Offset(0, -4).Value = "" .Offset(1, -3).Value = "" .Offset(3, -1).Value = "" End If Else If .Value = "RES" Then .Offset(0, 4).Value = "-" .Offset(0, 9).Value = "-" Else .Offset(0, 4).Value = "" .Offset(0, 9).Value = "" End If End If End With End Sub こんな感じでしょうか。

poppoyaya
質問者

お礼

merlionXX様 ありがとうございました。 助かりました。 望み通りの動作となっております。 最後ですが、 If .Value = "RES" Then 上記に条件(RES以外にもJPとか)を追加する場合は、どうすれば良いでしょうか。 (これは何種類もあります) If .Value = "RES","JP" Then では構文エラーでした・・・

poppoyaya
質問者

補足

すみません、 D列(もしくはJ列)に関して、セルを複数選択してDeleteすると、下記の行で、「実行時エラー"13" 型が一致しません」と言うエラーが発生します。 If .Value = "RES" Then 防げる手立てはあるでしょうか? (1セルだけの選択Deleteは問題ありませんでした)

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.2

poppoyayaさん、こんにちは。 > ・・・ > みたいに行がずれていく感じです。 merlionXXです。 では、以下のように修正します。 9行目以下のJ列に入力された場合に作動するようにしました。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column <> 10 Then Exit Sub If Target.Row < 9 Then Exit Sub If Target.Value = "S" Then Target.Offset(0, -4).Value = "×" Target.Offset(1, -3).Value = "×" Target.Offset(3, -1).Value = "-" Else Target.Offset(0, -4).Value = "" Target.Offset(1, -3).Value = "" Target.Offset(3, -1).Value = "" End If End Sub

poppoyaya
質問者

お礼

merlionXX様 大変ありがとうございました。 差し出がましいのですが、条件式を追加したい場合はどこに追加すれば宜しいでしょうか? 教えて頂きました内容に、以下の条件も追加したいのです。 特定のセルに"RES"と入力したら、指定のセルに値を表示させる。 (教えて頂いたものを流用させて頂く場合は、以下の条件式になります) If Target.Column <> 4 Then Exit Sub If Target.Row < 9 Then Exit Sub If Target.Value = "RES" Then Target.Offset(0, 4).Value = "-" Target.Offset(0, 9).Value = "-" Else Target.Offset(0, 4).Value = "" Target.Offset(0, 9).Value = "" End If

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.1

ご要望のようなことはワークシート関数では不可能です。 セルJ9に文字列"S"が入力されたら、セルF9、セルG10に文字列"×"を表示、セルI12に文字列"-"を表示させたり、セルJ9にそれ以外の入力であればセルF9、G10、I12には何も表示させないということならIF関数でとても簡単なのですが、セルF9、G10、I12に直接入力もするのなら、その段階でせっかく作った関数は消えてしまいます。 このような場合には関数ではなくVBAの出番となります。 以下を試してみてください。 1.シートのタブを右クリックし、「コードの表示」を選択。 2.出てきたVisualBasicEditor(白い部分)に下記のコードをコピペ。 '*****ここから下をコピペ***** Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$J$9" Then Exit Sub If Target.Value = "S" Then Range("F9,G10").Value = "×" Range("I12").Value = "-" Else Range("F9,G10,I12").ClearContents End If End Sub '*****ここより上までをコピペ***** 3.Altキー+F11キーでワークシートへもどります。

poppoyaya
質問者

お礼

ありがとうございました。 VBAを用いて対応しようと思います。 すみませんが、セル入力1つじゃないのですが、この場合どうすれば良いでしょうか? セルJ9に文字列"S"が入力されたら、セルF9、セルG10に文字列"×"を表示、セルI12に文字列"-"を表示させたり、セルJ9にそれ以外の入力であればセルF9、G10、I12には何も表示させない。 で、以下 J10に~セルF10、G11~セルI13 J11に~セルF11、G11~セルI14 ・・・ みたいに行がずれていく感じです。

関連するQ&A