Board logo

標題: [發問] DDE資料紀錄問題 [打印本頁]

作者: chenua    時間: 2012-4-26 10:31     標題: DDE資料紀錄問題

小女子有個問題想請教一下..
下圖是我所捷取的卷商DDE資料.爬文後還是找不到如何撰寫VBA
我想吧它每5分鐘的資料.紀錄在另一個工作表中.可以嗎..請各位大大為我解答一下..謝謝..
[attach]10682[/attach]
作者: Hsieh    時間: 2012-4-26 11:39

回復 1# chenua
一般模組輸入以下程式碼,存檔後開啟檔案,測試看看
  1. Sub auto_open()'開檔時自動執行此巨集
  2. GetDDE  '呼叫程序
  3. End Sub
  4. Sub GetDDE()
  5. Dim T As Date
  6. T = Now  '取得現在時間
  7. If Not IsError(Sheets(1).[B2]) Then Sheets(2).[A65536].End(xlUp).Offset(1).Resize(, 7) = Sheets(1).[A2:G2].Value  '工作表1的資料DDE連結成功寫入工作表2
  8. Application.OnTime T + TimeValue("00:00:02"), "GetDDE"  '這是以2秒測試,間隔5分鐘改成TimeValue("00:05:00"),
  9. End Sub
複製代碼

作者: chenua    時間: 2012-4-26 12:38

回復 2# Hsieh


    大概可以了..謝謝版主解答
作者: c_c_lai    時間: 2012-4-26 15:37

回復 2# Hsieh
回復 3# chenua
我將以能作業的 工作表單 附上, Chenua 妳可以試試看, 如附圖所見。
[attach]10687[/attach]
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  的方式來做處理,請教在語法上應怎麼來表達呢?
謝謝您的指導!
[attach]10688[/attach]
作者: c_c_lai    時間: 2012-4-26 15:42

回復 3# chenua
我將檔案傳E-Mail給妳了,收收看!
作者: GBKEE    時間: 2012-4-26 17:59

本帖最後由 GBKEE 於 2012-4-26 18:01 編輯

回復 4# c_c_lai
工作表2 的欄位 須設好格式
為什麼 工作表1 的 A2 資料一轉到 工作表2 的欄位,01:44 PM -> 0.572905 ?
0.572905是數字   01:44 PM 是儲存格的格式

Sheets("工作表2").Cells(CIndex + 2, 1) = Sheets("工作表1").Cells(2, 1).Text
作者: c_c_lai    時間: 2012-4-26 20:28

回復 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 的方式處理呦?
作者: Hsieh    時間: 2012-4-26 20:54

回復 7# c_c_lai


    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(1)的A2是時間,格式應該是"h:mm:ss"
你就把Sheets(2)的A欄格式也設定成"h:mm:ss"
[attach]10692[/attach]
作者: c_c_lai    時間: 2012-4-27 06:42

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

本帖最後由 Hsieh 於 2012-4-27 08:39 編輯

回復 9# c_c_lai

動態新增工作表為目的工作表時,預設格式通常是以通用格式
如果不願意使用程式碼於新增工作表時設定格式
可先製作好應有格式的工作表作為範本
於新增工作表時以插入範本為之
總之,一次性轉寫資料時應以value屬性寫入,不得以text寫入
若要以text寫入則必須一格一格寫入

Sheets("Good Morning").[A].Formula = "hh:mm:ss"
更改格式這樣的語法是錯誤的,建議你先以錄製巨集方式,取得基本程式碼
您有其他程式語言基礎,邏輯概念應該不是問題
你可從熟悉EXCEL的基本操作,去了解EXCEL VBA的特殊函數及物件屬性
因為語法就是VB語法,所以,基本功能了解越多,你的VBA運用才會越靈活
~共勉之~
作者: usana642    時間: 2012-6-20 20:55

請問我執行程式時,為何會跳出''找不到巨集GetDDE''的警告視窗?懇請各位大大的回覆,謝謝
作者: GBKEE    時間: 2012-6-22 08:23

本帖最後由 GBKEE 於 2012-6-22 08:25 編輯

回復 11# usana642
本身的模組中 直接呼叫  程序名稱即可 ->  GetDDE

