- 帖子
- 835
- 主題
- 6
- 精華
- 0
- 積分
- 915
- 點名
- 0
- 作業系統
- Win 10,7
- 軟體版本
- 2019,2013,2003
- 閱讀權限
- 50
- 性別
- 男
- 註冊時間
- 2010-5-3
- 最後登錄
- 2024-11-14
|
3#
發表於 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 個方式我覺得應該比較好用且符合我們預期的效果. |
|