Board logo

標題: [發問] 指定的時間插入相關數據 [打印本頁]

作者: cdkee    時間: 2014-4-7 14:23     標題: 指定的時間插入相關數據

請教各大大/版大,要在指定的時間插入相關數據(包括取出最大及最小數值),VBA應如何寫,詳細見附件內容,謝謝!
[attach]17950[/attach]
作者: cdkee    時間: 2014-4-8 16:57

回復 1# cdkee

嘗試了一些例子,只做到按時間插入部份資料
[attach]17956[/attach]

再請教各大大,這裡找到"擷取最高最低"例子 和 "找尋指定時間插入相關資料"例子,應該如何結合才能做到要求,謝謝!
  1. '擷取最高最低
  2. Private Sub Worksheet_Calculate()

  3.     Dim Rng As Range

  4.     Static Msg As Boolean    '以 Static 陳述式宣告的變數,在程式執行期間,會一直保留內容。

  5.     If Weekday(Date, vbMonday) > 5 Or Time < #5:46:00 PM# Or Time > #11:00:00 PM# Then Exit Sub  '非營業日 或 非營業時間

  6.     If Msg = False Then

  7.         清除舊資料

  8.         Msg = True

  9.     End If

  10.     With Cells(Rows.Count, "C").End(xlUp)

  11.         If .Row = 7 Then

  12.             Set Rng = .Offset(1)

  13.         Else

  14.             Set Rng = .Cells

  15.         End If

  16.     End With

  17.     If Rng = "" Or Rng.Text <> Format([b5], "hh:mm") Then

  18.         If Rng <> "" Then Set Rng = Rng.Offset(1)

  19.         Rng = Format([b5], "hh:mm")

  20.         Rng(1, 2) = [B6].Text

  21.         Rng(1, 3) = [B6].Text

  22.     ElseIf Rng.Text = Format([b5], "hh:mm") Then

  23.         If [B6] > Rng(1, 2) Then Rng(1, 2) = [B6].Text

  24.         If [B6] < Rng(1, 3) Then Rng(1, 3) = [B6].Text

  25.     End If

  26. End Sub
複製代碼
  1. '找尋定時間插入相關資料
  2. Sub 資料輸入()
  3.     Dim E As Range
  4.     '''''''''''''''''''''''''''''''''''''
  5.     'Dim Ar()      'Ar陣列 ->  存入你要的數據
  6.     'Ar = Sheets("Table").Range("B2:D2").Value
  7.     '''''''''''''''''''''''''''''''''''''
  8.     Dim Ar(1 To 5)      'Ar陣列 ->  存入你要的數據
  9.     Ar(1) = [Table!B2]
  10.     Ar(2) = [Table!C2]
  11.     Ar(3) = [Table!D2]
  12.     Ar(4) = [Table!E2]
  13.     Ar(5) = [Table!A2]
  14.     If Minute(Time) Mod 1 = 0 Then
  15.         Set E = Sheets("1分K").Range("A:A").Find(TimeSerial(Hour(Time), Minute(Time), 0))
  16.         E.Offset(0, 1).Resize(1, UBound(Ar)).Value = Ar 'Minute(Time) Mod 1=0  每分鐘
  17.         
  18.        ElseIf Minute(Time) Mod 1 = 1 Then
  19.        E.Offset(0, 1).Resize(1, UBound(Ar)).Value = Ar
  20.     End If
  21.     'If Minute(Time) Mod 5 = 0 Then
  22.     '    Set E = Sheets("5分K").Range("A:A").Find(TimeSerial(Hour(Time), Minute(Time), 0))
  23.     '    E.Offset(0, 1).Resize(1, UBound(Ar)).Value = Ar 'Minute(Time) Mod 5=0  每5分鐘
  24.     'End If
  25.     'If Minute(Time) Mod 15 = 0 Then
  26.     '    Set E = Sheets("15分K").Range("A:A").Find(TimeSerial(Hour(Time), Minute(Time), 0))
  27.     '    E.Offset(0, 1).Resize(1, UBound(Ar)).Value = Ar 'Minute(Time) Mod 15=0  每15分鐘
  28.     'End If
  29.     If Time <= #4:15:00 PM# Then Application.OnTime TimeValue(Format(Time, "hh:MM:00")) + #12:01:00 AM#, "ThisWorkbook.資料輸入"
  30.     ' ***  #4:15:00 PM# 之前時間執行程式 ->資料輸入
  31.     Set E = Nothing    '
  32. End Sub
複製代碼

作者: cdkee    時間: 2014-4-10 11:58