物件模組內 :工作表物件模組 (SHEET1 . SHEET2.....) , 活頁簿物件模組 ThisWorkbook ,中
公用:   Sub  GetDDE ()  =    Public Sub  GetDDE ()     Public  模組層次的關鍵字,用來宣告在所有模組裏的所有程序中都可以使用常數
在其他模組的程序中 乎叫GetDDE    ->    SHEET1.GetDDE
私用:  Private  Sub  GetDDE ()                                        Private 模組層次的關鍵字,用來宣告只在已宣告的模組裏才可以使用常數
在其他模組的程序中 乎叫GetDDE   ->     Run  "SHEET1.GetDDE"

一般模組內 :   Module1,中
Sub  GetDDE ()  =    Public Sub  GetDDE ()     在其他模組的程序中 乎叫GetDDE  ->      GetDDE
私用:  Private  Sub  GetDDE ()     在其他模組的程序中 乎叫GetDDE    ->    Run  "Module1.GetDDE"
作者: usana642    時間: 2012-6-22 19:01

非常感謝GBKEE大大的熱心分享,已經成功了,另外再請教,如果要加入台股或美股開收盤的接收時間,請問要如何修改?謝謝您
作者: usana642    時間: 2012-6-22 20:23

再請教一個問題,如何將接收進來的資料時間修正為" 分鐘整數",例如 10:15:10  ---> 10:15:00 ,請問要如何修改?謝謝協助...
作者: GBKEE    時間: 2012-6-23 08:59

回復 13# 14# usana642
可附檔上來看你如何寫的
PS:請按回復鍵 回文者才會知道的
作者: usana642    時間: 2012-6-23 15:07

回復 15# GBKEE


    不好意思,我就是按照超級版主的程式,程式如下:

Sub auto_open()'開檔時自動執行此巨集
GetDDE  '呼叫程序
End Sub
Sub GetDDE()
Dim T As Date
T = Now  '取得現在時間
If Not IsError(Sheets(1).[B2]) Then Sheets(2).[A65536].End(xlUp).Offset(1).Resize(, 7) = Sheets(1).[A2:G2].Value  '工作表1的資料DDE連結成功寫入工作表2
Application.OnTime T + TimeValue("00:00:02"), "GetDDE"  '這是以2秒測試,間隔5分鐘改成TimeValue("00:05:00"),
End Sub

我想

1.再加入台股或美股開收盤時間,來設定接收時間
2.將接收進來的資料時間修正為" 分鐘整數",例如 10:15:10  ---> 10:15:00

請問要如何修改?謝謝您的協助
作者: GBKEE    時間: 2012-6-23 15:38

本帖最後由 GBKEE 於 2013-7-16 07:09 編輯

回復 16# usana642
  1. Option Explicit
  2. Sub Auto_Open() '開檔時自動執行此巨集
  3.     GetDDE  '呼叫程序
  4. End Sub
  5. Sub GetDDE()
  6.     Dim T As Date, A
  7.     'T = Now  'Now 包含日期     >1,,' T = Time '只有24小時的數值 <1
  8.     '輸入  #9:00#  ->系統自動成  #9:00:00 AM#
  9.     '輸入  #13:00# ->系統自動成  #1:00:00 PM#
  10.     '輸入  #00:05# ->系統自動成  #12:05:00 AM#   :  5分鐘
  11.     '------  1.再加入台股或美股開收盤時間,來設定接收時間
  12.     If Time > #9:00:00 AM# And Time < #1:30:00 PM# Then    '於交易時間內
  13.         If Not IsError(Sheets(1).[B2]) Then Sheets(2).[A65536].End(xlUp).Offset(1).Resize(, 7) = Sheets(1).[A2:G2].Value  '工作表1的資料DDE連結成功寫入工作表2
  14.     '------  2.將接收進來的資料時間修正為" 分鐘整數",例如 10:15:10  ---> 10:15:00
  15.     End If
  16.     T = Time + #12:00:30 AM#                         '--間隔30秒---------
  17.     'T = Time + #12:01:00 AM#                         '--間隔1分鐘---------
  18.     'T = Time + #12:05:00 AM#                         '--間隔5分鐘---------
  19.     Application.OnTime T, "GetDDE"
  20. End Sub
複製代碼

