Board logo

標題: 堆疊空間不足?? [打印本頁]

作者: 藍天麗池    時間: 2016-9-13 21:28     標題: 堆疊空間不足??

Sub RecordPrice()
Dim WR As Long
Dim I As Byte


If Range("E2") < 1 Then Exit Sub

WR = Range("A1").End(xlDown).Row + 1
If (WR = 3) Or _
   ((Second(Range("A2")) Mod 5) = 1) Then '總量有異動時才記錄..........................這個地方有寫錯嗎??還是要怎麼改比較好??
    Cells(WR, 1).Resize(, 4) = [A2:D2].Value
   End If
End Sub

執行程式後為什麼會瘋狂寫入,且出現堆疊空間不足呢??
作者: stillfish00    時間: 2016-9-14 16:43

回復 1# 藍天麗池
你一定是在WorkSheet_Change()內呼叫該 Sub
導致 : 改Cell值 > 觸發 Change > Call RecordPrice >改Cell值 > 觸發 Change 。。。

建議 :
WorkSheet_Change  Event前後分別加上,避免內部行為再次觸發該Event
Application.EnableEvents = False
...
Application.EnableEvents = True
作者: c_c_lai    時間: 2016-9-14 17:02

回復 1# 藍天麗池
  1. WR = Range("A1").End(xlDown).Row + 1
複製代碼
請改成
  1. WR = Range("A" & Rows.Count).End(xlUp).Row + 1
複製代碼
試試看。
作者: 藍天麗池    時間: 2016-9-14 17:52

回復 2# stillfish00
S大你好小弟有兩個疑問跟你請教一下

1.我程式裡面沒有WorkSheet_Change(),
但有Private Sub Worksheet_Calculate()
        Application.EnableEvents = False.............所以是加在這邊
        Call RecordPrice
        Application.EnableEvents = True..............還有這邊嗎??
        End Sub

2.S大還沒說之前我是加在
Sub RecordPrice()
Dim WR As Long
Dim I As Byte


If Range("E2") < 1 Then Exit Sub

WR = Range("A1").End(xlDown).Row + 1
If (WR = 3) Or _
   ((Second(Range("A2")) Mod 5) = 1) Then
    Application.EnableEvents = False.................這邊
    Cells(WR, 1).Resize(, 4) = [A2:D2].Value
   Application.EnableEvents = True...................還有這邊
   End If
End Sub

我加完後就可以執行了,請教S大我第一個家的地方對嗎??如果對,那跟第二個加的地方執行起來會有什麼不同呢?
作者: 藍天麗池    時間: 2016-9-14 18:14

回復 3# c_c_lai

C大測試後一樣堆疊空間不足,我昨天是用2#的方法,用Application.EnableEvents去解決的,但是對於加在那裡不是很清楚,C大可以看看4#再給我一些意見
作者: c_c_lai    時間: 2016-9-14 18:21

回復 5# 藍天麗池
你應該請教 stillfish00 大大的。
  1. Sub RecordPrice()
  2.     Dim WR As Long
  3.     Dim I As Byte

  4.     If Range("E2") < 1 Then Exit Sub
  5.     Application.EnableEvents = False
  6.     .
  7.     .
  8.     .
  9.     Application.EnableEvents = True
  10. End Sub
複製代碼

作者: 藍天麗池    時間: 2016-9-14 18:23

回復 6# c_c_lai

C大我也有請教他,另外
Private Sub Worksheet_Calculate()
        Application.EnableEvents = False.............所以是加在這邊
        Call RecordPrice
        Application.EnableEvents = True..............還有這邊嗎??
        End Sub
..............................................................................................................................................................................

Sub RecordPrice()
Dim WR As Long
Dim I As Byte


If Range("E2") < 1 Then Exit Sub

WR = Range("A1").End(xlDown).Row + 1
If (WR = 3) Or _
   ((Second(Range("A2")) Mod 5) = 1) Then
    Application.EnableEvents = False.................這邊
    Cells(WR, 1).Resize(, 4) = [A2:D2].Value
   Application.EnableEvents = True...................還有這邊
   End If
End Sub

加在上面這兩個地方有甚麼不同??
作者: c_c_lai    時間: 2016-9-14 18:29

回復 7# 藍天麗池
你自己先測試觀察有何差異?
答案是一樣的。
差別僅在於你洗澡時將換洗衣服放在臥室與事先拿進浴室
有何差別?
作者: 藍天麗池    時間: 2016-9-14 18:35

回復 8# c_c_lai


    C大我了解了
作者: 准提部林    時間: 2016-9-15 10:28

Private Sub Worksheet_Calculate()
Application.EnableEvents = False
Call RecordPrice
Application.EnableEvents = True
End Sub

有人進教室時
全體起立
敬禮
全體坐下
================================
Private Sub Worksheet_Calculate()
If 條件判斷 = True Then
 Application.EnableEvents = False
 Call RecordPrice
 Application.EnableEvents = True
End If
有人進教室時
如果進來的是老師
全體起立
敬禮
全體坐下
End Sub

假設進來的有100個人次,而老師只有5人,試想看看兩種狀況差別多少??? 
 
 
作者: 藍天麗池    時間: 2016-9-15 11:13

回復 10# 准提部林


    準大我了解了,感謝你




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)