Board logo

標題: 切換工作表後無法更新被複製儲存格資料 [打印本頁]

作者: gnimnek168    時間: 2011-12-14 20:55     標題: 切換工作表後無法更新被複製儲存格資料

我在 Sheet1 接收 DDE 報價資料與設定顯示圖表,然後寫 VBA 程式,固定每 30 秒在 Sheet2 紀錄從 DDE 所接收的變動資料。

我的問題是,當切換到 Sheet2 工作表時,整個運轉一切正常;但是若當我切換到 Sheet1 時想觀看圖表的即時顯示,Sheet2 內的紀錄就會停止,除非再切換至 Sheet2 工作表,才又會定時紀錄。

我的 VBA 程式如下:
-------------------------------------------------------------
Option Explicit
Public nRow, Pos As Integer

Private Sub Workbook_Open()
    On Error Resume Next
    'Application.OnTime TimeValue("08:43:00"), "ThisWorkBook.SyncData"
    Call SyncData
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    On Error Resume Next
    Application.OnTime Now + TimeValue("00:00:01"), "ThisWorkBook.SyncData", , False
End Sub

'*****************************************************************************
'   將 DDE 即時報價資料依時間間隔寫入至報價資料區
'*****************************************************************************
Public Sub SyncData()
      
    On Error Resume Next
    'If TimeValue(Now) > TimeValue("13:46:00") Then Exit Sub
   
    With .Sheets("即時資料")
        nRow = .Range("A65536").End(xlUp).Row '判斷最後一列有資料的位置
                             
        Pos = nRow + 1
               
        Cells(Pos, 1) = Time
        Cells(Pos, 3) = Sheets("DDE報價").Cells(7, 3)  '台指期成交價
        
    End With
   
    Application.OnTime Now + TimeValue("00:00:30"), "ThisWorkBook.SyncData"  '每隔固定設定時間執行寫入至即時資料表
End Sub
-----------------------------------------------------------------------------

我的 VBA 程式是寫在 "ThisWorkBook" 內。

請問:
1. 程式內哪裡有問題? 而導致切換到其它工作表後就停止紀錄。
2. 到底這程式 (SyncData) 是否寫在 ThisWorkBook 還是 Module 內比較理想呢? 我一直搞不太懂 ThisWorkBook 與 Module 的差別。
作者: gnimnek168    時間: 2011-12-15 10:55

自問自答一下。

目前我是使用 Sheet2.Activate 來解決。但這樣有些問題,如果你想隨時觀看圖表時 (Sheet1),VBA 程式當遇到 Sheet2.Activate 就會切換到 Sheet2 工作表。

所以只好當切回 Sheet2 處理完儲存格的複製時,再依據原來所在的工作表,取得名稱後,再下指令切回去。這樣的後遺症是畫面常會閃動一下 (因為切到 Sheet2 又切回 Sheet1)。
處理的邏輯是這樣:
name = ThisWorkbook.ActiveSheet.Name
Sheet2.Select
......
......
......
ThisWorkbook.Sheets(name).Activate

不知道版上有經驗的大大們是否有更佳的解決方案?
作者: Hsieh    時間: 2011-12-15 11:05

回復 2# gnimnek168


    .Cells(Pos, 1) = Time
    .Cells(Pos, 3) = Sheets("DDE報價").Cells(7, 3)
是寫入即時資料工作表嗎?
with區段內要加入.
作者: gnimnek168    時間: 2011-12-15 11:54

回復  gnimnek168
    .Cells(Pos, 1) = Time
    .Cells(Pos, 3) = Sheets("DDE報價").Cells(7, 3)
是寫入即時資料工作表嗎?
with區段內要加入.


不好意思,不了解您的說明?

上述兩個 Cell 儲存格是在 "即時資料" 工作表 (sheet2) 沒錯。
作者: Hsieh    時間: 2011-12-15 17:28

回復 4# gnimnek168


    就因為你要寫入的位置在即時資料工作表
所以必須指名工作表,在切換工作表時才不會造成誤判
因為在THISWORKBOOK與一般模組內,未指定工作表名稱會被認定為作用中工作表
作者: gnimnek168    時間: 2011-12-15 23:54

本帖最後由 gnimnek168 於 2011-12-15 23:55 編輯
回復  gnimnek168
就因為你要寫入的位置在即時資料工作表
所以必須指名工作表,在切換工作表時才 ...
Hsieh 發表於 2011-12-15 17:28


請問這個:With .Sheets("即時資料"),不是已經有指定工作表名稱了嗎?

==============================================
啊啊,我瞭解大大的意思了,原來就是 CELL() 前面要加上 .CELL。

哈,趕緊來試試看,感謝感謝。 ^^




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