2016-05-06 378 views
0

這裏是我當前的代碼:Excel的VBA:變量重置爲0出於某種原因

Private Sub Workbook_Open() 
sumn1 = Sheets("Main").Cells(1, 1).Value 
sumn2 = Sheets("Main").Cells(2, 1).Value 
sumn3 = Sheets("Main").Cells(3, 1).Value 
sumn4 = Sheets("Main").Cells(1, 2).Value 
sumn5 = Sheets("Main").Cells(2, 2).Value 
sumn6 = Sheets("Main").Cells(3, 2).Value 
End Sub 

Private Sub Workbook_BeforeClose(Cancel As Boolean) 
    Sheets("Main").Cells(1, 1) = sumn1 
    Sheets("Main").Cells(2, 1) = sumn2 
    Sheets("Main").Cells(3, 1) = sumn3 
    Sheets("Main").Cells(1, 2) = sumn4 
    Sheets("Main").Cells(2, 2) = sumn5 
    Sheets("Main").Cells(3, 2) = sumn6 
End Sub 

所以,雖然該工作簿是開放的,它正在工作,一些動作變量sumn1後,sumn2..etc。 (這是全局變量)正在獲得附加值,例如+10到sumn1,或+5到sumn2等等。因爲我希望在關閉工作簿後保存它們,所以我將它們保存在一個我用「;;;」隱藏的單元格中。

的問題是,有時它工作正常,但有時(通常較長的時間,因爲工作簿已自閉後)變量重置爲0。

所以首先,是我的方法如何我的一個好嗎我正在保存數據還是因爲這種方法不好而無法工作?如果這是一個好方法,那麼我想我應該在別的地方尋找我的錯誤。

+0

您可以使用工作表作爲存儲選項而不是始終引用變量嗎?當然,這種方式可能會使性能下降一小部分,但它會爲您存儲的值提供更加一致的體驗。 *編輯*:Bathsheba擊敗了我:) – jonifen

+0

這樣的代碼位於一個工作簿「A」中,並且變量值正在保存在另一個工作簿「B」中,而沒有此VBA代碼。是否有可能打開工作簿「B」而沒有工作簿「A」的VBA並且變量被移動的單元格?那麼當你重新打開工作簿「B」時,其他一些具有不同值的單元格已經移動到他們的位置了? –

回答

1

當在VBA編輯器中單擊「重置」或達到「結束」語句時,所有變量也會重置爲零。可能還有其他的場合,儘管我想不出來。您目前只是在防止工作簿被關閉並重新打開。

所以你的方法是脆弱的。

你可以做的是完全刪除全局變量,總是參考工作表來設置和檢索它們的值。

0

您可以提高你的方法用幾個幫手的例程

Dim gVars as Variant 

Sub LoadVariables() 
    ' Load data from s/s into variable 
    gVars = Sheets("Main").Range(Cells(1, 1), Cells(3, 2)).Value 
End sub 

Sub SaveVariables() 
    ' Save data from variable into variables 
    Sheets("Main").Range(Cells(1, 1), Cells(3, 2)).Value = gVars 
End sub 

然後在你的代碼中使用LoadVariables當你需要使用的數據(通常是在任何的子需要它的開始)和SaveVariables當你已經更新了這些值。很明顯,這需要更多的錯誤處理等。

將整個變量集合加載到單個數組中也使維護代碼更容易(減少拼寫錯誤的機率)並在需要時處理迭代。

相關問題