返回列表 上一主題 發帖

[發問] DDE資料紀錄問題

回復 2# Hsieh
回復 3# chenua
我將以能作業的 工作表單 附上, Chenua 妳可以試試看, 如附圖所見。

Hsieh大大,想請教您的是:
(1) 上圖左半部分, 從 A2:A21 的資料室應用 If Not IsError(Sheets(1).[B2]) Then Sheets(2).[A65536].End(xlUp).Offset(1).Resize(, 7) =
       Sheets(1).[A2:G2].Value  的方式處理。 為什麼 工作表1 的 A2 資料一轉到 工作表2 的欄位,01:44 PM -> 0.572905 ?
      所以我便將它的處裡改成 Sheets("工作表2").Cells(CIndex + 2, 1).Value = Sheets("工作表1").Cells(2, 1).Value 結果一樣,
      因為由 DDE 匯入的時間欄位是 A3 (=YT|KS!TXFE2.123),  匯入內容為 134459,此欄數據資料無法應用,故將它轉型到 A2 欄位
      (=TIME(LEFT(A3,LEN(A3)-4),MID(A3,LEN(A3)-3,2),RIGHT(A3,2))),目前如果從 A3 區出資料就會有問題,所以又再將它改成
     Sheets("工作表2").Cells(CIndex + 2, 1).Value = TimeValue(Now) 的方式,如附圖上的 A22LA28。
(2) 假設目前我想將 A2:G2,K2:P2,以及 H5:J5 等欄位同時抓取的話,如使用像 Sheets(2).[A65536].End(xlUp).Offset(1).Resize(, 7) =
       Sheets(1).[A2:G2].Value  的方式來做處理,請教在語法上應怎麼來表達呢?
謝謝您的指導!
DDE 資料紀錄問題.rar (13.19 KB)

TOP

回復 3# chenua
我將檔案傳E-Mail給妳了,收收看!

TOP

回復 6# GBKEE
謝謝您! 經過測試的結果,發現如果將
Sheets("工作表2").Cells(CIndex + 2, 1).Value = Sheets("工作表1").Cells(2, 1).Value 更改成
Sheets("工作表2").Cells(CIndex + 2, 1).Value = Sheets("工作表1").Cells(2, 1).Text 的確 OK。

但是 Sheets(2).[A65536].End(xlUp).Offset(1).Resize(, 7) = Sheets(1).[A2:G2].Value 更改為
Sheets(2).[A65536].End(xlUp).Offset(1).Resize(, 7) = Sheets(1).[A2:G2].Text 就不行了,
結果都沒有任何資料寫入,那豈不說無法完全使用 Sheets(2).[A65536].End(xlUp).Offset(1).Resize(, 7)
= Sheets(1).[A2:G2].Value 的方式處理呦?

TOP

回復 8# Hsieh
實務上,被寫入端未必只有 "工作表單2",有可能是動態產生的工作表單,
甚或是每日一份不同之工作表單來記錄交易紀錄,依照您的意思是先行將此欄位
將它先予以格式化再行處理嗎? 是不是這樣?  Sheets("Good Morning").[A].Formula = "hh:mm:ss"
(對不起,我之前都沒接觸過 Excel,是最近才開始跟各位先進學習的, 且目前之 VBA 程式語法都是憑藉以往的其它語言的撰寫經驗來採摩的)
如此勢必每在產生一心表單之前,就要先行處理此格式化,但是 A1本欄是文字屬性敘述那沒關係嗎?

TOP

回復 21# slip

TOP

本帖最後由 c_c_lai 於 2013-8-4 07:27 編輯