作者: usana642    時間: 2012-6-24 21:06

回復 17# GBKEE

再次非常感謝GBKEE大大的熱心協助
明天開盤再試看看,謝謝您
作者: slip    時間: 2013-7-15 17:41

回復 2# Hsieh
"Hsieh"大大你好
找資料中,看到這個我可用的資料

可是我無法執行
出現的訊息圖
檔案如右
能否大大幫我看一下
感恩
作者: GBKEE    時間: 2013-7-15 20:04

本帖最後由 GBKEE 於 2013-7-15 20:08 編輯

回復 19# slip
  1. '如程式碼ThisWorkbook物件模組中
  2. Private Sub Workbook_Open() 'ThisWorkbook物件模組:開啟擋預設自動執行的程序事件
  3.      GetDDE  '呼叫程序
  4. End Sub
  5. Sub GetDDE()
  6.     Dim T As Date
  7.     T = Now  '取得現在時間
  8.     If Not IsError(Sheets(1).[B2]) Then Sheets(2).[A65536].End(xlUp).Offset(1).Resize(, 7) = Sheets(1).[A2:G2].Value  '工作表1的資料DDE連結成功寫入工作表2
  9.     Application.OnTime T + TimeValue("00:00:30"), "ThisWorkbook.GetDDE"  '這是以2秒測試,間隔5分鐘改成TimeValue("00:05:00"),
  10.     'ThisWorkbook是物件模組,須加上模組的名稱
  11. End Sub
複製代碼
2# Hsieh超版 有說:[一般模組輸入以下程式碼,存檔後開啟檔案,測試看看] 如圖

[attach]15449[/attach]
作者: slip    時間: 2013-7-15 22:18

回復 20# GBKEE
感謝版主"GBKEE"
已經可以跑
可是另外想請問
為何我證券商軟體沒有開啟
但,我excel開啟後,excel自動運做ㄝ
這是正常的嗎?

感恩囉
作者: GBKEE    時間: 2013-7-16 07:11

回復 21# slip
這是正常的,可再參考一下17#的程式碼.
作者: c_c_lai    時間: 2013-7-16 09:23

回復 21# slip
[attach]15453[/attach]
作者: slip    時間: 2013-7-17 08:12

回復 22# GBKEE
謝謝"GBKEE &  c_c_lai"兩位大大回覆
目前仍沿用運作中

另外有新問題想請教如下
Sheet2
因還沒出現新數字,都會是0
數列1就會拉出很長的連線(如圖橘色框框部份)
請問如何可以讓這條條線不見呢?
謝謝
作者: GBKEE    時間: 2013-7-17 13:07

回復 24# slip
先刪除H:I欗的公式
  1. Sub GetDDE()
  2.     Dim T As Date
  3.     T = Now  '取得現在時間
  4.     If Not IsError(Sheets(1).[B2]) Then
  5.         With Sheets(2).[A65536].End(xlUp).Offset(1)
  6.             .Resize(, 7) = Sheets(1).[A2:G2].Value  '工作表1的資料DDE連結成功寫入工作表2
  7.             .Range("H1") = .Range("D1") - .Range("C1")             'H欗的公式=>D欗-C欗
  8.             .Range("I1") = .Range("E1")                                  'I欗的公式=E欗
  9.         End With
  10.     End If
  11.     Application.OnTime T + TimeValue("00:01:00"), "GetDDE"  '這是以2秒測試,間隔5分鐘改成TimeValue("00:05:00"),
  12. End Sub
複製代碼

作者: slip    時間: 2013-7-18 11:55

回復 25# GBKEE
謝謝"GBKEE大大"幫忙
需求有小小改變,請幫忙如下

H=D-C
I413=H413-H412......數列2
J欄位...............數列1
圖表呈現是 I列與J列
[attach]15478[/attach]
可否幫忙在圖表呈現時
圖表可自動修正
數列1與數列2的最大值與最小值的空間(目前我都用手修改)
謝謝幫忙[attach]15478[/attach]
    [attach]15479[/attach][attach]15480[/attach]
作者: GBKEE    時間: 2013-7-18 12:44

