Board logo

標題: 請問此程序宣告用那個較省資源?? [打印本頁]

作者: t8899    時間: 2014-10-12 14:45     標題: 請問此程序宣告用那個較省資源??

本帖最後由 t8899 於 2014-10-12 14:51 編輯

1. 請問此程序宣告用那個(或如何修改)較省資源??
2. 用 Private Sub Worksheet_Change() 為何出現 事件程序的宣告與同名事件的描述不相符

Private Sub Worksheet_Calculate()
' Private Sub Worksheet_Change(ByVal Target As Range)
'  Private Sub Worksheet_Change()

Dim rng As Range
For Each rng In Range("AL5:AL15")  'Range("AL5:AL15") 為dde連結
m = rng - rng.Offset(0, 9)
'------------------------------
If m > rng.Offset(0, 8) Then
MsgBoxTest 0, rng.Offset(0, -1) & "  注意 ", "提示訊息", vbSystemModal, 0, 2000
  Application.EnableEvents = False
rng.Offset(0, 9) = rng
Application.EnableEvents = True
End If
'------------------------------------------
If m < -rng.Offset(0, 8) Then
MsgBoxTest 0, rng.Offset(0, -1) & " 注意 ", "提示訊息", vbSystemModal, 0, 2000
  Application.EnableEvents = False
rng.Offset(0, 9) = rng
Application.EnableEvents = True
End If
'------------------------------------------------
Next
End Sub
作者: GBKEE    時間: 2014-10-13 05:45

本帖最後由 GBKEE 於 2014-10-13 08:53 編輯

回復 1# t8899


   
1. 請問此程序宣告用那個(或如何修改)較省資源??
2. 用 Private Sub Worksheet_Change() 為何出現 事件程序的宣告與同名事件的描述不相符
依據你的需求宣告變數的型態 與 哪一個較省資源無關?
請詳看VBA的說明
  1. Dim A As Integer, B As Long, C As Single, D As Double
複製代碼
Private Sub Worksheet_Change(ByVal Target As Range)是工作表模組的預設事件程序
你不可以在工作表模組中另使用所有的預設事件程序的名稱,做為程序的名稱

工作表模組的預設事件程序 如圖

[attach]19326[/attach]
作者: t8899    時間: 2014-10-13 06:48

本帖最後由 t8899 於 2014-10-13 06:59 編輯
回復  t8899


    依據你的需求宣告變數與哪一個較省資源無關?
請詳看VBA的說明Private Sub Workshee ...
GBKEE 發表於 2014-10-13 05:45


1.target 是指作用儲存格,還是一塊區域?
2.Private Sub Worksheet_Calculate()
   Private Sub Worksheet_Change(ByVal Target As Range)
此兩種宣告有何不同?
作者: GBKEE    時間: 2014-10-13 06:59

本帖最後由 GBKEE 於 2014-10-13 07:35 編輯

回復 3# t8899
可在工作表上 選取多重範圍然後按下刪除鍵
試試看
  1. Option Explicit
  2. Private Sub Worksheet_Change(ByVal Target As Range)
  3.     MsgBox Target.Count
  4.     'Dim e As Range
  5.     ' For Each e In Target
  6.     '   MsgBox e.Address
  7.     ' Next
  8. End Sub
複製代碼
Private Sub Worksheet_Change()
沒有預設事件所設立的參數,視為一般程序,所以VBA發出編譯錯誤的信息
** 程式名稱 ,變數的宣告 皆須避免使用與VBA上的關鍵字(物件,函數,屬性,方法)相同的文字 **
作者: t8899    時間: 2014-10-13 07:23

回復  t8899  
可在工作表上 選取多重範圍然後按下刪除鍵
試試看Private Sub Worksheet_Change()
沒有預 ...
GBKEE 發表於 2014-10-13 06:59


1.Set rg = Intersect(Target, Range("AL5:AL15"))
For Each cl In rg
2.For Each rg In Range("AL5:AL15")
請教此兩種語法有何不同???
作者: GBKEE    時間: 2014-10-13 07:55

本帖最後由 GBKEE 於 2014-10-13 07:57 編輯

回復 5# t8899

[attach]19328[/attach]
  1. Option Explicit
  2. Private Sub Ex()
  3.     My_Worksheet_Change Selection   '程式 (傳遞參數)
  4. End Sub
  5. Private Sub My_Worksheet_Change(ByVal T As Range)
  6.     Dim Rg As Range, e As Range
  7.     'Intersect 方法 傳回 Range 物件,此物件代表兩個或多個範圍重疊的矩形範圍。
  8.     MsgBox T.Address
  9.     Set Rg = Intersect(T, Range("AL5:AL15"))
  10.     If Rg Is Nothing Then Exit Sub
  11.     MsgBox Rg.Address
  12.     'For Each...Next 陳述式 針對一個陣列或集合中的所有元素,重複執行一段陳述式。
  13.     For Each e In Rg
  14.         MsgBox e.Address
  15.     Next
  16.     For Each e In Range("AL5:AL15")
  17.         MsgBox e.Address
  18.     Next
  19. End Sub
  20. Private Sub Worksheet_Change(ByVal T As Range) 'Target 變數名稱 可修改
  21.     Dim Rg As Range, e As Range
  22.     MsgBox T.Address
  23.     Set Rg = Intersect(T, Range("AL5:AL15"))
  24.     If Rg Is Nothing Then Exit Sub
  25.     MsgBox Rg.Address
  26.     For Each e In Rg
  27.         MsgBox e.Address
  28.     Next
  29.     For Each e In Range("AL5:AL15")
  30.         MsgBox e.Address
  31.     Next
  32. End Sub
複製代碼

作者: t8899    時間: 2014-10-13 08:46

回復  t8899
GBKEE 發表於 2014-10-13 07:55


謝謝指導!




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