回復 44# slip
  1. Sub GetDDE()
  2.     Dim T As Date, Sh(1 To 2), i As Long
  3.    
  4.     T = Now  '取得現在時間
  5.     Set Sh(1) = ThisWorkbook.Sheets(1)
  6.     Set Sh(2) = ThisWorkbook.Sheets(2)
  7.     If Not IsError(Sh(1).[B2]) Then Sh(2).[A65536].End(xlUp).Offset(1).Resize(, 7) = Sh(1).[A2:G2].Value  '工作表1的資料DDE連結成功寫入工作表2
  8.         With ThisWorkbook.Sheets(2).[A65536].End(xlUp).Offset(1)     '物件
  9.             i = .Row
  10.             .Range("H1") = .Range("D1") - .Range("C1")                  'H欗的公式=>D欗-C欗
  11.             .Range("I1") = .Range("H1") - .Range("H1").Offset(-1)       'I413=H413-H412......數列2
  12.             .Range("J1") = .Range("E1")                                 'J欗的公式=E欗
  13.             xMax = Application.Max(.Parent.[i:j])                       '最大值
  14.             xMin = Application.Min(.Parent.[i:j])                       '最小值
  15.             '**  .Parent.ChartObjects(1): 物件 (工作表的第1個圖表)  *****
  16.             With .Parent.ChartObjects(1).Chart
  17.                 .SeriesCollection(1).Values = .Parent.Parent.Range("i2:i" & i)              '指定數列資料的範圍
  18.                 .SeriesCollection(1).ChartType = 52                                         '指定數列圖表類型
  19.                 .SeriesCollection(2).Values = .Parent.Parent.Range("J2:J" & i)
  20.                 .SeriesCollection(2).ChartType = 65
  21.                 If .SeriesCollection(2).AxisGroup <> xlSecondary Then .SeriesCollection(2).AxisGroup = xlSecondary '數列不在第2Y座標軸(副座標): 數列指定到第2Y座標軸(副座標)
  22.                                                                                             '.AxisGroup = 2 ->  副座標
  23.                 .Parent.Top = .Parent.Parent.Range("L" & IIf(i <= 39, 1, i - 38)).Top       '指定圖表頂端的位置
  24.                With .Axes(xlValue)             'Y(主)座標軸
  25.                     .MinimumScale = Application.Min(.Parent.Parent.Parent.[I:I])                        '最小值
  26.                     .MaximumScale = Application.Max(.Parent.Parent.Parent.[I:I])                        '最大值
  27.                     .MajorUnitIsAuto = True      '主要刻度間距=自動設定
  28.                     .MinorUnitIsAuto = True      '次要刻度間距=自動設定
  29.                     .Crosses = xlAutomatic       '座標軸與其他座標軸交叉的點=自動設定
  30.                     .ScaleType = xlLinear        '數值座標軸的刻度類型=xlLinear
  31.                 End With
  32.                 With .Axes(xlValue, xlSecondary) 'Y(副)座標軸
  33.                     .MinimumScale = Application.Min(.Parent.Parent.Parent.[J:J])                        '最小值
  34.                     .MaximumScale = Application.Max(.Parent.Parent.Parent.[J:J])                        '最大值
  35.                     .MaximumScaleIsAuto = True
  36.                     .MajorUnitIsAuto = True
  37.                     .MinorUnitIsAuto = True
  38.                     .Crosses = xlAutomatic
  39.                     .ScaleType = xlLinear
  40.                 End With
  41.             End With
  42.         End With
  43.         Application.ScreenUpdating = True
  44.    Application.OnTime T + TimeValue("00:00:05"), "GetDDE"               '間隔5分鐘改成TimeValue("00:05:00"),
  45. End Sub
複製代碼
請加入 i As Long 的宣告以及   i = .Row。
網站圖片功能可能被異動了,故無法上傳圖片故改以貼示程式碼。

TOP

本帖最後由 c_c_lai 於 2013-8-4 12:05 編輯
回復  c_c_lai
謝謝"c_c_lai "大大

早上有測試一下
出現狀況如圖

請幫忙在看看
感恩
slip 發表於 2013-8-4 10:38