回復 26# slip
  1. Sub GetDDE()
  2.     Dim T As Date, xMax As Integer, xMin As Integer
  3.     T = Now  '取得現在時間
  4.     If Not IsError(Sheets(1).[B2]) Then
  5.         With Sheets(2).[A65536].End(xlUp).Offset(1)
  6.             .Resize(, 7) = Sheets(1).[A2:G2].Value                      '工作表1的資料DDE連結成功寫入工作表2
  7.             .Range("H1") = .Range("D1") - .Range("C1")                  'H欗的公式=>D欗-C欗
  8.             .Range("I1") = .Range("H1") - .Range("H1").Offset(-1)       'I413=H413-H412......數列2
  9.             .Range("J1") = .Range("E1")                                 'J欗的公式=E欗
  10.             xMax = Application.Max(.Parent.[i:j])                       '最大值
  11.             xMin = Application.Min(.Parent.[i:j])                       '最小值
  12.             
  13.             '**  .Parent.ChartObjects(1): 物件 (工作表的第1個圖表)  *****
  14.             With .Parent.ChartObjects(1).Chart.Axes(xlValue)
  15.                 .MinimumScale = xMin
  16.                 .MaximumScale = xMax
  17.                 .ScaleType = xlLinear                                    '數值座標軸的刻度類型
  18.             End With
  19.         End With
  20.     End If
  21.     Application.OnTime T + TimeValue("00:01:00"), "GetDDE"               '間隔5分鐘改成TimeValue("00:05:00"),
  22. End Sub
複製代碼

作者: slip    時間: 2013-7-18 13:31

回復 27# GBKEE
謝謝大大

我跑出來的圖數列1與數列2
沒有變成最大值,與最小值ㄝ
請幫我再看看
感恩
[attach]15482[/attach]
[attach]15483[/attach]
作者: GBKEE    時間: 2013-7-19 09:10

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

作者: slip    時間: 2013-7-19 18:41

回復 29# GBKEE
謝謝"GBKEE 大大"
今天試過的狀況如Book6.rar[attach]15500[/attach]

說明如下
左邊Y軸 = I欄位 = 數列2  的最大,最小
右邊Y軸 = J欄位 = 數列1  的最大,最小
附圖為今日用手動做出來的圖(最大,最小範圍)[attach]15501[/attach]
請"GBKEE " 大大再幫我修改
感謝+感恩
作者: GBKEE    時間: 2013-7-19 19:38

回復 30# slip
請自行依照如下修改
  1. With .Axes(xlValue)             'Y(主)座標軸
  2.                     .MinimumScale = Application.Min(.Parent.Parent.Parent.[I:I])                        '最小值
  3.                     .MaximumScale = Application.Max(.Parent.Parent.Parent.[I:I])                        '最大值
  4.                     .MajorUnitIsAuto = True      '主要刻度間距=自動設定
  5.                     .MinorUnitIsAuto = True      '次要刻度間距=自動設定
  6.                     .Crosses = xlAutomatic       '座標軸與其他座標軸交叉的點=自動設定
  7.                     .ScaleType = xlLinear        '數值座標軸的刻度類型=xlLinear
  8.                 End With
  9.                 With .Axes(xlValue, xlSecondary) 'Y(副)座標軸
  10.                     .MinimumScale = Application.Min(.Parent.Parent.Parent.[J:J])                        '最小值
  11.                     .MaximumScale = Application.Max(.Parent.Parent.Parent.[J:J])                        '最大值
  12.                     .MaximumScaleIsAuto = True
  13.                     .MajorUnitIsAuto = True
  14.                     .MinorUnitIsAuto = True
  15.                     .Crosses = xlAutomatic
  16.                     .ScaleType = xlLinear
  17.                 End With
複製代碼

作者: slip    時間: 2013-7-22 09:43

回復 31# GBKEE
真的12萬分感謝"GBKEE"大大

我今天執行起來
完全是我要
並且大大又多送我一個功能
圖表會跟著資料區間自動往下移動
實在太感謝大大了
作者: slip    時間: 2013-7-29 15:02

回復 31# GBKEE
"GBKEE"大大  你好;

原檔案"book8"[attach]15623[/attach]
發生一個問題請幫忙
我會同時又開一個excel檔"T"(此excel也是在抓DDE)[attach]15624[/attach]
就會出現以下訊息
[attach]15625[/attach]
[attach]15626[/attach]

