2013-04-09 85 views
1

我想在用戶單擊Excel中的圖像(按鈕)時刪除工作表。但是,這使得excel崩潰並重新啓動,忘記了任何未保存的進度。使用VBA崩潰刪除工作表Excel

這是我的子:

Sub DeletePlan() 

Application.Calculation = xlCalculationManual 
Application.DisplayAlerts = False 
Dim SheetNamesToCopy As String 

SheetNamesToCopy = ActiveSheet.Name 



' Check what addon sheets exists for the media, then add existing ones to string 
If CheckSheet("periodeplan", True) = True Then 
    ThisWorkbook.SheetS(SheetNamesToCopy & " - periodeplan").Delete 
End If 

If CheckSheet("ukesplan", True) = True Then 
    ThisWorkbook.SheetS(SheetNamesToCopy & " - ukesplan").Delete 
End If 

If CheckSheet("Input", True) = True Then 
    ThisWorkbook.SheetS(SheetNamesToCopy & " - Input").Delete 
End If 

SheetS("Totalplan").Select 
ThisWorkbook.SheetS(SheetNamesToCopy).Delete 

Application.DisplayAlerts = True 
Application.Calculation = xlCalculationAutomatic 

End Sub 

應用程序崩潰的大部分時間。但並非總是......任何想法可能是錯誤的? (我已經測試並確認刪除功能導致崩潰,但它並不總是相同的表格)。

編輯:此功能不刪除工作簿中的最後一個工作表。還有20張紙。此外,我使用Application.Calculation = xlCalculationAutomatic,因爲有公式的分配,並且我不希望excel在所有連接表被刪除之前計算更改。

任何暗示或答案理解:)

+0

它在哪一行崩潰? – 2013-04-09 08:13:43

+0

如果您暫時關閉該行,它是否會崩潰:'Application.DisplayAlerts = False' – 2013-04-09 08:17:57

+0

@Olle它在刪除表單的行上崩潰,但不是每次都崩潰。但是最後一次刪除命令最常崩潰。 – 2013-04-09 08:31:44

回答

6

發生錯誤時啓動宏位於該要被刪除的片材之一的按鈕。

所以答案是:不要創建一個按鈕(或圖像鏈接到宏),刪除它所在的工作表。

如果任何人都可以加入到這個答案有原因的錯誤,請這樣做;)

+2

好點...不要刪除你的父母;) – glh 2013-04-09 12:10:44

+0

真的,我猜測這個崩潰是因爲我刪除了一個被認爲是這個宏的某種父對象的對象。因爲它啓動宏。可能是原因;) – 2013-04-09 12:23:57

+1

謝謝Ole。這讓我瘋狂。 在我之前(text_box是我的文本框對象)。 'text_box.OnAction = 「user_done_click」' 現在我代替設置 'text_box.OnAction = 「button_click」' 而加入該子 '私人小組button_click() Application.OnTime現在()+ TimeSerial的(0 ,0,1),「user_done_click」 End Sub' – Fredrik 2017-01-05 12:01:05

0

我相信你的鼻孔權利,解決這個問題的唯一途徑是確保這個宏是在總計劃表。你也在做一些不必要的步驟,選擇一個表格應該是激活並選擇一個單元格。

Sub DeletePlan()  
Application.Calculation = xlCalculationManual 
Application.DisplayAlerts = False 
Dim SheetNamesToCopy As String 

SheetNamesToCopy = ActiveSheet.Name 

'dont delete total plan 
If sheetnames = "Totalplan" then exit sub  

SheetS("Totalplan").Activate 
Activesheet.Cells(1,1).select 

'Turn off errors if sheet doesn't exist 
On error resume next 
ThisWorkbook.SheetS(SheetNamesToCopy & " - periodeplan").Delete 
ThisWorkbook.SheetS(SheetNamesToCopy & " - ukesplan").Delete 
ThisWorkbook.SheetS(SheetNamesToCopy & " - Input").Delete 
ThisWorkbook.SheetS(SheetNamesToCopy).Delete 
On error goto 0 

Application.DisplayAlerts = True 
Application.Calculation = xlCalculationAutomatic 