你的程式既沒有起始、結束時段控制設定,且只要一啟動便會開始執行。
所以你目前得要考量開市時段的處裡,以及盤前盤後的狀況。
  1. If (Weekday(Date, 2) > 5 Or TimeValue(Now) > TimeValue("13:45:00") Then
  2.     '  每逢星期假日、或已關盤時, 則  ...  去唱個歌
  3. ElseIf TimeValue(Now) >= TimeValue("08:45:00") Then
  4.     '  認真來看盤吧!
  5. End If
複製代碼
僅提供參考,每個人的需求不同、判定方式亦也會有所出入。

TOP

本帖最後由 c_c_lai 於 2013-8-5 10:38 編輯

回復 49# slip
今早我實際跑了一下你的程式 (有點語病),我略微修正了一些語法,並加上 Rng 變數宣告。
大約觀察了一個多小時,因無法傳上圖示 (網頁圖片、附件均無法正常使用) 讓你分享,
故直接貼上程式碼,你再自行貼入你的 Module1 內,內容如下:
P.S.  你設定的五秒鐘寫入一筆資料,好像是在趕市集似的,看得我老人家眼發瞭亂的,
         我先將它改成一分鐘執行一次,你也可以使用 20 秒一筆做為參考 (較客觀)。
  1. Sub GetDDE()
  2.     Dim T As Date, Sh(1 To 2), i As Long, Rng As Range
  3.    
  4.     T = Now            '  取得現在時間
  5.     Set Sh(1) = ThisWorkbook.Sheets(1)
  6.     Set Sh(2) = ThisWorkbook.Sheets(2)
  7.    
  8.     If Not IsError(Sh(1).[B2]) Then
  9.         Set Rng = Sh(2).[A65536].End(xlUp).Offset(1)  '  物件
  10.         Rng.Resize(, 7) = Sh(1).[A2:G2].Value         '  將工作表1的DDE資料寫入工作表2
  11.         With Sh(2)
  12.             i = Rng.Row
  13.             
  14.             Rng.Offset(, 7) = Rng.Offset(, 3) - Rng.Offset(, 2)  '  H欗的公式=>D欗-C欗
  15.             Rng.Offset(, 8) = Rng.Offset(, 7) - Rng.Offset(, 7).Offset(-1)    '  I413=H413-H412......數列2
  16.             Rng.Offset(, 9) = Rng.Offset(, 4)                    '  J欗的公式=E欗
  17.             '  xMax = Application.Max(.[I:J])                    '  最大值
  18.             '  xMin = Application.Min(.[I:J])                    '  最小值
  19.             '  **  .Parent.ChartObjects(1): 物件 (工作表的第1個圖表)  *****
  20.             With .ChartObjects(1).Chart
  21.                 .SeriesCollection(1).Values = .Parent.Parent.Range("I2:I" & i)    '  指定數列資料的範圍
  22.                 .SeriesCollection(1).ChartType = 52                               '  指定數列圖表類型
  23.                 .SeriesCollection(2).Values = .Parent.Parent.Range("J2:J" & i)
  24.                 .SeriesCollection(2).ChartType = 65
  25.                 If .SeriesCollection(2).AxisGroup <> xlSecondary Then .SeriesCollection(2).AxisGroup = xlSecondary
  26.                 '  數列不在第 2 Y座標軸(副座標): 數列指定到第 2 Y座標軸(副座標)   '  .AxisGroup = 2 ->  副座標
  27.                                                                               
  28.                 .Parent.Top = .Parent.Parent.Range("L" & IIf(i <= 39, 1, i - 38)).Top     '  指定圖表頂端的位置
  29.                 With .Axes(xlValue)                '  Y (主) 座標軸
  30.                     .MinimumScale = Application.Min(.Parent.Parent.Parent.[I:I])          '  最小值
  31.                     .MaximumScale = Application.Max(.Parent.Parent.Parent.[I:I])          '  最大值
  32.                     .MajorUnitIsAuto = True        '  主要刻度間距=自動設定
  33.                     .MinorUnitIsAuto = True        '  次要刻度間距=自動設定
  34.                     .Crosses = xlAutomatic         '  座標軸與其他座標軸交叉的點=自動設定
  35.                     .ScaleType = xlLinear          '  數值座標軸的刻度類型=xlLinear
  36.                 End With
  37.                
  38.                 With .Axes(xlValue, xlSecondary)   '  Y (副) 座標軸
  39.                     .MinimumScale = Application.Min(.Parent.Parent.Parent.[J:J])           '  最小值
  40.                     .MaximumScale = Application.Max(.Parent.Parent.Parent.[J:J])           '  最大值
  41.                     .MaximumScaleIsAuto = True
  42.                     .MajorUnitIsAuto = True
  43.                     .MinorUnitIsAuto = True
  44.                     .Crosses = xlAutomatic
  45.                     .ScaleType = xlLinear
  46.                 End With
  47.             End With
  48.         End With
  49.     End If
  50.    
  51.     Application.ScreenUpdating = True
  52.     Application.OnTime T + TimeValue("00:01:00"), "GetDDE"      '  間隔 5 分鐘改成 TimeValue("00:05:00")
  53. End Sub
複製代碼

TOP

本帖最後由 c_c_lai 於 2013-8-5 10:55 編輯

回復 51# slip
另外、我在我這端 ThisWorkbook 程式碼加入了以下程式碼,
方便 Excel 一開啟便會自動處理程式之執行,而不需再以人工點按 GetDDE(),
這是我處理 DDE 的習慣,提供你參考:
  1. Option Explicit

  2. Private Sub Workbook_Open()
  3.     If (Weekday(Date, 2) > 5 Or TimeValue(Now) > TimeValue("13:45:00")) Then
  4.         Exit Sub
  5.     Else
  6.         '  認真來看盤吧!
  7.        If TimeValue(Now) < TimeValue("08:45:00") Then
  8.             Application.OnTime TimeValue("08:45:00"), "Module1.GetDDE"
  9.         Else
  10.             Application.OnTime (Now + TimeValue("00:00:01")), "Module1.GetDDE"
  11.         End If
  12.     End If
  13. End Sub
複製代碼
加上後, Module1 程式最好再修改成如下,如此整體程式才有頭有尾。
  1. Sub GetDDE()
  2.     Dim T As Date, Sh(1 To 2), i As Long, Rng As Range
  3.    
  4.     T = Now            '  取得現在時間
  5.     If TimeValue(Now) > TimeValue("13:45:00") Then Exit Sub
  6.    
  7.     Set Sh(1) = ThisWorkbook.Sheets(1)
  8.     Set Sh(2) = ThisWorkbook.Sheets(2)
  9.    
  10.     If Not IsError(Sh(1).[B2]) Then
  11.          .
  12.         .
  13.     End If
  14.          .
  15.         .
  16. End Sub
複製代碼

TOP

回復 54# slip
模擬測試之準確度能須待 "時日"、"型態"、"市場走向" 的考驗,
市場上一 TOLAKU 的人日日一直在追尋著美夢與願景,
也願你能一帆風順!

TOP

        靜思自在 : 受人點水之恩,須當湧泉以報。
返回列表 上一主題