• ベストアンサー

エクセルの関数について

エクセルで、以下のことを行いたいと思っています。 どのようにすれば宜しいでしょうか。 セル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

  • EXCELのIF関数の入れ子について

    すみませんよろしくお願いします。 EXCELでセル(A1)~(L1)までに不特定の文字列が入力されており、(M1)に「もし(L1)が入力されていたら(L1)の値を表示、もし(L1)がブランクなら(K1)の値を表示、もし(K1)がブランクなら(J1)の値を表示、もし(J1)がブランクなら(I1)の値を表示・・・・」といった具合で関数を作成したいのです。また、(A1)~(L1)のセルで穴あき状態で入力されていた場合は最も(L1)寄りのセルを表示させたいです。 EXCEL2003のIF関数だと、 =IF(L2="",IF(K2="",IF(J2="",IF(I2="",IF(H2="",IF(G2="",IF(F2="",IF(E2="","",E2),F2),G2),H2),I2),J2),K2),L2) で最後の(A1)までの入れ子を作ることができせん。 EXCEL2007を使用すると、 =IF(L2="",IF(K2="",IF(J2="",IF(I2="",IF(H2="",IF(G2="",IF(F2="",IF(E2="",IF(D2="",IF(C2="",IF(B2="",IF(A2="","",A2),B2),C2),D2),E2),F2),G2),H2),I2),J2),K2),L2) と作成できます。 EXCEL2003で作成するいい方法はありますでしょうか? ご指南の程よろしくお願いします。

  • エクセル関数かマクロで

    C列とF列とG列のセルの文字列が一致している行をS列に、 ●を表示することは可能でしょうか? 例えば    C列   F列   G列   S列 1行 あああ いいい ううう 2行 かかか ききき おおお  ● 3行 さささ ししし すすす 4行 あああ いいい さささ 5行 かかか あああ さささ 6行 かかか ききき おおお  ● 7行 ううう あああ すすす 2行目と6行目のC列、F列、G列が全く同じなのでS列に●を表示。 EXACT関数を応用すればできるのでしょうか?

  • EXCELのIF関数について

    9セルA1~J1に1~15の数のうちの10個が一つずつ入っており、セルA3~J3にも1~15の数が入っています。またA2~J2には、A~Jまでの英字が入っています      1 2 15 9 7 6 5 4 11 3        A B C D E F G  H  I  J       2 3 5 7 9 10 11 12  13 15   のとき                                          B J G E D    I        C   のようにA3列の値と同じ1列の数字の下の値を            A5 列に表示したいのですが、何度やってもできません。      良い知恵をお持ちの方、よろしくおねがいします。

  • エクセル関数について

    エクセルでセルA1に1、B1に2・・・・・Iに、J1に10が入力された表があります。また、A2に1、B2に3、C2に5、D2に7が入力されています。A2からD2を検索してA3に1、C3に1、E3に1、G3に1を入力します。次に、A2からにD2に2,4,6,8、と入力して同様にB3、D3、F3、H3に1が入るようにしたいのです。 このとき、1,3,5,7の値と2,4,6,8、の値が消去されず。またA2からD2に再度異なる数を入力した場合3列の値に1が加算されるようにしたいのですが、教えてください。

  • エクセル関数でちょっと悩んでます。

    エクセル関数でちょっと悩んでます。 sheet1にセルB4、C4、D4、B5、C5、D5(グループ1)とI4、J4、K4、I5、J5、K5(グループ2)にデータが入っているとします。 sheet2のB3、C3、D3、E3、F3、G3にグループ1のデータを記入します。 B4、C4、D4、E4、F4、G4にはグループ2を入れたいのですが、sheet1からみて列7つ移動したものとして記入したいです。どうやればいいですか? 例えば、sheet2のB3には、=Sheet1!B4を入れれば反映されます。 sheet2のB4にはsheet1のI4を入れたいのですが、sheet1からみて列7つ移動した形でエクセル関数を使って表現したいのです。どうやればいいですか? =Sheet1!B4+?

  • エクセルの関数

    エクセルで例えばセルB1に「1」と入力した場合、セルC1からG1まで「15」と表示させ、セルB2に「2」と入力した場合セルC2からF2まで「30」と表示させたいのですが、どのような関数を使えばよろしいでしょうか?

  • EXCELの関数について教えてください。

    EXCELの関数について教えてください。 A列のセルに「18:00 」or 「18:30」 or「19:00」 or「19:30」と入力するとB列のセルに「8:00」と表示され、「17:30」と入力すると「7:00」と表示される方法を教えてください。 セルの書式の表示形式は「文字列」ではなく「時刻」に設定したいです。 多分IF関数をつかうを使うのではないかと思うのですが、書式が「時刻」のためかうまくいきません。 よろしくお願いします。

  • エクセルのcountif関数について

    エクセルで下記のような場合、どのような関数になるのでしょうか?? 番号2の行について (1)B列に1~999までの数字が入力されていて (2)かつJ列に「ごはん大」という文字が入力されている (3)ただし「ごはん大」と打ち込んであるせるは「ごはん大 おかず大盛り」など「ごはん大」以外の文字も同一セルに入力されている可能性がある。 このような場合、countif関数を使用するのではないか、ということまでは何となくわかったのですが、(1)、(3)についてよく分からずご質問させていただきました。 ちなみにエクセル2010を使用しています。 どなたかアドバイスよろしくお願いします。

  • エクセルで横方向でのソート、または条件を満たすセルの値を表示する関数ありますか?

    A,B,C,D,E列に文字列が入っており、 F列にはA~Eの中で先頭文字が(1)のセルの値を表示 G列にはA~Eの中で先頭文字が(2)のセルの値を表示 H列にはA~Eの中で先頭文字が(3)のセルの値を表示 I列にはA~Eの中で先頭文字が(4)のセルの値を表示 J列にはA~Eの中で先頭文字が(5)のセルの値を表示 させたいのですが、F~J列にはどんな関数を入れれば良いでしょうか? 横行でのソートをするのと同じ意味になると思うのですが、 先頭文字順に拾い出したいのです。 よろしくお願いします。

  • エクセルで行内特定文字で色塗り、特定文字非表示。

    エクセルで行内特定文字で色塗り、特定文字非表示。 エクセル2000です。 B列30から10-50-01~20、11-51-01~30とかの連番番号、C列30から O列30までの行に各情報入力がしてあります。 行いたいのは、B列30以降に10-50-01~20と記入してあれば-01の行中の F、G、H、J、K、L、M、Oと、とびとびですが、文字表示をさせ、それ以外は (-02から-20まで)非表示(白色文字色)とし、かつ、K30以降のセル内に「OK」の文字が 入力されると、その行だけセルに色つけをしたいです。 書式でできますでしょうか? 現在、=RIGHT($B30,3)<>"-01"で-01を表示、それ以降は非表示させていましたが、K30以降のセル内に「OK」での行に色つけが必要になり、方法がわかりません。 よろしくお願いします。