版上再找到GBKEE版大建議的例子(#10),加上以上兩個例子,再請大大指教如何改寫,感謝!
http://forum.twbts.com/viewthread.php?tid=7534&from=favorites
  1. '[策略記錄] 工作表的程式碼(重算事件 )

  2. Private Sub Worksheet_Calculate()

  3.     Static Msg As Boolean                      '用以判定是否為每日第一次執行

  4.     Static Time_Calculate As Date              '記錄每分鐘的時間

  5.     Static AR                                  '陣列:記錄成交價格

  6.     If Time < #8:30:00 AM# Then Exit Sub

  7.     Application.EnableEvents = False           '停止物件能觸發事件(Worksheet_Calculate)

  8.     If Msg = False Then

  9.         Time_Calculate = TimeSerial(Hour(Time), Minute(Time), 0) '每分鐘的時間

  10.         Range("A12").CurrentRegion.Offset(1) = ""                '清理昨日資料

  11.         ReDim AR(0)                                              '重新設為一元素

  12.     End If

  13.     Msg = True

  14.     If Time >= Time_Calculate + #12:01:00 AM# Then

  15.             With IIf([A13] = "", [A13], Cells(Rows.Count, 1).End(xlUp).Offset(1))

  16.                 .Cells(1, 1) = Time_Calculate                    '時間

  17.                 .Cells(1, 2) = AR(0)                             '開盤價

  18.                 .Cells(1, 3) = Application.Max(AR)               '最高價

  19.                 .Cells(1, 4) = Application.Min(AR)               '最低價

  20.                 .Cells(1, 5) = AR(UBound(AR))                    '收盤價

  21.             End With

  22.             Time_Calculate = TimeSerial(Hour(Time), Minute(Time), 0)

  23.             ReDim AR(0)

  24.     End If

  25.     If AR(UBound(AR)) <> "" Then ReDim Preserve AR(UBound(AR) + 1) '重新再加上一元素

  26.     AR(UBound(AR)) = [f2]                                          '記錄成交價格成交價

  27.     Application.EnableEvents = True           '恢復物件能觸發事件(Worksheet_Calculate)

  28. End Sub
複製代碼

作者: cdkee    時間: 2014-4-10 16:44

[attach]17975[/attach]
附件已經可做到大部份要求。
再請教大大,如何做到每個記錄時段開始時,即首個秒鐘>=00,及在"B4"有改變時,才開始記錄?謝謝!
作者: cdkee    時間: 2014-4-11 01:07

改了一些,仍然不行,請大大幫助指教,謝謝!
  1. Option Explicit

  2. Private Sub Worksheet_Calculate()

  3.    
  4. Dim target As Range

  5.      Set target = Sheets("Sheet2").Range("B4")

  6.      If Not Intersect(target, Sheets("Sheet2").Range("B4")) Is Nothing Then


  7.     Dim rng As Range
  8.    
  9.    
  10.     Static Msg As Boolean    '以 Static 陳述式宣告的變數,在程式執行期間,會一直保留內容。

  11.     If Weekday(Date, vbMonday) > 5 Then Exit Sub    '非營業日 或 非營業時間

  12.     If Msg = False Then

  13.         清除舊資料

  14.         Msg = True

  15.     End If
  16.    
  17.    
  18.    
  19.      
  20.      

  21.     With Cells(Rows.Count, "C").End(xlUp)

  22.         If .Row = 7 Then

  23.             Set rng = .Offset(1)

  24.         Else

  25.             Set rng = .Cells

  26.         End If

  27.     End With

  28.     If rng = "" Or rng.Text <> Format(Worksheets("Sheet1").[a2], "hh:mm") Then

  29.         If rng <> "" Then Set rng = rng.Offset(1)

  30.         rng = Format(Worksheets("Sheet1").[a2], "hh:mm")
  31.         
  32.         rng(1, 2) = [B6].Text '

  33.         rng(1, 3) = [B6].Text

  34.         rng(1, 4) = [B6].Text
  35.         
  36.         rng(1, 5) = [B6].Text '

  37.     ElseIf rng.Text = Format(Worksheets("Sheet1").[a2], "hh:mm") Then

  38.         If [B6] > rng(1, 3) Then rng(1, 3) = [B6].Text

  39.         If [B6] < rng(1, 4) Then rng(1, 4) = [B6].Text
  40.         
  41.         rng(1, 5) = [B6].Text '

  42.     End If

  43. End Sub

  44. Private Sub 清除舊資料()

  45.     On Error GoTo Er

  46.     If [營業日] <> Date Then            '檢查 定義名稱:"營業日"的值

  47.         Me.Names.Add "營業日", Date     '定義名稱:"營業日"的值為當日

  48.         If Weekday(Date, vbMonday) <= 5 Then Range([C8], [E8].End(xlDown)).Clear '營業日

  49.     End If

  50.     Exit Sub

  51. Er:  '處裡: 沒有定義名稱:"營業日"的錯誤

  52.      Me.Names.Add "營業日", Date        '定義名稱:"營業日"的值為當日

  53.      Resume Next                        '回到錯誤的下一個程式碼:繼續執行

  54. End Sub
複製代碼





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