返回列表 上一主題 發帖

[發問] 當某個儲存格數值>50,則立即記錄指定欄位的值(求VBA)

有重新計算就會觸動 Worksheet_Calculate, 無法延後2分鐘,
故改用每2分鐘檢查一次(不是記錄一次), 事實上有差嗎?
你的意思是 發現 [C13] > 50 就延後2分鐘記錄,
這跟每2分鐘檢查一次(不是記錄一次), 發現 [C13] > 50 再記錄,
有差嗎?

TOP

本帖最後由 peter95 於 2017-2-22 22:39 編輯

回復 11# yen956

謝謝 yen956大大 熱情的幫忙
真的很感謝你


小的的意思 是
當我開啟 我的EXCEL檔時
你的VBA 就開始檢查  [C13]
但剛開啟EXCEL檔時
資料量是完全沒有進來的

所以 [C13] 那個儲存格會顯示 #N/A  就是沒資料
則VBA 就會 顯示錯誤

不曉得 有無辦法 將此情形 克服
~~~~~~~~~~~~~~~~~~~~~~~~~


學習 學習 一直學習

TOP

本帖最後由 yen956 於 2017-2-23 09:46 編輯

回復 12# peter95
是的, 每2分鐘檢查一次和延後2分鐘記錄的確不一樣,
有可能每個檢查點都是低點,而錯過高點
替代方案:
新增暫存表 sheet4, 將 Worksheet_Calculate 的結果全部暫放暫存表 sheet4,
再每2分鐘從暫存表 sheet4 中選取 [C13] 最高值那列
複製到 Sheet3, 如何?

'放Module
'借用 Hsieh版大的 onTime, 請放在 Module
'http://forum.twbts.com/thread-19283-1-2.html
'從早上8點到下午5點每2分鐘執行 "Copy_test" 1次
Sub OnTime_test()
    Dim t
    For t = TimeValue("08:00:00") To TimeValue("17:00:00") Step TimeValue("00:02:00")
       Application.OnTime t, "Copy_test"
    Next
End Sub

Sub Copy_TEST()
    Dim LstR3 As Integer, LstR4 As Integer, sh3 As Object, sh4 As Object
    Set sh3 = Sheets("Sheet3")
    Set sh4 = Sheets("Sheet4")
    LstR3 = sh3.[A65536].End(xlUp).Row + 1       '取得 "Sheet3" 欄A最下面非空白格的下一格 的列號
    LstR4 = sh4.[A65536].End(xlUp).Row            '取得 "Sheet4" 欄F最下面非空白格的列號
    If sh4.[A1] = "" Then Exit Sub
    '按 sh4.[F1] 降冪排序
    sh4.[A1].Resize(LstR4, 6).Select
    Selection.Sort _
        Key1:=sh4.[F1], Order1:=xlDescending, _
        Header:=xlNo
    sh4.[A1].Resize(1, 4).Copy sh3.Cells(LstR3, 1)
    '清除sheet4, 重新供 Worksheet_Calculate 暫存
    sh4.Cells() = ""
End Sub

'下面同樣放 Sheet2
Private Sub Worksheet_Calculate()
    Dim Rng As Range, LstR As Integer, sh4 As Object
    Set sh4 = Sheets("Sheet4")
    If Not Application.IsNumber([C13]) Then Exit Sub    '沒資料就跳出
    LstR4 = sh4.[A65536].End(xlUp).Row      '取得 "Sheet4" 欄A最下面非空白格的列號
    If [C13] > 50 Then
        [A17].Resize(1, 4).Copy
        sh4.Cells(LstR4, 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
            SkipBlanks:=False, Transpose:=False
        [C13].Copy                         '[C13]的值也保留到Sheet4欄F
        sh4.Cells(LstR4, 6).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
            SkipBlanks:=False, Transpose:=False
    End If
End Sub

TOP

每2分鐘則可借用 Hsieh版大的 onTime, 如下:

Worksheet_Calculate 刪除, 改用 Hsieh版大的 onTime
請放在 Module
http://forum.twbts.com/thread-19283-1-2.html
'從早上8點到下午5點每2分鐘執行 "Copy_test" 1次
Sub OnTime_test()
    Dim t
    For t = TimeValue("08:00:00") To TimeValue("17:00:00") Step TimeValue("00:02:00")
       Application.OnTime t, "Copy_test"
    Next
End Sub

Sub Copy_TEST()
    Dim LastR As Integer, sh2 As Object, sh3 As Object
    Set sh2 = Sheets("Sheet2")
    Set sh3 = Sheets("Sheet3")
    LastR = sh3.[A65536].End(xlUp).Row + 1       '取得 "Sheet3" 欄A最下面非空白格的下一格 的列號
    If sh2.[C13] > 50 Then
        sh2.[A17].Resize(1, 4).Copy
        sh3.Cells(LastR, 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
    End If
End Sub
yen956 發表於 2017-2-22 20:06

請問大大 是放在模組嗎??

小弟有放但是 沒有執行COPY
請問我可以修正哪裡
感謝
學習 學習 一直學習

TOP

請問各位大大,這個用於RTD程式中,好像只會隨程式資料的跳動,也沒判斷就直接COPY資料進去,請問各位大大知道什麼原因?謝謝
大家好

TOP

        靜思自在 : 人的心地是一畦田,土地沒有播下好種子,也長不出好的果實。 -
返回列表 上一主題