Board logo

標題: [發問] 算漲跌與均價 [打印本頁]

作者: 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

試試看
  1. Sub 自動記錄()
  2.     Dim Rng As Range, 漲跌 As Single, 均價 As Single
  3.     If uMode = 0 Then Exit Sub
  4.     With Sht1
  5.         If Time > TimeValue(EndTime) Then '收盤時間以後不執行
  6.             .[O8] = "已過收盤"
  7.             uMode = 0
  8.             Exit Sub
  9.         End If
  10.         '----------------------------------------------------------
  11.         Set Rng = .Range("A65536").End(xlUp).Offset(1)
  12.         .Range("A" & Rng.Row & ":C" & Rng.Row).Value = .Range("A2:C2").Value
  13.         With .Cells(Rng.Row, "C")   '
  14.             '漲跌的定義應該是(這分鐘成交價-上分鐘成交價)/上分鐘成交價
  15.             If .Row >= 4 Then 漲跌 = (.Cells - .Cells.Offset(-1)) / .Cells.Offset(-1)
  16.             '20單位週期均價
  17.             If .Row >= 22 Then 均價 = Application.WorksheetFunction.Average(.Cells.Offset(-19).Resize(20))
  18.         End With
  19.         .Range("D2") = IIf(漲跌 <> 0, 漲跌, "")
  20.         .Range("E2") = IIf(均價 <> 0, 均價, "")
  21.         .Range("D" & Rng.Row & ":E" & Rng.Row).Value = .Range("D2:E2").Value
  22.         '------------------------------------------------
  23.     End With
  24.     If ActiveSheet.Name = Sht1.Name And xRow > 8 Then
  25.         ActiveWindow.ScrollRow = xRow - 6 '讓最新資料保持在可見視窗中
  26.     End If
  27.     Beep
  28.     '------------------------------------------------
  29.     ThisWorkbook.Save   '存檔
  30.     Application.OnTime Now + TimeValue("00:00:01"), "自動記錄"   '每一秒遞迴一次
  31. 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]
  1. Public uMode&, StartTime, EndTime
  2. Public MyBook As Workbook, Sht1 As Worksheet, Sht2 As Worksheet, xRow&

  3. Sub 共用參照()
  4. Set MyBook = ThisWorkbook
  5. Set Sht1 = MyBook.Sheets("台指近一分鐘線")
  6. StartTime = "08:44:50"  '開盤時間(提早十秒開始,才可記錄開盤量價)"08:44:50"
  7. EndTime = "21:45:10"    '收盤時間(延後十秒停止記錄)此為測試用時間,請自行更改正式時間 "13:45:10"
  8. End Sub

  9. Sub 自動記錄()
  10.     Dim Rng As Range, 漲跌 As Single, 均價 As Single
  11.     If uMode = 0 Then Exit Sub
  12.     With Sht1
  13.         If Time > TimeValue(EndTime) Then '收盤時間以後不執行
  14.             .[F2] = "已過收盤"
  15.             uMode = 0
  16.             Exit Sub
  17.         End If
  18.         Sht1.Range("B2") = Time '當前時間(時間碼表)
  19.         '----------------------------------------------------------
  20.         '每1分鐘記錄,5分鐘則改為 Mod 5
  21.         If Second(Time) = 0 And Minute(Time) Mod 1 = 0 Then
  22.         Set Rng = .Range("A65536").End(xlUp).Offset(1)
  23.         .Range("A" & Rng.Row & ":C" & Rng.Row).Value = .Range("A2:C2").Value
  24.         With .Cells(Rng.Row, "C")   '
  25.             '漲跌的定義應該是(這分鐘成交價-上分鐘成交價)/上分鐘成交價
  26.             If .Row >= 4 Then 漲跌 = (.Cells - .Cells.Offset(-1))
  27.             '20單位週期均價
  28.             If .Row >= 22 Then 均價 = Application.WorksheetFunction.Average(.Cells.Offset(-19).Resize(20))
  29.         End With
  30.         .Range("D2") = IIf(漲跌 <> 0, 漲跌, "")
  31.         .Range("E2") = IIf(均價 <> 0, 均價, "")
  32.         .Range("D" & Rng.Row & ":E" & Rng.Row).Value = .Range("D2:E2").Value
  33.         End If
  34.         '------------------------------------------------
  35.     End With
  36.     If ActiveSheet.Name = Sht1.Name And xRow > 8 Then
  37.         ActiveWindow.ScrollRow = xRow - 6 '讓最新資料保持在可見視窗中
  38.     End If
  39.     Beep
  40.     '------------------------------------------------
  41.     ThisWorkbook.Save   '存檔
  42.     Application.OnTime Now + TimeValue("00:00:01"), "自動記錄"   '每一秒遞迴一次
  43. End Sub
  44. Sub 開始執行()
  45. If uMode = 1 Then Exit Sub
  46. Call 共用參照
  47. uMode = 1
  48. Sht1.[F2] = "執行中"
  49. Call 自動記錄
  50. End Sub

  51. Sub 停止執行()
  52. uMode = 0
  53. Call 共用參照
  54. Sht1.[F2] = "STOP"
  55. End Sub

  56. Sub 清除記錄資料()
  57. Beep
  58. If MsgBox("※確定要清除〔Sheet1〕的記錄嗎? ", 4 + 32 + 256) = vbNo Then Exit Sub
  59. Call 共用參照
  60. Sht1.Rows("3:65536").ClearContents
  61. If ActiveSheet.Name = Sht1.Name Then ActiveWindow.ScrollRow = 1
  62. Beep
  63. End Sub
複製代碼

作者: GBKEE    時間: 2015-8-4 15:45

回復 10# daniel5168
  1. '每1分鐘記錄,5分鐘則改為 Mod 5
  2.         If Second(Time) = 0 And Minute(Time) Mod 1 = 0 Then
複製代碼
條件式 每1分鐘整 執行   If 內的程式碼 ,這沒問題的.
但為何要每一秒遞迴一次,這多此一舉.
  1. 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/)