Board logo

標題: [發問] 請先進們協助偵錯 [打印本頁]

作者: mnsmrtl    時間: 2018-9-3 13:07     標題: 請先進們協助偵錯

  1. Sub Pattern(Rng As Range, xCode, xDate As Range)
  2.     Dim H As Range, L As Range, C As Range, rh As Range, rl As Range
  3.     Dim Tf1 As Boolean, Tf2 As Boolean
  4.     Dim i, j, k, th, tl, sw
  5.     i = 0: j = 0: k = 0
  6.     th = 0: tl = 0: sw = 0
  7.     Do While i < 8 '取6個點
  8.         Set H = grabData("高", xCode, xDate).Offset(0, j)
  9.         Set L = grabData("低", xCode, xDate).Offset(0, j)
  10.         Set C = grabData("收", xCode, xDate).Offset(0, j)
  11.         If j > 300 Then Exit Do '限制資料庫範圍
  12.         If C <> "" Then
  13.             k = k + 1 '計數
  14.             If k = 1 Then GoSub RefreshHL
  15.             Tf1 = sw >= 0 And C < tl * 0.9
  16.             Tf2 = sw <= 0 And C > th * 1.1
  17.             If Tf1 Or Tf2 Then
  18.                 GoSub MoveAndSwitch
  19.                 GoSub WriteDataIn
  20.                 GoSub RefreshHL
  21.             Else
  22.                 Set rh = IIf(H > rh, H, rh)
  23.                 Set rl = IIf(L < rl, L, rl)
  24.                 th = IIf(H < th, H, th)
  25.                 tl = IIf(L > tl, L, tl)
  26.                 GoSub WriteDataIn
  27.             End If
  28.         End If        
  29.         Debug.Print sw & "_" & j & "_" & k & "_" & i
  30.         j = j + 1
  31.     Loop
  32. Exit Sub
複製代碼
在do while迴圈內,debug.print的結果,j都是從102開始,不知道是哪裡錯了
請大家幫忙看看
謝謝大家
作者: a5007185    時間: 2018-9-3 14:17

建議你先用「監看式」追蹤,
因為你程式裡面還有其他程序參雜其中,
我把其他程序拿掉後並沒有發現異狀。
作者: mnsmrtl    時間: 2018-9-3 15:35

本帖最後由 mnsmrtl 於 2018-9-3 15:38 編輯
  1. Sub Ac抓警示()
  2.     Call GetAlarm(1)
  3. End Sub

  4. Sub GetAlarm(Nd)
  5.     Dim xRow%, xCode, xDate As Range, i, j, writeIn As Range
  6.     Call A關閉
  7.     xRow = Sheets("基本").[A1].End(xlDown).Row
  8.     For i = 2 To xRow
  9.         With Sheets("基本")
  10.             xCode = .Cells(i, "A")
  11.             Set writeIn = .Range(.Cells(i, "C"), .Cells(i, "T")) '型態高低    寫入資料範圍
  12.         End With
  13.         Set xDate = Sheets("收").Cells(1, 3).Offset(0, Nd - 1) '根據參數修改起始天數
  14.         Call Pattern(writeIn, xCode, xDate)
  15.     Next i
  16.     Call A開啟
  17. End Sub

  18. Function grabData(Sht$, xCode, xDate As Range) '從資料庫抓取數據
  19.     Dim matC, matD
  20.     With Sheets(Sht)
  21.         matC = WorksheetFunction.Match(xCode, .Columns(1), 0)
  22.         matD = WorksheetFunction.Match(xDate, .Rows(1), 0)
  23.         Set grabData = .Cells(matC, matD)
  24.     End With
  25. End Function

  26. Function fbdate(Rng As Range) '按儲存格找「日期」
  27.     Set fbdate = Sheets(Rng.Worksheet.Name).Cells(1, Rng.Column)
  28. End Function

  29. Sub Pattern(Rng As Range, xCode, xDate As Range)
  30.     Dim H As Range, L As Range, C As Range, rh As Range, rl As Range
  31.     Dim Tf1 As Boolean, Tf2 As Boolean
  32.     Dim i, j, k, th, tl, sw
  33.     Rng.ClearContents
  34.     i = 0: j = 0: k = 0
  35.     th = 0: tl = 0: sw = 0
  36.     Do While i < 8 '取6個點
  37.         Set H = grabData("高", xCode, xDate).Offset(0, j)
  38.         Set L = grabData("低", xCode, xDate).Offset(0, j)
  39.         Set C = grabData("收", xCode, xDate).Offset(0, j)
  40.         If j > 300 Then Exit Do '限制資料庫範圍
  41.         If C <> "" Then
  42.             k = k + 1 '計數
  43.             If k = 1 Then GoSub RefreshHL
  44.             Tf1 = sw >= 0 And C < tl * 0.9
  45.             Tf2 = sw <= 0 And C > th * 1.1
  46.             If Tf1 Or Tf2 Then
  47.                 GoSub MoveAndSwitch
  48.                 GoSub WriteDataIn
  49.                 GoSub RefreshHL
  50.             Else
  51.                 Set rh = IIf(H > rh, H, rh)
  52.                 Set rl = IIf(L < rl, L, rl)
  53.                 th = IIf(H < th, H, th)
  54.                 tl = IIf(L > tl, L, tl)
  55.                 GoSub WriteDataIn
  56.             End If
  57.         End If
  58.         Debug.Print H.Column
  59.         j = j + 1
  60.     Loop
  61. Exit Sub
  62. MoveAndSwitch:
  63.     i = i + 1
  64.     sw = IIf(sw >= 0, -1, 1)
  65.     Return
  66. WriteDataIn:
  67.     If i < 7 And i > 0 Then
  68.         Rng(i) = IIf(sw = 1, rh, rl)
  69.         Rng(i + 6) = fbdate(IIf(sw = 1, rh, rl))
  70.         Rng(i + 12) = k
  71.     End If
  72.     Return
  73. RefreshHL:
  74.     Set rh = H
  75.     Set rl = L
  76.     th = H
  77.     tl = L
  78.     Return
  79. End Sub
