Mempersempit Apa yang Menyebabkan Crash - Excel Tips

Terkadang Excel hanya memberikan pesan di sepanjang baris "Excel telah berhenti bekerja. Kami mohon maaf atas ketidaknyamanan ini. ”

Ketika Anda mendapatkan pesan seperti itu, Anda mungkin menekan Ctrl + alt = "" + Hapus dan membuka buku kerja lagi (semoga telah menyimpan pekerjaan apa pun yang telah Anda lakukan!), Ingin menelusuri kode untuk menemukan pernyataan yang menyinggung. Ketika Anda satu langkah melalui kode, semua dapat berfungsi dengan baik, tetapi ketika Anda menjalankannya dengan kecepatan penuh, sekali lagi itu mungkin macet. Bagaimana Anda bisa menemukan pernyataan yang menyinggung?

Anda dapat menulis baris kode sederhana di antara setiap baris kode yang bisa menjadi pelakunya. Jadi kode VBA awalnya mungkin terlihat seperti ini:

Sub UICreation() Dim x As String On Error Resume Next x = Sheets("Scenario").Name If Err.Number 0 Then MsgBox "Current workbook needs to have a Scenario sheet!", vbCritical Exit Sub End If ActiveWorkbook.Unprotect WorkbookPassword Err.Clear ActiveWorkbook.Unprotect SheetPassword If Err.Number 0 Then MsgBox "Workbook cannot be unprotected by the macro.", vbCritical Exit Sub End If Application.OnTime Now, "More" ThisWorkbook.Sheets("FastPricer").Copy Before:=ActiveWorkbook.Sheets(1) End Sub

Prosedur ini, pada kenyataannya, tidak macet, tetapi ini menggambarkan apa yang dapat Anda lakukan jika Anda menemukan bahwa kode macet ketika dijalankan dengan kecepatan penuh tetapi tidak ketika Anda melangkah melewatinya.

Anda mengubah kode di atas menjadi ini, dengan pernyataan yang dimasukkan Bug 1, Bug 2, dll .:

Sub UICreation() Dim x As String On Error Resume Next Bug 1 x = Sheets("Scenario").Name Bug 2 If Err.Number 0 Then MsgBox "Current workbook needs to have a Scenario sheet!", vbCritical Exit Sub End If Bug 3 ActiveWorkbook.Unprotect WorkbookPassword Err.Clear Bug 4 ActiveWorkbook.Unprotect SheetPassword If Err.Number 0 Then MsgBox "Workbook cannot be unprotected by the macro.", vbCritical Exit Sub End If Bug 5 Application.OnTime Now, "More" Bug 6 ThisWorkbook.Sheets("FastPricer").Copy Before:=ActiveWorkbook.Sheets(1) End Sub

Berikut prosedur bugnya:

Sub Bug(num As Integer) SaveSetting "EOTB2", "EOTB2", "EOTB2", num End Sub

Prosedur ini menyimpan nilai di registri. Sintaks untuk SaveSetting adalah:

SaveSetting Syntax

Untuk tiga parameter pertama, katakanlah Anda menggunakan EOTB2 (untuk Excel Di Luar Kotak 2) - pilihan acak. Sebagai gantinya, Anda dapat menggunakan SaveSetting "X", "X", "X", num. Jika Anda sering menggunakan ini, Anda dapat memanfaatkan tiga level AppName, Section, dan Key. Dengan begitu, jika Anda memiliki banyak bagian di AppName, Anda dapat membersihkan registri untuk semua pengaturan Anda dengan menggunakan DeleteSetting "EOTB2" sederhana (atau apa pun yang Anda tetapkan untuk AppName), dan semua bagian dan kunci juga akan dihapus.

Sekarang Anda menjalankan prosedur dengan kecepatan penuh, dan macet. Jadi Anda memulai ulang Excel, masuk ke VBE, buka jendela Immediate (dengan menekan Ctrl + G), dan ketik ini:

? GetSetting(“EOTB2”,”EOTB2”,”EOTB2”)

Jika prosedur ini mengembalikan 4, misalnya, maka itu macet beberapa saat setelah Bug 4. Tidak mungkin bagian If / End If adalah pelakunya; kemungkinan besar itu adalah ActiveWorkbook.Unprotect SheetPassword. (Ingatlah bahwa ini hanya sebuah contoh, bukan apa yang sebenarnya terjadi.)

Jika operasi awal Anda dari Bug 1, Bug 2, dll. Menunjukkan bahwa prosedur macet di sebagian besar kode setelah Bug x, Anda dapat memasukkan lebih banyak panggilan bug untuk mempersempitnya lebih lanjut. Anda semacam melakukan pencarian biner dalam prosedur panjang untuk menemukan pelakunya.

Artikel tamu ini berasal dari Excel MVP Bob Umlas. Ini dari buku, More Excel Outside the Box. Untuk melihat topik lain di buku, klik di sini.

Artikel yang menarik...