返回列表 上一主題 發帖

[發問] DDE記錄資料求助

本帖最後由 c_c_lai 於 2013-4-21 10:03 編輯
各位大大,當開盤後,excel沒有任何動作,進入巨集內按執行,跳出"此專案的巨集已被暫止"的框框,這是出現了 ...
n8975067 發表於 2013-4-19 12:27
  1. Sub updateFollow()
  2.     Dim Rng As Range
  3.    
  4.     With Sheet2
  5.         Set Rng = .Range("A" & .Range("A" & .Rows.Count).End(xlUp).Row + 1)

  6.         Rng = Sheet1.[c2]
  7.         Rng.Offset(, 1) = Sheet1.[d2]
  8.         Rng.Offset(, 2) = Sheet1.[e2]
  9.         Rng.Offset(, 3) = Sheet1.[f2]
  10.         Rng.Offset(, 4) = Sheet1.[g2]
  11.         Rng.Offset(, 5) = Sheet1.[h2]
  12.         Rng.Offset(, 6) = Sheet1.[i2]
  13.         Rng.Offset(, 7) = Sheet1.[j2]
  14.         Rng.Offset(, 8) = Sheet1.[k2]
  15.         Rng.Offset(, 9) = Sheet1.[l2]
  16.     End With
  17.    
  18.     Application.OnTime Now + 300 / 86400#, "[color=Red]ThisWorkbook.[/color]updateFollow"             '  每五分鐘呼叫 一次
  19.     '  Application.OnTime Now + 60 / 86400#, "[color=Red]ThisWorkbook.[/color]updateFollow"    '  每一分鐘呼叫 一次
  20. End Sub
複製代碼
Application.OnTime Now + 300 / 86400#, "UpdateFollow" 程式碼在執行時,無法自動找到 updateFollow,
所以請在它的前面明確指定此涵式模組是放置在何方?
譬如: Application.OnTime Now + 300 / 86400#, "ThisWorkbook.updateFollow"  ,抑或是
              Application.OnTime Now + 300 / 86400#, "Module1.updateFollow"

TOP

回復  c_c_lai
"ThisWorkbook.updateFollow"
這一句
n8975067 發表於 2013-4-22 21:40

整段程式碼應放置於 ThisWorkbook 內,如果放置於模組內,
你便要去修正 ThisWorkbook.updateFollow 為 Modulex.updateFollow。

TOP

回復  c_c_lai
c_c_大

我是放置於ThisWorkbook 沒錯
n8975067 發表於 2013-4-23 08:36

你 E-Mail 給我,我把檔案傳給你。

TOP

本帖最後由 c_c_lai 於 2013-4-24 04:36 編輯

回復 20# n8975067
  1. Sub updateFollow()
  2.     Dim Rng As Range
  3.    
  4.     With Sheet2
  5.         '  Set Rng = .Range("A" & .Range("A" & .Rows.Count).End(xlUp).Row + 1)
  6.         '
  7.         '  Rng = Sheet1.[c2]
  8.         '  Rng.Offset(, 1) = Sheet1.[d2]
  9.         '  Rng.Offset(, 2) = Sheet1.[e2]
  10.         '  Rng.Offset(, 3) = Sheet1.[f2]
  11.         '  Rng.Offset(, 4) = Sheet1.[g2]
  12.         '  Rng.Offset(, 5) = Sheet1.[h2]
  13.         '  Rng.Offset(, 6) = Sheet1.[i2]
  14.         '  Rng.Offset(, 7) = Sheet1.[j2]
  15.         '  Rng.Offset(, 8) = Sheet1.[k2]
  16.         '  Rng.Offset(, 9) = Sheet1.[l2]
  17.         '  上面之敘述表達與下列的敘述結果是一樣的,差異只在於使用語法之巧妙不同。
  18.         Set Rng = .Range("A" & .Range("A" & .Rows.Count).End(xlUp).Row + 1).Resize(1, 10)
  19.         
  20.         Rng(1) = Sheet1.[c2]
  21.         Rng(2) = Sheet1.[d2]
  22.         Rng(3) = Sheet1.[e2]
  23.         Rng(4) = Sheet1.[f2]
  24.         Rng(5) = Sheet1.[g2]
  25.         Rng(6) = Sheet1.[h2]
  26.         Rng(7) = Sheet1.[i2]
  27.         Rng(8) = Sheet1.[j2]
  28.         Rng(9) = Sheet1.[k2]
  29.         Rng(10) = Sheet1.[l2]
  30.     End With
  31.    
  32.     '  Application.OnTime Now + 60 / 86400#, "ThisWorkbook.updateFollow"    '  每一分鐘呼叫 一次
  33.     Application.OnTime Now + 300 / 86400#, "ThisWorkbook.updateFollow"      '  每五分鐘呼叫 一次
  34. End Sub
複製代碼
已傳給你了!
在 Sheet1 加上了啟動按鈕,方便你執行查核。

TOP

回復  c_c_lai
報告c_c_大,今天試用,已經可以記錄了,但是否是要按按鈕才會啟動?
另外我想要在早上084 ...
n8975067 發表於 2013-4-25 14:47

因為我要測試你所說的問題癥結,為節省測試時間,
所以我以每隔一分鐘一次,來觀察執行結果之故。
按鈕之用意,是在於當你要開始執行時方便你啟用,
而不須再到程式區啟動程式。
如此說明可以嗎?

TOP