複製代碼
因為檔案壓縮後也是超過1MB,所以我把有用到的程式碼集中放一起再貼一次
對於變數J,在其他程序沒有做什麼動作
檔案內,是各股票的每日開盤四價及成交量
如圖[attach]29322[/attach]


監看式的部分,我要再查一下資料,看怎麼用…謝謝樓上指點

上傳到MEGA空間了,大約15M,網址如下
https://mega.nz/#!uTZkGI4K!XtnUzYtIyzsHBFPNF4hGrcroUtzdO8UthkdFSorPVxk
作者: a5007185    時間: 2018-9-3 16:29

回復 3# mnsmrtl

監看式的方式如下圖,
[attach]29324[/attach]

但我測試下來並沒有發現任何異狀,
我無法重現你的問題。
[attach]29325[/attach]
作者: mnsmrtl    時間: 2018-9-3 16:54

不知道哪出了問題,我版本是2007,不知道跟這有沒有關係
[attach]29326[/attach]
作者: a5007185    時間: 2018-9-4 09:32

回復 5# mnsmrtl

監看是針對變數做監看,
所以如果你想要監看你圖中的訊息的話,
你需要把Debug.Print 去掉
作者: mnsmrtl    時間: 2018-9-4 11:05

回復 6# a5007185

經修改後,我發現程式有執行,但是debug.Print未顯示
不知道是哪出了問題,謝謝樓上指導
作者: a5007185    時間: 2018-9-4 14:16

回復 7# mnsmrtl


原程式碼不需要更動,
我的意思是說你在進行監看的時候,
需要把Debug.Print去掉。

[attach]29336[/attach]
作者: mnsmrtl    時間: 2018-9-4 20:29

回復 8# a5007185

哇哦,還讓您做影片,真不好意思
監看式問題已解決,不過在即時運算視窗內,依然只顯示102之後
但寫入儲存格的部分,確實有100以內的
可能是顯示問題,或是記憶體不足吧…?

網路上的文章是有提過,有可能因為值不存在,所以沒顯示出來
或許是其中一個變數到102之後才有?

總之,比對儲存格的內容之後,我發現程序的邏輯也不太對,所以整個都修改了
目前已沒有問題,謝謝您的幫助,感恩
作者: a5007185    時間: 2018-9-5 15:32

回復 9# mnsmrtl

我想你程式應該都是正常運作的,
只不過因為「即時運算」容納不了這麼多資料,
所以把一部分資料吃掉了。

[attach]29344[/attach]
我寫了簡易的迴圈,
讓他吐出250行資料,
拉到頂只剩下52行,
我的推測是「即時運算」最多能夠容納200行資料,
剛剛的測試當中加上底下空白2行,恰好就是200行,
以上給你做個參考。

另外建議你可以利用F8的功能逐步執行程式在搭配「監看式」,
這樣你就可以了解整個程式每個變數的運作了。
希望以上可以幫助到你。
作者: mnsmrtl    時間: 2018-9-6 08:06

回復 10# a5007185

原來如此,感謝您的分享
我就沒想到可以這樣測試,學到了~




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