標題:
[發問]
請先進們協助偵錯
[打印本頁]
作者:
mnsmrtl
時間:
2018-9-3 13:07
標題:
請先進們協助偵錯
Sub Pattern(Rng As Range, xCode, xDate As Range)
Dim H As Range, L As Range, C As Range, rh As Range, rl As Range
Dim Tf1 As Boolean, Tf2 As Boolean
Dim i, j, k, th, tl, sw
i = 0: j = 0: k = 0
th = 0: tl = 0: sw = 0
Do While i < 8 '取6個點
Set H = grabData("高", xCode, xDate).Offset(0, j)
Set L = grabData("低", xCode, xDate).Offset(0, j)
Set C = grabData("收", xCode, xDate).Offset(0, j)
If j > 300 Then Exit Do '限制資料庫範圍
If C <> "" Then
k = k + 1 '計數
If k = 1 Then GoSub RefreshHL
Tf1 = sw >= 0 And C < tl * 0.9
Tf2 = sw <= 0 And C > th * 1.1
If Tf1 Or Tf2 Then
GoSub MoveAndSwitch
GoSub WriteDataIn
GoSub RefreshHL
Else
Set rh = IIf(H > rh, H, rh)
Set rl = IIf(L < rl, L, rl)
th = IIf(H < th, H, th)
tl = IIf(L > tl, L, tl)
GoSub WriteDataIn
End If
End If
Debug.Print sw & "_" & j & "_" & k & "_" & i
j = j + 1
Loop
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 編輯
Sub Ac抓警示()
Call GetAlarm(1)
End Sub
Sub GetAlarm(Nd)
Dim xRow%, xCode, xDate As Range, i, j, writeIn As Range
Call A關閉
xRow = Sheets("基本").[A1].End(xlDown).Row
For i = 2 To xRow
With Sheets("基本")
xCode = .Cells(i, "A")
Set writeIn = .Range(.Cells(i, "C"), .Cells(i, "T")) '型態高低 寫入資料範圍
End With
Set xDate = Sheets("收").Cells(1, 3).Offset(0, Nd - 1) '根據參數修改起始天數
Call Pattern(writeIn, xCode, xDate)
Next i
Call A開啟
End Sub
Function grabData(Sht$, xCode, xDate As Range) '從資料庫抓取數據
Dim matC, matD
With Sheets(Sht)
matC = WorksheetFunction.Match(xCode, .Columns(1), 0)
matD = WorksheetFunction.Match(xDate, .Rows(1), 0)
Set grabData = .Cells(matC, matD)
End With
End Function
Function fbdate(Rng As Range) '按儲存格找「日期」
Set fbdate = Sheets(Rng.Worksheet.Name).Cells(1, Rng.Column)
End Function
Sub Pattern(Rng As Range, xCode, xDate As Range)
Dim H As Range, L As Range, C As Range, rh As Range, rl As Range
Dim Tf1 As Boolean, Tf2 As Boolean
Dim i, j, k, th, tl, sw
Rng.ClearContents
i = 0: j = 0: k = 0
th = 0: tl = 0: sw = 0
Do While i < 8 '取6個點
Set H = grabData("高", xCode, xDate).Offset(0, j)
Set L = grabData("低", xCode, xDate).Offset(0, j)
Set C = grabData("收", xCode, xDate).Offset(0, j)
If j > 300 Then Exit Do '限制資料庫範圍
If C <> "" Then
k = k + 1 '計數
If k = 1 Then GoSub RefreshHL
Tf1 = sw >= 0 And C < tl * 0.9
Tf2 = sw <= 0 And C > th * 1.1
If Tf1 Or Tf2 Then
GoSub MoveAndSwitch
GoSub WriteDataIn
GoSub RefreshHL
Else
Set rh = IIf(H > rh, H, rh)
Set rl = IIf(L < rl, L, rl)
th = IIf(H < th, H, th)
tl = IIf(L > tl, L, tl)
GoSub WriteDataIn
End If
End If
Debug.Print H.Column
j = j + 1
Loop
Exit Sub
MoveAndSwitch:
i = i + 1
sw = IIf(sw >= 0, -1, 1)
Return
WriteDataIn:
If i < 7 And i > 0 Then
Rng(i) = IIf(sw = 1, rh, rl)
Rng(i + 6) = fbdate(IIf(sw = 1, rh, rl))
Rng(i + 12) = k
End If
Return
RefreshHL:
Set rh = H
Set rl = L
th = H
tl = L
Return
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/)