プロが教える店舗&オフィスのセキュリティ対策術

エクセルで、以下のことを行いたいと思っています。
どのようにすれば宜しいでしょうか。

セルJ9に文字列"S"が入力されたら、セルF9、セルG10に文字列"×"を表示、セルI12に文字列"-"を表示させ、セルJ9にそれ以外の入力であればセルF9、G10、I12には何も表示させない。
※但し、セルF9に文字列"S"以外が入力された時(何も表示させない時)は、セルF9、G10、I12の直接入力を優先させる。

A 回答 (6件)

おはようございます。



> 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
    • good
    • 0
この回答へのお礼

merlionXX様
ありがとうございました。

処理も早くなり、スマートになりました。
本当に助かりました。

お礼日時:2007/02/16 11:23

すみません、#5のコードにうっかりミスがありました。



上から7行目を
Application.ScreenUpdating = False

下から14行目を
Case "RES", "JP", "MIN", "res", "jp", "min"

に修正してください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/02/16 11:24

こんばんは。



ではこれでいかが?

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"を追加し、複数選択時もエラーが出ないようにしてみました。
    • good
    • 0
この回答へのお礼

merlionXX様
本当にありがとうございました。
完成しました。

条件を増やすのはOrを使えば良かったんですね。
If c.Value = "RES" Or c.Value = "JP" Or c.Value = "MIN" Or c.Value = "res" ・・・ Then
と長くなってしまいましたが、上記のようにしました。

本日ポイント発行して締め切らさせて頂きます。

お礼日時:2007/02/16 08:35

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

こんな感じでしょうか。

この回答への補足

すみません、
D列(もしくはJ列)に関して、セルを複数選択してDeleteすると、下記の行で、「実行時エラー"13" 型が一致しません」と言うエラーが発生します。

If .Value = "RES" Then

防げる手立てはあるでしょうか?
(1セルだけの選択Deleteは問題ありませんでした)

補足日時:2007/02/15 20:21
    • good
    • 0
この回答へのお礼

merlionXX様
ありがとうございました。
助かりました。

望み通りの動作となっております。

最後ですが、
If .Value = "RES" Then
上記に条件(RES以外にもJPとか)を追加する場合は、どうすれば良いでしょうか。
(これは何種類もあります)

If .Value = "RES","JP" Then
では構文エラーでした・・・

お礼日時:2007/02/15 20:17

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/02/15 18:52

ご要望のようなことはワークシート関数では不可能です。


セル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キーでワークシートへもどります。
    • good
    • 0
この回答へのお礼

ありがとうございました。
VBAを用いて対応しようと思います。

すみませんが、セル入力1つじゃないのですが、この場合どうすれば良いでしょうか?

セルJ9に文字列"S"が入力されたら、セルF9、セルG10に文字列"×"を表示、セルI12に文字列"-"を表示させたり、セルJ9にそれ以外の入力であればセルF9、G10、I12には何も表示させない。

で、以下
J10に~セルF10、G11~セルI13
J11に~セルF11、G11~セルI14
・・・
みたいに行がずれていく感じです。

お礼日時:2007/02/15 16:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!