感恩
作者: GBKEE    時間: 2013-7-29 15:25

回復 33# slip
  1. 'With Sheets(2).[A65536].End(xlUp).Offset(1)
  2.                'Sheets(2) 物件: 沒指明父層為作用中活頁簿,的第2個工作表物件
  3.         '改成
  4.         With ThisWorkbook.Sheets(2).[A65536].End(xlUp).Offset(1)
  5.             'ThisWorkbook           物件: 代表目前執行巨集程式碼所在的活頁簿
  6.           或   
  7.         With Workbooks("Book8.xls").Sheets(2).[A65536].End(xlUp).Offset(1)
  8.             'Workbooks("Book8.xls") 物件:指定名稱的活頁簿        
複製代碼

作者: slip    時間: 2013-7-30 10:45

回復 34# GBKEE
GBKEE 大大
我同時開兩個檔案  "Book8" & "T"
如果畫面留在"Book8"執行時,"Book8"檔案會正常運作

可是如果我切換到 "T"檔案執行
再點回 "Book8"檔執行的話

那在我"T"檔案執行的時間
這段時間"Book8"檔案會出現這樣[attach]15635[/attach]
謝謝您的幫忙.......
作者: npapower    時間: 2013-7-30 12:44     標題: 請教各位版大先進~DDE

各位版大大家好:
小弟想請教一下我個人使用的是永豐報價軟體,想透過DDE的方式把個股的成交價格按照15秒左右的時間記錄下來到EXCEL,
然後畫成走勢圖。想跟大大們請教我該如何做~?萬分感謝。
作者: GBKEE    時間: 2013-7-30 14:05

回復 35# slip T
執行多檔案時,該這樣的.
  1. Sub GetDDE()
  2.     Dim T As Date, Sh(1 To 2)
  3.     T = Now  '取得現在時間
  4.     Set Sh(1) = ThisWorkbook.Sheets(1)
  5.     Set Sh(2) = ThisWorkbook.Sheets(2)
  6.     If Not IsError(Sh(1).[B2]) Then Sh(2).[A65536].End(xlUp).Offset(1).Resize(, 7) = Sh(1).[A2:G2].Value  '工作表1的資料DDE連結成功寫入工作表2
  7.     Application.OnTime T + TimeValue("00:00:30"), "GetDDE"  '這是以2秒測試,間隔5分鐘改成TimeValue("00:05:00"),
  8. End Sub
複製代碼
T檔案
  1. Sub duplicate_Click()
  2.     Dim nextRows As Single
  3.     With ThisWorkbook.Sheets("Sheet1")
  4.         nextRows = .Range("A" & Rows.Count).End(xlUp).Row + 1
複製代碼

作者: GBKEE    時間: 2013-7-30 15:02

回復 36# npapower
這主題就有
作者: slip    時間: 2013-7-31 00:25

回復 37# GBKEE
大大晚安
我修改後,出現程式錯誤訊號[attach]15646[/attach]
請大大指導
謝謝
[attach]15647[/attach]
[attach]15648[/attach]
作者: GBKEE    時間: 2013-7-31 09:32

回復 39# slip
程式碼要了解一下是何錯誤  
***********      .為物件的屬性,方法   ********
   
  1.   WITH sh(?)    '物件: 你沒有設立
  2.              .Range("H1") = .Range("D1") - .Range("C1")                  'H欗的公式=>D欗-C欗
  3.             .Range("I1") = .Range("H1") - .Range("H1").Offset(-1)       'I413=H413-H412......數列2
  4.             .Range("J1") = .Range("E1")                                 'J欗的公式=E欗
  5.              '
  6.              '
  7. End With
複製代碼

作者: slip    時間: 2013-7-31 11:45

回復 40# GBKEE
GBKEE  大大 您好;
今天套上去
還是無法執行[attach]15651[/attach]
請您幫我修正
(sorry,我幾乎沒有基礎)
作者: slip    時間: 2013-8-1 01:26

回復 41# slip
GBKEE  大大 晚安;
我又套進程式[attach]15664[/attach]
出現訊息如下
[attach]15663[/attach]
請您幫忙
謝謝+感恩
作者: GBKEE    時間: 2013-8-1 13:19

