[[20200131074745]] 『Worksheet_Changeについて』(泰裕) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『Worksheet_Changeについて』(泰裕)

VBA初心者です。
以下を参照して、Enterキーを押さずに、特定のBF2セルに関数が入っていて、その結果が変わると、値が変わるようにしたいと思っているのですが、以下の現状では、変わりません。
アドバイスいただければ幸いです。宜しくお願いいたします。

Private Sub Worksheet_Change(ByVal Target As Range)

     If Target.Count > 1 Then Exit Sub
     If Target.Address <> "$BF$2" Then Exit Sub
     If Target.Value <> "" And IsNumeric(Target.Value) Then
         Application.EnableEvents = False
         Call Posting_Output
         Application.EnableEvents = True
     End If
End Sub

< 使用 Excel:Office365、使用 OS:Windows10 >


 計算結果でChangeイベントは動きません。
 なので、BF2セルが参照しているセル(数式に入力されているセルをコードに記す)が変更された場合、に変更されてはいかがですか?
 例えばBF2に入力されている式が、=A1+B1であれば、
 If Target.Address <> "$BF$2" Then Exit Sub
 の部分を
 Select Case Target.Address(0, 0)
     Case "A1", "B1"
         Application.EnableEvents = False
         Call Posting_Output
         Application.EnableEvents = True
     Case Else
         Exit Sub
 End Select
 などど修正してみてはどうですか?

(稲葉) 2020/01/31(金) 08:24


 (1) Worksheet_Calculate を使う
     ただし、どこが再計算されたセルかはわからないので、
   毎回調べることになります。

 (2) ユーザー定義関数にする。
     Posting_Outputが 何をしているのか書いないのでわかりませんが、
     >特定のBF2セルに関数が入っていて、その結果が変わると、値が変わるようにしたい
     のであれば、ユーザー定義関数にするのが一番妥当
(´・ω・`) 2020/01/31(金) 08:37

早速のご返事ありがとうございます。
そのA1には西暦の4桁数字、B1には文字列なのです。
結果、ご指示いただいたものに修正しましたが、作動しません。
BF2には、B1セルの文字列を以下の関数で数字に変えています。
BF2=$A$1*100+VLOOKUP($B$1,$J$4:$K$23,2,FALSE)
今一度、アドバイスのほどお願いいたします。
(泰裕) 2020/01/31(金) 08:43

 >Enterキーを押さずに、特定のBF2セルに関数が入っていて、
 >その結果が変わると、値が変わるようにしたい

セル内編集中にマクロの起動はできません。(再計算もされないですよね?)
そういった挙動を実現したければ、
シート上にActiveXコントロールのテキストボックスを配置しそこに入力します。

セルにリンクさせて、再計算を強制したら行けるかも?(アイデアだけ実装したことはありません)
(まっつわん) 2020/01/31(金) 09:13


 まっつわんさん
 >セル内編集中にマクロの起動はできません。(再計算もされないですよね?)
 もちろんセルの編集中は再計算されません。なので計算結果も変わりません。
 なので、
 >特定のBF2セルに関数が入っていて、その結果が変わると
 関数の結果が変わるということは、編集が確定されて再計算されているということ。

 もいちど書きますが、BF2セルを参照するユーザー定義関数を作成するのが一番簡単です。
 ただし、ユーザー定義関数でできることには限りがあるので、
 やりたいことの内容によります。
(´・ω・`) 2020/01/31(金) 09:29

 この種の質問は珍しくないですが、仕様が曖昧なことが多いです。

 つまり、この意味が厳密に意識されていない。
       ↓
 >その結果が変わると

 計算諸ファクターに変化は有ったのだが、結果値が前と同じだった場合、
 Posting_Outputを作動させるのか、させないのか。

 作動させないとなると、以前の値は何だったかを判定しなければならなくなります。
 それは結構厄介なので、まずその点を明らかにして貰った方がいいと思う。

(半平太) 2020/01/31(金) 10:07


 >     If Target.Count > 1 Then Exit Sub
 >     If Target.Address <> "$BF$2" Then Exit Sub
 >     If Target.Value <> "" And IsNumeric(Target.Value) Then

 ついでに気になったこと。

  1行目のチェックは、2行目のチェックに含まれるので不要です。

  BF2セルの数式にVLOOKUP関数が使用されているので、
  該当なしだった場合、トラブる可能性があります。

(半平太) 2020/01/31(金) 10:27


 >まっつわんさん
 >>セル内編集中にマクロの起動はできません。(再計算もされないですよね?)
 >もちろんセルの編集中は再計算されません。なので計算結果も変わりません。
 >なので、
 >>特定のBF2セルに関数が入っていて、その結果が変わると
 >関数の結果が変わるということは、編集が確定されて再計算されているということ。

 >Enterキーを押さずに

 >その結果が変わると

どっちに主眼を置くかですね。

Enterキーを押さずにどんどん結果を変えてみたいかと思いましたが。。。。

(まっつわん) 2020/01/31(金) 11:20


 どう書き替えたらできなかったんですかね?
 ユーザー定義関数は良い案ですね。
 Call Posting_Output
 がどのような処理なのかわかれば、もう少し具体的にアドバイスできそうですね。
(稲葉) 2020/01/31(金) 12:34

 > どう書き替えたらできなかったんですかね?

 現実的には問題ないのでしょうが、理屈としては
 第2引数の変更もウォッチする必要があるので、Addressプロパティだと苦しいかもです。
         ↓
 VLOOKUP($B$1,$J$4:$K$23,2,FALSE) 

(半平太) 2020/01/31(金) 13:20


 Adrressでダメなら・・・Intersect?
 ずれにしろご指摘されている通り、
 「値が同じだった場合」の処置がわからないと手が出せませんね。
 調べたら使ったことないプロパティで.Precedentsなんてあったので、同じシート内で完結するなら
 これでもいいかもしれませんね。
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Intersect(Target, Range("BF2").Precedents) Is Nothing Then
            Exit Sub 'Precedentsはシートをまたぐ参照に対応していない
        Else
            '処理
        End If
    End Sub

(稲葉) 2020/01/31(金) 14:20


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.