Board logo

標題: [發問] EXCEL並排顯示的方式下,每分鐘自動執行不同巨集 [打印本頁]

作者: 伊賽爾    時間: 2013-6-23 10:39     標題: EXCEL並排顯示的方式下,每分鐘自動執行不同巨集

A.xlsm 有一個巨集專門篩選A欄位,每1分鐘自動篩選一次

B.xlsm 有一個巨集專門篩選B欄位,每1分鐘自動篩選一次

單獨打開 A.xlsm 或 B.xlsm 時,巨集都很正常

但如果在EXCEL並排顯示 A.xlsm 和 B.xlsm

點到A.xlsm時,變成AB欄每1分篩選一次,B.xlsm則完全不動

點到B.xlsm時,變成AB欄每1分篩選一次,A.xlsm則完全不動

不用幾分鐘

A.xlsm 和 B.xlsm 的AB欄都篩選了(=.=)

想請教神人們

EXCEL有辦法在並排顯示的方式下

A.xlsm 每1分鐘自動篩選一次A欄位

B.xlsm 每1分鐘自動篩選一次B欄位

不曉得這種破文字敘述大家看得懂嗎(T^T)

[attach]15290[/attach]
[attach]15291[/attach]
作者: stillfish00    時間: 2013-6-23 12:21

回復 1# 伊賽爾
因為你macro2 用的是ActiveSheet , 改成ThisworkBook.Sheets("Sheet1") 看看
作者: luhpro    時間: 2013-6-23 21:05

本帖最後由 luhpro 於 2013-6-23 21:08 編輯
...
單獨打開 A.xlsm 或 B.xlsm 時,巨集都很正常
...
但如果在EXCEL並排顯示 A.xlsm 和 B.xlsm
...
不用幾分鐘
A.xlsm 和 B.xlsm 的AB欄都篩選了(=.=)
...
伊賽爾 發表於 2013-6-23 10:39


其實這是 Excel VBA 程式本身機制所造成作用對象非為預期的狀況.

不論你的 VBA 程式放在哪個區塊(Sheet1、Sheet2、,Module1...)
只要你沒特意去過濾的話,
使用 ActiveSheet 會作用在 "同群組" 中目前是 Active 的 Sheet,(也可能非同一檔案或Workbook) <--- 尤其是這個 .
  ** 上方的 "同群組" 是指在下方Sheet頁簽上按滑鼠右鍵,選移動或複製後,在選單中可以選到的任何Sheet)

所以如果程式還在背景運作,
這時使用者手動去切換了Sheet後(或是又另開了一個 Excel 檔案),
就可能發生非預期的結果.

我能想到的有兩種方式可以避過這類作用對象錯誤的問題:

1. 在 Sub 與 End Sub 中間先包上 If ActiveSheet.Name="Sheet1" Then 與 End If 的敘述,
以確保程式不會作用到錯誤的標的上,
不過在某些情形下其內的程式也可能根本就不會執行了.

2. 在 Module 上方加上 Public Sh As Worksheet 的共用指標宣告,
再於 Workbook 的 Open 方法程式內加上,
Set sh = Sheets("sheet2") 之類的指令來指定要作用的Sheet目標,
之後不管在哪裡都可以用 With sh 與 End With 或是 sh.[A1] 之類的指令來定死要作用的 Sheet.

當然, 第 2 個方式我覺得應該比較好用且符合我們預期的效果.
作者: 伊賽爾    時間: 2013-6-25 16:50

謝謝stillfish00大大,我有試著跑,但出現編譯錯誤後,就卡住沒辦法動了....
作者: 伊賽爾    時間: 2013-6-25 17:10

[attach]15312[/attach]

測試A.xlsm-Module1(程式碼)

Sub Macro1()
'
' Macro1 Macro
' 清除A
'

'
    Rows("6:6").Select
    ActiveSheet.ShowAllData
    Range("A5").Select
End Sub



Sub Macro2()
'
' Macro2 Macro
' 篩選A
'

'
    ActiveSheet.Range("$A$6:$G$16").AutoFilter Field:=2, Criteria1:="<>"
    Range("A5").Select
    Application.OnTime Now + TimeValue("00:00:03"), "Macro2"

測試A.xlsm-ThisWorkbook(程式碼)

Private Sub Workbook_Open()
Sheet1.Select
Set Sh = Sheets("sheet2")
End Sub

測試Bxlsm-Module1(程式碼)

Sub Macro1()
'
' Macro1 Macro
' 清除B
'

'
    Rows("1:1").Select
    ActiveSheet.ShowAllData
    Range("A1").Select
End Sub
Sub Macro2()
'
' Macro2 Macro
' 篩選B
'

'
    ActiveSheet.Range("$A$6:$G$16").AutoFilter Field:=1, Criteria1:="<>"
    Range("E1").Select
    Application.OnTime Now + TimeValue("00:00:03"), "Macro2"
End Sub

測試B.xlsm-ThisWorkbook(程式碼)

Private Sub Workbook_Open()
Sheet1.Select
Set Sh = Sheets("sheet2")
End Sub



----------------------------------------------------------

luhpro大大,我想我誤會你的意思,所以只得到了笑果....可以再多指正一二嗎?(Orz)
作者: 伊賽爾    時間: 2013-6-25 17:28

[attach]15314[/attach]
連舉例都會寫錯....我真是個笨蛋啊!!
作者: GBKEE    時間: 2013-6-25 17:49

回復 5# 伊賽爾
請將此程式碼複製於一般模組,分存於2檔並排視窗看看
  1. Option Explicit
  2. Sub Macro1()
  3.     Application.OnTime Now + #12:00:05 AM#, "Macro1"
  4.     ThisWorkbook.ActiveSheet.Cells(65536, "a").End(xlUp).Offset(1) = Time
  5. End Sub
複製代碼

作者: 伊賽爾    時間: 2013-6-26 22:30

感謝GBKEE大大

我的問題已經解決囉^^




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