回復 42# slip

未修改前 使用區塊形式語法:有End If
  1. If condition Then
  2. [statements]
  3. [ElseIf condition-n Then
  4. [elseifstatements]...
  5. [Else
  6. [elsestatements]]
  7. End If
複製代碼
  1.   If Not IsError(Sheets(1).[B2]) Then  '
  2.   '
  3. '
  4. End If
複製代碼
修改後 if 語法為
  1. If condition Then [statements][Else elsestatements
複製代碼
不用有 End If
  1. If Not IsError(Sh(1).[B2]) Then Sh(2).[A65536].End(xlUp).Offset(1).Resize(, 7) = Sh(1).[A2:G2].Value  '工作表1的資料DDE連結成功寫入工作表2
  2. '
  3. '
  4. '最後的 End If  要刪掉
複製代碼

作者: slip    時間: 2013-8-4 00:46

回復 43# GBKEE
大大,我真的很認真的試
可是還是不行
仍然出現錯誤訊息[attach]15684[/attach]
[attach]15685[/attach]
敬請幫忙
謝謝
作者: c_c_lai    時間: 2013-8-4 07:22

本帖最後由 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。
網站圖片功能可能被異動了,故無法上傳圖片故改以貼示程式碼。
作者: slip    時間: 2013-8-4 10:38

回復 45# c_c_lai
謝謝"c_c_lai "大大

早上有測試一下
出現狀況如圖[attach]15686[/attach]
[attach]15687[/attach]
請幫忙在看看
感恩
作者: c_c_lai    時間: 2013-8-4 12:04

本帖最後由 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
複製代碼
僅提供參考,每個人的需求不同、判定方式亦也會有所出入。
作者: GBKEE    時間: 2013-8-4 15:15

回復 44# slip
c_c_lai  幫你解決了錯誤,你知道是那裡出錯嗎?
作者: slip    時間: 2013-8-4 15:54

回復 47# c_c_lai
謝謝"c_c_lai"大大;

我只有在開盤時才會使用此檔案
那我先不去做修改

週一開盤時執行,如有其它問題
再請教您

還有,謝謝您的"超級幽默"
作者: slip    時間: 2013-8-4 15:56

回復 48# GBKEE
GBKEE  大大午安;
我大約懂c_c_lai"大大的教導

也感謝大大們,無私+超有耐心的教導
作者: slip    時間: 2013-8-5 10:23

回復 46# slip
"c_c_lai"大大好
今天開盤後
執行狀況跟上週未開盤的時候一樣[attach]15698[/attach]
[attach]15699[/attach]
請幫我看看
感恩
作者: c_c_lai    時間: 2013-8-5 10:36

本帖最後由 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
複製代碼

作者: c_c_lai    時間: 2013-8-5 10:54

本帖最後由 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
複製代碼

作者: slip    時間: 2013-8-5 10:58

回復 52# c_c_lai
謝謝大大
不知以下所寫是否合宜
不適合請版主大大刪除,並說聲對不起

c_c_lai大大
你教導回信中
有提到你也有在測試
那在此小小報告
不知這樣您是否有用

要抓5秒的原因
是在期貨時
這個時間最靠近"tick"
不是看每根圖
是搭配最高點or最低點(要搭配我有上傳的"T"檔案)
要看出主要做手,是否有轉向的意圖

這邏輯如果正確
可套在個股上
以上都還在模擬測試中

感謝大大的幫忙
目前執行順利中
作者: c_c_lai    時間: 2013-8-5 11:14

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

回復 55# c_c_lai
感謝,感謝
這樣看來,
大大是期選高手
大大有專門的網站(or部落格)
可讓我多多向您請教
感謝,感謝
作者: c_c_lai    時間: 2013-8-5 14:00

回復 56# slip
之前我只是幫一位通稱 "朋友" 的忙,處裡一些相關統計圖表的解析
(Easy Language、Power Language、HTS 等程式語言應用),至於
Excel 方面仍稱新手,在此期間隨同 Hsieh版大、GBKEE版大、以及
一些無法一一列名的前輩先進們請益學習,著實談不上經驗。
如有任何賜教之處,可以 E-Mail 到:  c_c_lai@yahoo.com




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