回復 22# n8975067
如果你想要系統自動控管開盤、與關盤,
那麼你便要參考其他範例了!

TOP

回復 25# n8975067
  1. Option Explicit
  2. Dim timerEnabled As Boolean    ' 判定開啟本工作表單的時段是否為開盤前啟動。

  3. Private Sub Workbook_Open()
  4.     timerEnabled = False
  5.      
  6.     Call timerStart            ' 程式一啟始,便去自動執行 timerStart
  7. End Sub

  8. Private Sub Workbook_BeforeClose(Cancel As Boolean)
  9.     On Error Resume Next
  10.     Application.OnTime Now + TimeValue("00:00:01"), "ThisWorkbook.RTimer", , False
  11.    
  12.     Me.Save
  13. End Sub

  14. Sub timerStart()   
  15.     If timerEnabled Then
  16.         ' 第二次(含)以後均以設定之 "間隔時段" 來處理執行序的作業。
  17.         Application.OnTime (Now + TimeValue("00:05:00")), "ThisWorkbook.updateFollow"    '  每隔五分鐘執行一次
  18.     Else
  19.         timerEnabled = True
  20.         
  21.         ' 將第一次啟動時間更改為設定 "開盤時間"前,如果開啟 Excel 時,已經過了設定 "開盤時間",則一進入系統即直接去執行紀錄作業。
  22.         If (TimeValue(Now) <= TimeValue("08:45:00")) Then
  23.             Application.OnTime (TimeValue("08:45:00")), "ThisWorkbook.updateFollow"
  24.         Else
  25.             ' 系統剛連上 DDE 至資料匯入Excel工作表單,須有一個緩衝時段,
  26.             ' 這時如果馬上去抓取DDE資料,會有型態不符的錯誤訊息產生,並中斷執行序的作業。
  27.             Application.OnTime (Now + TimeValue("00:00:05")), "ThisWorkbook.updateFollow"
  28.         End If
  29.     End If
  30. End Sub

  31. Sub updateFollow()
  32.     Dim Rng As Range
  33.    
  34.     On Error Resume Next
  35.     If (TimeValue(Now) < TimeValue("08:45:00") Or TimeValue(Now) > TimeValue("13:45:00")) Then Exit Sub

  36.     With Sheet2
  37.         '  Set Rng = .Range("A" & .Range("A" & .Rows.Count).End(xlUp).Row + 1)
  38.         '
  39.         '  Rng = Sheet1.[c2]
  40.         '  Rng.Offset(, 1) = Sheet1.[d2]
  41.         '  Rng.Offset(, 2) = Sheet1.[e2]
  42.         '  Rng.Offset(, 3) = Sheet1.[f2]
  43.         '  Rng.Offset(, 4) = Sheet1.[g2]
  44.         '  Rng.Offset(, 5) = Sheet1.[h2]
  45.         '  Rng.Offset(, 6) = Sheet1.[i2]
  46.         '  Rng.Offset(, 7) = Sheet1.[j2]
  47.         '  Rng.Offset(, 8) = Sheet1.[k2]
  48.         '  Rng.Offset(, 9) = Sheet1.[l2]
  49.         '  上面之敘述表達與下列的敘述結果是一樣的,差異只在於使用語法之巧妙不同。
  50.         Set Rng = .Range("A" & .Range("A" & .Rows.Count).End(xlUp).Row + 1).Resize(1, 10)
  51.         
  52.         Rng(1) = Sheet1.[c2]
  53.         Rng(2) = Sheet1.[d2]
  54.         Rng(3) = Sheet1.[e2]
  55.         Rng(4) = Sheet1.[f2]
  56.         Rng(5) = Sheet1.[g2]
  57.         Rng(6) = Sheet1.[h2]
  58.         Rng(7) = Sheet1.[i2]
  59.         Rng(8) = Sheet1.[j2]
  60.         Rng(9) = Sheet1.[k2]
  61.         Rng(10) = Sheet1.[l2]
  62.     End With
  63.    
  64.     If timerEnabled Then Call timerStart
  65. End Sub
複製代碼
我把你的 updateFollow() 與你的需求,全部整合在一起,
請將它全部覆蓋於 ThisWorkbook 程式碼編輯區塊內。
每日 08:45:00 以前開啟它 , 08:45:00時間一到,系統便會自動啟動執行,
13:45:00一超過時間,程式便會自動停止不再執行。
按鈕你可以保留,如果系統於突發狀況下停止運作,
你可以點選按鈕恢復系統運作。

TOP

回復 27# n8975067
收收 E-Mail,下載後明天
你再用我的檔案試試看!

TOP

回復  c_c_lai
GBKEE 發表於 2013-4-29 16:01

好久沒聯絡了,近來順意吧!
Application.OnTime Now + 300 / 86400#, "ThisWorkbook.updateFollow"
是順應他原本的程式而未加以異動,我個人習慣用您指教的語法、
或是抓取某設定欄位作為動態處理,謝謝您!

TOP

回復  c_c_lai

嗨 c_c_lai 大大您好
小妹最近也想學DDE拉入資料
需求剛好跟樓主一樣
可是我丟進去後 ...
saleen 發表於 2013-6-4 11:10

妳是完整複製 26# 上的程式碼嗎?
妳把執行畫面複製到小畫家 (Print Screen -> 小畫家 -> 貼上 ) 上傳。
謝謝!

TOP

        靜思自在 : 謊言像一朵盛開的鮮花,外表美麗,生命短暫。
返回列表 上一主題