Néha az Excel egyszerűen csak az „Excel leállt. Sajnáljuk a kellemetlenségeket. ”
Amikor ilyen üzenetet kap, megnyomhatja a Ctrl + alt = "" + Törlés gombot, és újra megnyithatja a munkafüzetet (remélhetőleg minden elvégzett munkát elmentett!), És át akar lépni a kódon, hogy megtalálja a sértő állítást. Ha egyszer átlépi a kódot, minden rendben működhet, de amikor teljes sebességgel futtatja, ismét összeomolhat. Hogyan találhatja meg a jogsértő állítást?
Írhat egy egyszerű kódsort az egyes kódsorok közé, amelyek a tettesek lehetnek. Tehát a VBA kód eredetileg így nézhet ki:
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
Ez az eljárás valójában nem összeomlik, de szemlélteti, hogy mit tehet, ha úgy találja, hogy a kód teljes sebességgel futtatva összeomlik, de nem akkor, amikor átlépi azt.
A fenti kódot erre módosítja, beillesztett utasításokkal Bug 1, Bug 2, stb:
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
Itt van a hibaelhárítási eljárás:
Sub Bug(num As Integer) SaveSetting "EOTB2", "EOTB2", "EOTB2", num End Sub
Ez az eljárás elment egy értéket a rendszerleíró adatbázisban. A SaveSetting szintaxisa:

Az első három paraméternél mondjuk, hogy az EOTB2-t (a 2. dobozon kívüli Excel esetén) használja - véletlenszerű kiválasztás. Ehelyett használhatja a SaveSetting "X", "X", "X" számot. Ha ezt sokat használja, akkor kihasználhatja az AppName, Section és Key három szint előnyeit. Ily módon, ha sok szakasza van az AppName-ben, megtisztíthatja az összes beállítás beállításjegyzékét az egyszerű DeleteSetting "EOTB2" (vagy bármi mással, amelyet az AppName-hez állított be) használatával, és az összes szakasz és kulcs is törlődik.
Most teljes sebességgel futtatja az eljárást, és összeomlik. Indítsa újra az Excel programot, lépjen be a VBE-be, nyissa meg az Azonnali ablakot (a Ctrl + G megnyomásával), és írja be ezt:
? GetSetting(“EOTB2”,”EOTB2”,”EOTB2”)
Ha ez az eljárás például 4-et ad vissza, akkor valamikor a 4. hiba után összeomlott. Nem valószínű, hogy az If / End If szakasz volt a tettes; nagyobb valószínűséggel ez az ActiveWorkbook volt. Távolítsa el a SheetPassword védelmét. (Ne feledje, hogy ez csak egy példa, és nem az, ami valójában történt.)
Ha a Bug 1, Bug 2 stb. Kezdeti futtatása azt mutatja, hogy az eljárás egy nagy kódrészben összeomlott a Bug x után, további hibahívásokat is beilleszthet, hogy tovább szűkítse. Egyfajta bináris keresést végez egy hosszú eljárás során, hogy megtalálja a tettest.

Ez a vendég cikk az Excel MVP Bob Umlas-tól származik. A Több Excel a dobozon kívül című könyvből származik. A könyv többi témájának megtekintéséhez kattintson ide.