2014-04-01 127 views
2

你好,並提前感謝您的幫助。宏失敗,'宏可能無法在此...'

我有一些我承認從網站上借用的代碼。它會更改每X秒顯示的表單。在我的情況下3秒。當我運行它時,它會一次變爲下一張,然後在3秒後出錯。

我收到的錯誤是「無法運行宏」C:\ users \ BenjaminSmith \ Desktop \ Book1.xlsm'!displaysheets'。宏可能無法在此工作簿是可用還是所有宏可能會被禁用。」

這裏是我的宏

Sub displaysheets() 

ShtNum = ActiveSheet.Index 

ShtNum = ShtNum + 1 
If ShtNum > Sheets.Count Then 
ShtNum = 1 
End If 
Sheets(ShtNum).Activate 
Application.OnTime Now + TimeValue("00:00:03"), "displaysheets" 


End Sub 

如果我刪除線

Application.OnTime Now + TimeValue("00:00:03"), "displaysheets" 

我可以運行代碼宏一遍又一遍,沒有問題,除了事實上它不會自行繼續...

電子表格是一個XLSM MS VBA是7.0 Excel是2010.

我在想也許問題是因爲代碼是遞歸的?

感謝您的建議。

+1

它適用於我。希望你已經將'displaysheets'放入模塊中了? –

+0

你的代碼也適用於我。但我會簡化Sheet activate部件到'Sheets(ActiveSheet.Index Mod Sheets.Count + 1).Activate'。你可以嘗試'Application.OnTime Now + TimeValue(「00:00:03」),ThisWorkbook.Name&「!displaysheets」' – PatricK

+0

@Siddharth Rout我有'ThisWorkbook'中的代碼我插入了一個模塊'Module1'並且移動了那裏的代碼和一切按預期工作。這兩個地方有什麼不同? – Smith78

回答

0

嘗試把你的計時器在一個全局變量,並在每次運行函數時添加它,還配置準時是調度

Global tmrTimer1 

Sub displaysheets() 
    tmrTimer1 = Now + TimeValue("00:00:03") 
    'Enable the schedule 
    Application.OnTime tmrTimer1 , "displaysheets", , True 
End Sub 
1

嘗試:(我使用此代碼)

With Application 
    .EnableEvents = True 'needed 
    .OnTime EarliestTime:=Now + TimeSerial(0, 0, 3), Procedure:="displaysheets", Schedule:=True 
End With 
12

進一步的評論...

該代碼沒有工作,因爲你沒有將代碼粘貼到模塊中。這是新程序員中一個非常常見的錯誤。在這種情況下,Excel在搜索模塊時無法找到代碼。

@Siddharth Rout我在'ThisWorkbook'中有代碼我插入了一個模塊'Module1',並將代碼移到那裏,一切按預期工作。這兩個地方有什麼不同?

我會建議通過芯片皮爾遜的鏈接去HERE

摘自鏈接,如果該鏈接永遠腐爛。

標準代碼模塊,也稱爲簡單的代碼模塊或只是 模塊,是你把大部分的VBA代碼。您的基本宏 和您的自定義功能(用戶定義的功能)應位於這些 模塊中。對於新手程序員,您的所有代碼將在標準 模塊中。除了基本過程之外,代碼模塊 應包含對外部函數(Windows API或其他DLL)的任何聲明語句以及使用 類型語句定義的自定義數據結構。

您的工作簿的VBA項目可以包含儘可能多的標準代碼模塊 ,只要你想。這樣可以很容易地將您的程序拆分爲不同的模塊,以便組織和便於維護。例如,對於 示例,可以將所有數據庫過程放在名爲 DataBase的模塊中,並將所有數學過程放在另一個名爲Math的模塊 中。只要沒有使用專用 關鍵字聲明程序,或者該模塊未標記爲專用程序,則可以在任何其他模塊的任何模塊中調用任何 程序,而無需執行任何其他 特殊程序。

工作簿和工作表模塊是直接綁定到 工作簿對象和每個工作表對象的特殊模塊。 工作簿的模塊稱爲ThisWorkbook,每個工作表模塊的名稱與其所屬表單相同。這些模塊應該包含對象的事件過程,僅此而已。如果您將 事件過程置於標準代碼模塊中,Excel將無法找到它們,因此 它們將不會被執行。如果您將普通程序放在 工作簿或工作表模塊中,那麼如果沒有完全確定 的參考資格,您將無法打電話給他們。

用戶窗體模塊是用戶窗體對象的一部分,幷包含該窗體上控件的事件過程 。例如,用戶窗體上的命令按鈕的 Click事件存儲在該用戶窗體的代碼模塊 中。像工作簿和工作表模塊一樣,您應該在此模塊中爲用戶窗體控件僅放置事件過程。

類模塊用於創建新對象。這裏討論的類模塊不是 ,只是說使用類模塊來處理應用程序事件過程 。

+1

對於我來說,答案是將代碼移到模塊中,如解釋。計時器代碼導致彈出錯誤對話框,直到我將它從工作表移到模塊中。 – raddevus

+0

+1 Siddharth - 儘管我已經編程了多年的VBA,但我並不知道「Application.OnTime」調用需要在模塊中。它太糟糕了,這個答案是〜第10個我讀過的答案! – Tim