標題:
[發問]
算漲跌與均價
[打印本頁]
作者:
daniel5168
時間:
2015-7-31 17:43
標題:
算漲跌與均價
本帖最後由 daniel5168 於 2015-7-31 17:45 編輯
請教各位先進,我用DDE紀錄價位,要如何可以同時記錄這分鐘與上分鐘的漲跌與均價,怕口條不好解釋不清以下附圖
[attach]21593[/attach]
漲跌與均價也是要每分鐘往下紀錄的,那D2跟E2的格子該怎麼寫公式
[attach]21594[/attach]
作者:
ken2192
時間:
2015-8-1 13:05
漲跌的定義應該是(這分鐘成交價-上分鐘成交價)/上分鐘成交價
作者:
daniel5168
時間:
2015-8-1 13:44
回復
2#
ken2192
但是我要在D2跟E2計算出每分鐘的變化,然後往下每分鐘紀錄,我不知道該如何現在價格建去上一分鐘價格,因為上一分鐘價格的儲存格位置不段改變
作者:
daniel5168
時間:
2015-8-3 14:25
本帖最後由 daniel5168 於 2015-8-3 14:28 編輯
請問一下各位先進,我上述想法是不是無法做到,只能用C欄已經記錄的資料在D欄以及E欄用函數計算呢?
因怕函數公式太多會導致越來越遲鈍,所以想問問是否有可能在D2以及E2就把數據算出來再讓VBA的每分紀錄去寫在D3跟E3往下欄位
作者:
GBKEE
時間:
2015-8-3 16:07
回復
4#
daniel5168
試試看
Sub 自動記錄()
Dim Rng As Range, 漲跌 As Single, 均價 As Single
If uMode = 0 Then Exit Sub
With Sht1
If Time > TimeValue(EndTime) Then '收盤時間以後不執行
.[O8] = "已過收盤"
uMode = 0
Exit Sub
End If
'----------------------------------------------------------
Set Rng = .Range("A65536").End(xlUp).Offset(1)
.Range("A" & Rng.Row & ":C" & Rng.Row).Value = .Range("A2:C2").Value
With .Cells(Rng.Row, "C") '
'漲跌的定義應該是(這分鐘成交價-上分鐘成交價)/上分鐘成交價
If .Row >= 4 Then 漲跌 = (.Cells - .Cells.Offset(-1)) / .Cells.Offset(-1)
'20單位週期均價
If .Row >= 22 Then 均價 = Application.WorksheetFunction.Average(.Cells.Offset(-19).Resize(20))
End With
.Range("D2") = IIf(漲跌 <> 0, 漲跌, "")
.Range("E2") = IIf(均價 <> 0, 均價, "")
.Range("D" & Rng.Row & ":E" & Rng.Row).Value = .Range("D2:E2").Value
'------------------------------------------------
End With
If ActiveSheet.Name = Sht1.Name And xRow > 8 Then
ActiveWindow.ScrollRow = xRow - 6 '讓最新資料保持在可見視窗中
End If
Beep
'------------------------------------------------
ThisWorkbook.Save '存檔
Application.OnTime Now + TimeValue("00:00:01"), "自動記錄" '每一秒遞迴一次
End Sub
複製代碼
作者:
daniel5168
時間:
2015-8-4 09:45
本帖最後由 daniel5168 於 2015-8-4 09:49 編輯
回復
5#
GBKEE
早上已經套入試用,但他好像是每秒記錄一次,我加入If Second(Time) = 0 And Minute(Time) Mod 1 = 0 Then
之後出現錯誤訊息如圖
[attach]21637[/attach]
想它每秒地回一次又想每一分鐘記錄我該怎麼改,有勞指點了.我也一邊自己努力改改看
作者:
lpk187
時間:
2015-8-4 10:15
回復
6#
daniel5168
你加了If Second(Time) = 0 And Minute(Time) Mod 1 = 0 Then卻沒有給它End If
作者:
GBKEE
時間:
2015-8-4 14:16
本帖最後由 GBKEE 於 2015-8-4 14:17 編輯
回復
6#
daniel5168
但他好像是每秒記錄一次,
這裡修改 Application.OnTime Now + TimeValue("00:01:00"), "自動記錄" '
每一分遞迴一次
可以不用 If Second(Time) = 0 And Minute(Time) Mod 1 = 0 Then 這行程式碼
錯誤訊息 沒有 With, lpk187 說了少了End If
作者:
daniel5168
時間:
2015-8-4 15:09
回復
7#
lpk187
多謝lpk187 大大,雖然不懂整個程式怎麼解讀,但是我打END IF嘗試在各個位置,終於成功
作者:
daniel5168
時間:
2015-8-4 15:12
本帖最後由 daniel5168 於 2015-8-4 15:18 編輯
回復
8#
GBKEE
多謝GBKEE 版主幫忙解答,經過您的編寫,我亂改出問題,lpk187大大的指點,我再亂改,終於測試成功
[attach]21643[/attach]
Public uMode&, StartTime, EndTime
Public MyBook As Workbook, Sht1 As Worksheet, Sht2 As Worksheet, xRow&
Sub 共用參照()
Set MyBook = ThisWorkbook
Set Sht1 = MyBook.Sheets("台指近一分鐘線")
StartTime = "08:44:50" '開盤時間(提早十秒開始,才可記錄開盤量價)"08:44:50"
EndTime = "21:45:10" '收盤時間(延後十秒停止記錄)此為測試用時間,請自行更改正式時間 "13:45:10"
End Sub
Sub 自動記錄()
Dim Rng As Range, 漲跌 As Single, 均價 As Single
If uMode = 0 Then Exit Sub
With Sht1
If Time > TimeValue(EndTime) Then '收盤時間以後不執行
.[F2] = "已過收盤"
uMode = 0
Exit Sub
End If
Sht1.Range("B2") = Time '當前時間(時間碼表)
'----------------------------------------------------------
'每1分鐘記錄,5分鐘則改為 Mod 5
If Second(Time) = 0 And Minute(Time) Mod 1 = 0 Then
Set Rng = .Range("A65536").End(xlUp).Offset(1)
.Range("A" & Rng.Row & ":C" & Rng.Row).Value = .Range("A2:C2").Value
With .Cells(Rng.Row, "C") '
'漲跌的定義應該是(這分鐘成交價-上分鐘成交價)/上分鐘成交價
If .Row >= 4 Then 漲跌 = (.Cells - .Cells.Offset(-1))
'20單位週期均價
If .Row >= 22 Then 均價 = Application.WorksheetFunction.Average(.Cells.Offset(-19).Resize(20))
End With
.Range("D2") = IIf(漲跌 <> 0, 漲跌, "")
.Range("E2") = IIf(均價 <> 0, 均價, "")
.Range("D" & Rng.Row & ":E" & Rng.Row).Value = .Range("D2:E2").Value
End If
'------------------------------------------------
End With
If ActiveSheet.Name = Sht1.Name And xRow > 8 Then
ActiveWindow.ScrollRow = xRow - 6 '讓最新資料保持在可見視窗中
End If
Beep
'------------------------------------------------
ThisWorkbook.Save '存檔
Application.OnTime Now + TimeValue("00:00:01"), "自動記錄" '每一秒遞迴一次
End Sub
Sub 開始執行()
If uMode = 1 Then Exit Sub
Call 共用參照
uMode = 1
Sht1.[F2] = "執行中"
Call 自動記錄
End Sub
Sub 停止執行()
uMode = 0
Call 共用參照
Sht1.[F2] = "STOP"
End Sub
Sub 清除記錄資料()
Beep
If MsgBox("※確定要清除〔Sheet1〕的記錄嗎? ", 4 + 32 + 256) = vbNo Then Exit Sub
Call 共用參照
Sht1.Rows("3:65536").ClearContents
If ActiveSheet.Name = Sht1.Name Then ActiveWindow.ScrollRow = 1
Beep
End Sub
複製代碼
作者:
GBKEE
時間:
2015-8-4 15:45
回復
10#
daniel5168
'每1分鐘記錄,5分鐘則改為 Mod 5
If Second(Time) = 0 And Minute(Time) Mod 1 = 0 Then
複製代碼
條件式 每1分鐘整 執行 If 內的程式碼 ,這沒問題的.
但為何要每一秒遞迴一次,這多此一舉.
Application.OnTime Now + TimeValue("00:00:01"), "自動記錄" '每一秒遞迴一次
複製代碼
一分鐘遞迴一次,不用 If Second(Time) = 0 And Minute(Time) Mod 1 = 0 Then 程式碼不是簡潔一些嗎?
作者:
daniel5168
時間:
2015-8-4 15:55
回復
11#
GBKEE
報告版主大大,.因為我想看到B2的時間(秒數)
歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)