End Sub 
+0

我不完全同意你的看法。我創建了函數CheckSheet來檢查表單是否存在(因爲它通常不),我相信忽略錯誤來使代碼工作是不好的做法。另外爲什麼我需要選擇「Totalplan」內的單元格?這會改變什麼嗎? 錯誤是由於啓動宏的按鈕位於此宏中刪除的最後一個工作表上而導致的。宏本身位於一個Module中,因此它獨立於工作表本身。 – 2013-04-09 12:20:19

+0

這些實例相當普遍且非常可以接受的**不忽略**它,但預測錯誤,並讓它滑動,但確保錯誤0恢復**。選擇一個單元格可確保該工作表具有*階段*。並且由於該按鈕在**工作表上並且仍在運行宏,無論位置如何,當您刪除它時,都會使其恢復正常。你有另一種方法來啓動宏嗎? – glh 2013-04-09 12:35:12

+0

是的,我添加了一個按鈕到我用來創建工作表(及其相關工作表)副本的表單中。所以我現在工作:)有意義選擇一個單元格。我會補充說,謝謝:) – 2013-04-09 12:38:07

0

可以刪除從活動工作表的按鈕(或圖像)的活性片。你只需要解決它。

ActiveSheet.Move before:=Worksheets(1) 
Worksheets(2).Activate 
Worksheets(1).Delete 
1

我發現在Office 2013中,不能放置與該宏變化的單元格重疊的按鈕。有趣的是,如果變化本質上是數字,則不會發生,但如果它是字母數字的,當您嘗試刪除該選項卡時,它會發生變化。事實證明,當試圖手動刪除選項卡(通過鼠標點擊)或宏嘗試刪除選項卡時,會造成打擊。 THUS,我從這個線程中學到的教訓,並將其應用於我的具體情況,就是永遠不會在它發生變化的單元格上放置一個開發按鈕(在我的例子中,它僅僅是一個單元格,表示該宏所在的狀態)。 Excel 2013不喜歡這種情況,而Excel 2010根本不在乎。

+0

這個「答案」實際上是一個新問題和這個問題的答案的組合。您應該將其中的一部分作爲新問題和其他部分作爲該問題的答案。 (是的,你可以回答你自己的問題)。這是有用的信息。我希望你確實將其轉化爲問題和答案。 – Makyen 2015-02-28 00:47:43

3

我剛碰到這個問題我自己!我將推遲到更有經驗的設計師來完善這種技術,但作爲一般概念,我確實有一個工作解決方案:

如果允許宏運行它的過程然後刪除工作表,它不會崩潰。事情是這樣的:

Sub Delete_This_Sheet() 
 

 
    Application.OnTime Now + TimeValue("00:00:02"), "Watergate" 
 
    Sheets("Sheet with a death sentence").Visible = False 
 
    
 
End Sub 
 

 
Sub Watergate() 'To make things go away 
 

 
    Application.DisplayAlerts = False 
 
    Sheets("Sheet with a death sentence").Delete 
 
    Application.DisplayAlerts = True 
 

 
End Sub

0

我也有類似,但不完全相同的問題。我有一個使用以下命令刪除所有圖表的宏,但是雖然它運行正常,但Excel 2013註冊失敗,只要我嘗試保存該文件,並通過恢復到以前保存的狀態來「恢復」扔掉任何後續工作:

哦,它工作得很好,直到我從Excel 2010轉移到2013年,同時轉換到Windows 10。 厄運的命令是:

ThisWorkbook.Charts.Delete 

由於從上面的回答一些靈感,我第一次插入如下的刪除操作前的保存,然後更改刪除(原來的保存不畢竟需要但我喜歡他們那裏,即使我把它們註釋掉):

Dim graphSheet As Chart 
ActiveWorkbook.Save 
For Each graphSheet in this Workbook.Charts 
graphSheet.Delete 
ActiveWorkbook.Save 
Next graphSheet 

我還要提到的是有前述Application.DisplayAlerts = False前的for循環和下一步後當然Application.DisplayAlerts = True的...語句刪除不需要的

你確定要做這種類型的問題嗎?

再次感謝您的貢獻者的靈感。