2016-06-08 63 views
0

我目前有3個工作表:輸入,過程,輸出和使用輸入表和工藝表上各種商店中顯示的值的宏。問題在於當用戶按下與輸入頁面上的宏鏈接的提交按鈕時,在顯示輸出工作表之前,工作表切換到工作表。我知道這是因爲這行代碼:工作表。選擇開關屏幕excel VBA

Worksheets("Process").Select 

然而,每當我從宏中刪除它,一切都瘋狂超出範圍。有沒有任何方法可以選擇一張紙而不會實際上移動到它?我需要宏來做它的事情,然後簡單地顯示輸出表。提前致謝!

+0

參見[如何避免在Excel VBA宏利用選擇(http://stackoverflow.com/questions/10714251/how-to-avoid-using -select-in-excel-vba-macros)用於遠離依賴select和activate來實現目標的方法。 – Jeeped

回答

1

由於@Jeeped陳述和引用,請避免使用SelectActivate,此外,對參考資格進行限定更安全。

例如,您可以使用Range("A1").Value來獲取當前活動工作表中單元格A1的值,但如果用戶當時沒有活動表單或者另一個proc移動了視圖,該怎麼辦?您可以從潛在的任何工作表中獲取單元格A1的值。

最好是創建一個對工作表的引用,然後通過它發送所有工作,這樣就不需要更改活動工作表,並且範圍值的來源不存在歧義。

例如: -

Option Explicit 
Dim WkSht_I As Worksheet 'Input 
Dim WkSht_P As Worksheet 'Process 
Dim WkSht_O As Worksheet 'Output 

Public Sub Sample() 
Set WkSht_I = ThisWorkbook.Worksheets("Input") 
Set WkSht_P = ThisWorkbook.Worksheets("Process") 
Set WkSht_O = ThisWorkbook.Worksheets("Output") 

MsgBox "Input A1 = " & WkSht_I.Range("A1").Value 
MsgBox "Process A1 = " & WkSht_P.Range("A1").Value 
MsgBox "Output A1 = " & WkSht_O.Range("A1").Value 

Set WkSht_O = Nothing 
Set WkSht_P = Nothing 
Set WkSht_I = Nothing 
End Sub 

轉換你的程序,以這種方法應該是更安全,更清晰,可以設置活動工作表只是一次它,而正在處理的人或對顯示內容。

0

@當你使用多個工作表時,加里的方法是最好的方法。

如果你只用兩片工作,(考慮到你有activesheet和目標表)我要推薦

With Worksheets("Process") 
    Debug.Print .Range("A1") 
    Debug.Print Range("A1") 
End With 

通知「」盈方的範圍。

The 「。」表明它是部分隨着

換句話說,.Range( 「A1」)是相同工作表( 「處理」)。範圍( 「A1」)

由於第二範圍(「A1」)沒有「。」是一樣Activesheet.Range(「B1」)甚至它的隨着中檔

內如果activesheet是過程然後放出來將同一

但當你選擇以外的工作表進程,因爲activesheet已更改,則輸出會有所不同。

這將avoide使用選擇這改變了activesheet