返回列表 上一主題 發帖

[發問] 此巨集為何錯??

本帖最後由 t8899 於 2013-8-7 19:25 編輯
luhpro 發表於 2013-8-6 23:25

下面 兩組條件同時達到條件
不知為何第二組的對話盒不會自動關閉
如果把第二組與第一組先後互換,又換第一組不會自動關閉
  Private Sub Worksheet_Calculate()
      Dim sStr$
Dim ZZ As Range
      sStr = ""
       sStr2 = ""
   For Each ZZ In Range("c2:c111")
    If Not IsError(ZZ) Then
      If ZZ > ZZ.Offset(, 26) * Range("S26").Value And Range("Q26").Value = 1 And flag = True Then
        If sStr <> "" Then sStr = sStr & Chr(10)
        sStr = sStr & "漲漲漲--與上一盤===> " & Cells(ZZ.Row, 2).Value & "=====> " & Round((ZZ - ZZ.Offset(, 26)) / ZZ.Offset(, 26).Value, 4) * 100
                  End If
                       If ZZ < ZZ.Offset(, 26) * Range("R26").Value And Range("Q26").Value = 1 And flag = True Then
        If sStr2 <> "" Then sStr2 = sStr2 & Chr(10)
        sStr2 = sStr2 & "跌跌跌--與上一盤===> " & Cells(ZZ.Row, 2).Value & "=====> " & Round((ZZ - ZZ.Offset(, 26)) / ZZ.Offset(, 26).Value, 4) * 100
             End If
    End If
       Next
      
    '第一組
      If sStr2 <> "" Then
  CreateObject("Wscript.shell").Popup sStr2, 2, "Auto Closed MsgBox", 64
    Range("Q26").Value = 2
    Application.OnTime Now + TimeValue("00:00:15"), "fff"
     End If
     '第二組
     If sStr <> "" Then
  CreateObject("Wscript.shell").Popup sStr, 2, "Auto Closed MsgBox", 64
   Range("Q26").Value = 2
   Application.OnTime Now + TimeValue("00:00:15"), "fff"
        End If
End Sub

TOP

下面 兩組條件同時達到條件
不知為何第二組的對話盒不會自動關閉
如果把第二組與第一組先後互換,又換第 ...
t8899 發表於 2013-8-7 19:22

我猜應該是這個函數只有(或是不管呼叫幾次都共用)一個計數器,
當此計數器歸零後除非再次觸發(再呼叫)才會重新計數.

TOP

我猜應該是這個函數只有(或是不管呼叫幾次都共用)一個計數器,
當此計數器歸零後除非再次觸發(再呼叫)才會 ...
luhpro 發表於 2013-8-7 23:11


詳細測試  原來是 第一組的 Application.OnTime Now + TimeValue("00:00:15"), "fff" 的問題
拿掉就正常,不知有無辦法解決此問題?

TOP

回復 23# t8899
剛剛想到一個不一定符合你需求的辦法,

在 CreateObject 指令上方放一個條件式,
若還有 CreateObject 指令執行中的話, (分別在兩個 CreateObject 上方放 bFlag1或2 = true下方則設該值為False 作為是否執行中的判斷 )
就暫停兩秒後再執行 CreateObject 指令,
讓其依續錯開,
缺點是若觸發的太頻繁,
可能程式會因為來不及消化而發生異常.

TOP

回復  t8899
剛剛想到一個不一定符合你需求的辦法,
luhpro 發表於 2013-8-9 00:15

之前的問題, 測試某指定範圍儲存格超過1%就通知
DDE 連結取得數據有誤 ??
測得 F2:F54 任一欄位變動超過1%, 以MSBOX通知
開檔不更新一切正常(直接改鍵盤輸入是正常)
但更新後會錯在
If Val(sz(i, 1)) = 0# Then  此行
型態不符合??不知如何解決? (已附檔) teMP.rar (43.12 KB)

TOP

回復 25# t8899
你的sz(i, 1) 我看到的值是 : 錯誤 2023
這在 VB 來看是一個 字串,
它不讓用 Val() 來轉換成數字,(所以會出現 13 的錯誤)
我建議用 CLng( 來取代 Val(
全部代換即可. (當然前提是類似上述字串的內容, 你仍然希望經過該 Sub 而不是做例外處理)
  1. Sub 檢查()
  2.     Dim n, sz1, str As String

  3.     sz1 = Sheets("Sheet1").Range("F2:F54")
  4.     str = ""
  5.     For i = 1 To UBound(sz1)
  6.         If CLng(sz(1, 1)) = 0 Then
  7.             If CLng(sz1(i, 1)) <> 0# Then str = str & vbCrLf & "單元格 F" & i + 1 & " =========" & "  B" & i + 1 & "=" & Sheets("Sheet1").Cells(i + 1, 2).Value
  8.         Else
  9.             n = Round((CLng(sz1(i, 1)) - CLng(sz(i, 1))) / CLng(sz(i, 1)) * 100, 2)
  10.              If Abs(n) >= 1 Then str = str & vbCrLf & Sheets("Sheet1").Cells(i + 1, 2).Value & "===>" & n
  11.         End If
  12.     Next i

  13.     If Len(str) > 0 Then
  14.         sz = Sheets("Sheet1").Range("F2:F54")
  15.        ' MsgBox str, , "提示"
  16.           CreateObject("Wscript.shell").Popup "" & str, 3, "Auto Closed MsgBox", 64
  17.     End If
  18. End Sub
複製代碼

TOP

回復  t8899
你的sz(i, 1) 我看到的值是 : 錯誤 2023
這在 VB 來看是一個 字串,
它不讓用 Val() 來轉換 ...
luhpro 發表於 2013-8-12 22:51

謝謝
測試沒問題了
我想再最後加上輸出,變動前,跟變動後的值

TOP

回復 27# t8899
抱歉, 已解決
& sz(i, 1) & "===>" & sz1(i, 1)

TOP

本帖最後由 t8899 於 2013-8-13 22:13 編輯

計算有誤 ????

     變動後              變動前                    變動前   
(CLng(sz1(i, 1)) - CLng(sz(i, 1))) / CLng(sz(i, 1)) * 100

左第一個數字===>漲幾%
第二個數字 ===>變動前
第三個數字 ===>變動後

像第一個兆豐金正確應為 漲7.29  (不是 8.7 )
矽品也不對
1020814.jpg

TOP

回復 29# t8899
晤...
若是會有小數出現的數值,
那就要把 CLng(  用 CSng( 來取代就可以了.

TOP

        靜思自在 : 我們要做好社會的環保,也要做好內心的環保。
返回列表 上一主題