質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

2回答

1745閲覧

エクセルVBAを使い関数で表示された値を取得したい

texDL

総合スコア2

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

1クリップ

投稿2021/09/28 23:45

前提・実現したいこと

いつもお世話になっています。
エクセルのVBAを使用しShhet2の指定のセルに「異常」「警告」等、特定の文字が表示されるとSheet1に配置した図形の色を対応した物に変更される物を作りたいのですが、
現在のものだとSheet2のセルに直接文字を打ち込むと正常に作動するのですが、関数や他のVBAを使用して入力された値だと反応しません。
今のVBAを応用して、関数やVBAで表示した値でも正しく作動するようにはできないでしょうか?

該当のソースコード(Sheet2に入力中)

Private Sub Worksheet_Change(ByVal Target As Range) Dim shpName Select Case Target.Address Case "$B$2" shpName = "図形1" Case "$B$3" shpName = "図形2" Case Else Exit Sub End Select If Target.Value = "異常" Then Worksheets("Sheet1").Shapes(shpName).Fill.Visible = msoTrue Worksheets("Sheet1").Shapes(shpName).Fill.ForeColor.SchemeColor = 2 '赤 ElseIf Target.Value = "警告" Then Worksheets("Sheet1").Shapes(shpName).Fill.Visible = msoTrue Worksheets("Sheet1").Shapes(shpName).Fill.ForeColor.SchemeColor = 4 '黄 Else Worksheets("Sheet1").Shapes(shpName).Fill.Visible = msoFalse End If End Sub

やりたいこと

1)Sheet1に図形配置(複数)が配置されている
2)Sheet2のチェックリストを入力すると内容に応じて指定のセル(今回のサンプルではB2・B3)に「異常」「警告」が表示
3)2の値が表示されるとSheet1の図形の色がそれぞれ赤・黄に変更

どうかよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

VBA

1Private Sub Worksheet_Change(ByVal Target As Range) 2 Call 異常判定 3End Sub 4 5Sub 異常判定() 6 7 Dim ws As Worksheet 8 Set ws = Worksheets("Sheet2") 9 10 Dim targetSheet As Worksheet 11 Set targetSheet = Worksheets("Sheet1") 12 13 With targetSheet.Shapes("図形1") 14 Select Case ws.Range("$B$2").Value 15 Case "異常" 16 .Fill.Visible = msoTrue 17 .Fill.ForeColor.SchemeColor = 2 '赤 18 Case "警告" 19 .Fill.Visible = msoTrue 20 .Fill.ForeColor.SchemeColor = 4 '黄 21 Case Else 22 .Fill.Visible = msoFalse 23 End Select 24 End With 25 26 With targetSheet.Shapes("図形2") 27 Select Case ws.Range("$B$3").Value 28 Case "異常" 29 .Fill.Visible = msoTrue 30 .Fill.ForeColor.SchemeColor = 2 '赤 31 Case "警告" 32 .Fill.Visible = msoTrue 33 .Fill.ForeColor.SchemeColor = 4 '黄 34 Case Else 35 .Fill.Visible = msoFalse 36 End Select 37 End With 38 39 End Sub 40 41 42

投稿2021/09/29 04:22

jinoji

総合スコア4592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

texDL

2021/10/05 22:00

回答ありがとうございます! このような書き方もできるのですね。 参考にさせていただきます。
guest

0

ベストアンサー

通常はVBAで入力してもWorksheet_Changeイベントは発動するはずなので、

VBAで入力する前に、Application.EnableEvents = False としてませんか。

それはないとういことなら、「関数や他のVBAを使用して入力」の内容を提示してください。

投稿2021/09/29 01:18

hatena19

総合スコア34075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

texDL

2021/09/29 03:27

お世話になります。 回答ありがとうございます。 現在質問内容にあるVBA以外何も設定していません。 例えばSheet2のB2を =IF(C2>=80,"異常","警告") 入力し、C3に数字を入力しても図形の色を変えることはできませんでした。試しに =C2 としC2セルに異常・警告の文字を入力しても作動しません。 お手数おかけしますが、よろしくお願いします。
hatena19

2021/09/29 03:56 編集

式の設定されたセルでは Changeイベントは発生しません。 提示のコードでは、 B2 または B3 が変更された時に処理してますので、Target はB2 または B3 です。 その隣のC2またはC3の値を調べないとだめですね。 If Target.Offset(,1).Value = "異常" Then Worksheets("Sheet1").Shapes(shpName).Fill.Visible = msoTrue Worksheets("Sheet1").Shapes(shpName).Fill.ForeColor.SchemeColor = 2 '赤 ElseIf Target.Offset(,1).Value = "警告" Then Worksheets("Sheet1").Shapes(shpName).Fill.Visible = msoTrue Worksheets("Sheet1").Shapes(shpName).Fill.ForeColor.SchemeColor = 4 '黄
texDL

2021/09/29 04:38

ありがとうございます。 教えてくださった Target.Offset(, 1)というのは一つ右のセルに変更があった場合という指示しょうか? 後出しで条件を追加して申し訳ございませんがC2のセルの内容を=SUM(D2:G2)とし、D2~G2の合計で判定したい場合はどのようなコードが必要でしょうか? また、現状下記のように変更しましたが色は変わりませんでした。 そもそもの理解が間違えているのでしょうか? Private Sub Worksheet_Change(ByVal Target As Range) Dim shpName Select Case Target.Address Case "$B$2" shpName = "図形1" Case "$B$3" shpName = "図形2" Case Else Exit Sub End Select If Target.Offset(, 1).Value = "異常" Then Worksheets("Sheet1").Shapes(shpName).Fill.Visible = msoTrue Worksheets("Sheet1").Shapes(shpName).Fill.ForeColor.SchemeColor = 2 '赤 ElseIf Target.Offset(, 1).Value = "警告" Then Worksheets("Sheet1").Shapes(shpName).Fill.Visible = msoTrue Worksheets("Sheet1").Shapes(shpName).Fill.ForeColor.SchemeColor = 5 '黄 Else Worksheets("Sheet1").Shapes(shpName).Fill.Visible = msoFalse End If End Sub 予備知識もほとんどなくお手数おかけしますが、よろしくお願いします。
hatena19

2021/09/29 05:14

あっ、勘違いしてました。B2、B3に式が設定されているのでしたね。 C2、C3の変更でB2、B3の表示が変わるので、 Dim shpName Select Case Target.Address Case "$C$2" shpName = "図形1" Case "$C$3" shpName = "図形2" Case Else Exit Sub End Select If Target.Offset(, -1).Value = "異常" Then Worksheets("Sheet1").Shapes(shpName).Fill.Visible = msoTrue Worksheets("Sheet1").Shapes(shpName).Fill.ForeColor.SchemeColor = 2 '赤 ElseIf Target.Offset(, -1).Value = "警告" Then Worksheets("Sheet1").Shapes(shpName).Fill.Visible = msoTrue Worksheets("Sheet1").Shapes(shpName).Fill.ForeColor.SchemeColor = 5 '黄 Else Worksheets("Sheet1").Shapes(shpName).Fill.Visible = msoFalse End If
hatena19

2021/09/29 05:17

> =SUM(D2:G2) なら、 If Not Intersect(Target, Range("D2:G3")) Then というように判断します。 式が参照しているセルが変更されたかどうかをチェックする必要があります。
texDL

2021/10/05 21:57

ありがとうございます。 お返事遅くなり大変申し訳ございませんでした。 思っていた通りの動作をするようになりました! またわからないことがあれば質問させていただきたいと思います、その時はぜひよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問