返回列表 上一主題 發帖

[發問] Calculate,能否回傳發生變動的儲存格的欄位

[發問] Calculate,能否回傳發生變動的儲存格的欄位

本帖最後由 ketrddem 於 2016-5-1 19:10 編輯

Worksheet_Calculate事件中
假設我指定的範圍為sheet1.Columns("A:S").Calculate(第一張表)
大約有300列

如果某個公式運算符合條件,就會變成「YES」,沒有符合條件,就是空白「" "」

請問,有沒有什麼方法能夠讓我在第一時間知道是那一個欄位產生變動呢

比方,儲存格「D5」,符合條件了,從空白值變成「YES」

程式就會回傳到sheet2,比方回傳值為「D5發生YES事件」(把發生的欄位回傳到第二張表)
EXCEL VBA新手,請前輩多多指教

本帖最後由 c_c_lai 於 2016-5-2 07:47 編輯

回復 1# ketrddem
提供參考:

ThisWorkbook::
  1. Sub Ex()
  2.     [A1] = 10
  3.     [B1] = 8
  4.     [A1] = 6
  5. End Sub
複製代碼
工作表1:
  1. Private Sub Worksheet_Calculate()
  2.     Dim target As Range
  3.     Set target = Range("C1")

  4.     '  If Not Intersect(target, Range("C1")) Is Nothing Then
  5.     If target.Value = "YES" Then
  6.         '  Run my VBA code
  7.         MsgBox "Worksheet_Calculate is Activvated!"
  8.     End If
  9. End Sub

  10. Private Sub Worksheet_Change(ByVal target As Range)
  11.     '  If Not Intersect(target, Range("C1")) Is Nothing Then
  12.     If target.Address = "$C$1" Then
  13.         '  MyMacro()
  14.         MsgBox "Worksheet_Change = " & target.Address
  15.     End If
  16. End Sub
複製代碼
請用 F8 來 Trace 來仔細觀察  Worksheet_Calculate() 以及
Worksheet_Change(ByVal target As Range) 是如何運作,
目前 {A1:B1] 均是以 Assign value 方式進行,但如果它們都為
公式帶入值可能 Worksheet_Change() 不會有動作,如 [C1]
內容值為: =IF(A1>B1, "YES", "NO")  一樣。
{A1:B1] 你可以帶入 DDE 公式 來觀察資料匯入時之動態狀況。

TOP

回復 2# c_c_lai

If target.Address = "C1" Then
須小修改為
If target.Address = "$C$1" Then
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

本帖最後由 c_c_lai 於 2016-5-2 07:48 編輯

回復 3# ML089
好久沒連繫了, 謝謝指證,疏忽了。
  1. target.Address = "$A$1" : True : Boolean
  2. target.Address = "A1"   : False : Boolean
複製代碼

TOP

回復 2# c_c_lai

執行的步驟跟我想像的邏輯有點不同,當A1值被改變時,C1公式才會連動(觸動)改變。
我覺得順序應該 A1改變,Worksheet_Change應該先被觸動,再來C1公式改變,而後 Worksheet_Change被觸動。
不知道有有何看法?



目前執行順序如下

VBA

STEP 1
[A1] = 10

STEP2 公式
C1 = IF(A1>B1, "YES", "NO")

STEP 3
Private Sub Worksheet_Calculate()

STEP 4
Private Sub Worksheet_Change(ByVal Target As Range)
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

回復 5# ML089
不好意思,出去到國稅局報稅,剛從外頭回來。

Step 1:
當 [A1] = 10,  Excel 系統會先觸動
Worksheet_Calculate() 然後接著再觸動
Worksheet_Change(ByVal target As Range)
這時 target 為 [A1];
[C1] 則由公式自動判斷,值為 "YES"
並未再觸發任何 Trigger。

Step 2:
當 [B1] = 8,Excel 系統會先觸動
Worksheet_Calculate() 然後接著再觸動
Worksheet_Change(ByVal target As Range)
這時 target 為 [B1];
[C1] 則由公式自動判斷,值為 "YES"
並未再觸發任何 Trigger。

Step 3:
當 [A1] = 6,  Excel 系統亦會先觸動
Worksheet_Calculate() 然後接著再觸動
Worksheet_Change(ByVal target As Range)
這時 target 為 [A1];
[C1] 則由公式自動判斷,值為 "NO",也
並未再觸發任何 Trigger。

公式值的變化,實際上並不會觸發任何知 Trigger
內在事件 (Event)。
假設 [A1]、[B1] 如為 DDE 匯入之公式,開盤後之
DDE 數據值的任何變動都不會去觸發 Worksheet_Change
至於 針對  [A1]、[B1] 兩欄的數據變動是否會牽動
Worksheet_Calculate() ,實有待實務觀察,
但如另一欄位設定為 =A1、或 =B1,則該欄位之數據異動
會牽動 Worksheet_Calculate() 、以及 Worksheet_Change() 的。

TOP

不好意思,可能小弟說明不清

D5只是個比方而已
其實發生變動 是在A2:S300的任何一個儲存格都可能發生

所以上面c_c_lai大大提供的範例,都是有指定欄位的變動

小弟想做的是,在A2:S300的範圍裏
不管那一個儲存格發生變動
都能獲得「發生變動的那個儲存格位址」
EXCEL VBA新手,請前輩多多指教

TOP

做個小小的說明,因為權限有限,不能貼附件:

A到S欄中,當中D欄公式設為「成交價>五日均線,AND 五日均量>十日均量,AND KD>30」
第一列到第300列當中,假設第150列為股號1101,當D150儲存格符合條件,就顯示YES。

問題來了,我想知道,現在D150正發生了變動

如果無法獲知變動的是D150這個儲存格

我就無法知道,股號1101,目前符合了我的挑股的條件,也就是「成交價>五日均線,AND 五日均量>十日均量,AND KD>30」的條件

於是乎

小弟想用CALCULATE方法,去做整張工作表設計

然後,發生變動的欄位,能得到該欄位的列號跟欄名,這樣子才能用OFFSET定位出是那一檔股票,以及在什麼條件下符合了。

再次感謝各位先進指導,再請不吝指教。謝謝。
EXCEL VBA新手,請前輩多多指教

TOP

回復 7# ketrddem
你實際跑一下程式,看它到底實際會觸動那些事件,便知。
如果是觸動 _Change 即可迅速得知觸動欄位的位址。如僅僅
只觸動 _Calculate 那就頭大了!

TOP

回復 8# ketrddem
你可以將檔案壓縮成 .rar 壓縮檔便能上傳了,
選用高級模式內的檔案上傳 (迴紋針)。

TOP

        靜思自在 : 改變自己是自救,影響別人是救人。
返回列表 上一主題