Понекад Екцел једноставно пошаље поруку у стилу „Екцел је престао да ради. Жао нам је због непријатности. “
Када добијете такву поруку, можете притиснути Цтрл + алт = "" + Делете и поново отворити радну свеску (надамо се да сте сачували било шта што сте урадили!), Желећи да прођете кроз код да бисте пронашли увредљиву изјаву. Када у једном кораку прођете кроз код, сви ће можда радити у реду, али када га покренете пуном брзином, опет ће се можда срушити. Како можете пронаћи увредљиву изјаву?
Можете да напишете једноставну линију кода између сваке линије кода која би могла бити кривац. Дакле, ВБА код може првобитно изгледати отприлике овако:
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
Овај поступак се у ствари не руши, али илуструје шта можете да урадите ако откријете да се код сруши при пуној брзини, али не и када га прођете.
Горњи код мењате у овај, са уметнутим изјавама Буг 1, Буг 2, итд .:
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
Ево поступка грешке:
Sub Bug(num As Integer) SaveSetting "EOTB2", "EOTB2", "EOTB2", num End Sub
Овај поступак чува вредност у регистру. Синтакса за СавеСеттинг је:

За прва три параметра реците да користите ЕОТБ2 (за Екцел Оутсиде тхе Бок 2) - случајни избор. Уместо тога, можете користити СавеСеттинг „Кс“, „Кс“, „Кс“, нум. Ако ово много користите, можете искористити три нивоа АппНаме, Сецтион и Кеи. На тај начин, ако имате много одељака у АппНаме, можете да очистите регистар за сва своја подешавања помоћу једноставног ДелетеСеттинг „ЕОТБ2“ (или било чега другог што сте поставили за АппНаме), а сви одељци и кључеви ће такође бити избрисани.
Сада процедуру покрећете пуном брзином и она пада. Дакле, поново покренете Екцел, долазите до ВБЕ, отворите тренутни прозор (притиском на Цтрл + Г) и откуцајте ово:
? GetSetting(“EOTB2”,”EOTB2”,”EOTB2”)
Ако овај поступак на пример врати 4, онда се срушио негде после грешке 4. Мало је вероватно да је кривац одељак Иф / Енд Иф; вероватније је то била АцтивеВоркбоок.Унпротецт СхеетПассворд. (Запамтите да је ово само пример, а не оно што се заправо догодило.)
Ако ваше почетно покретање грешке 1, грешке 2 итд. Покаже да се процедура срушила у великом одељку кода након грешке к, можете да уметнете још позива за грешке да бисте је даље сузили. Некако извршите бинарну претрагу у дугом поступку да бисте пронашли кривца.

Овај гостујући чланак је из програма Екцел МВП Боб Умлас. Из књиге је, Још Екцел изван оквира. Да бисте видели остале теме у књизи, кликните овде.