Reducir las causas de un bloqueo: consejos de Excel

A veces, Excel simplemente da un mensaje como “Excel ha dejado de funcionar. Pedimos disculpas por cualquier inconveniente."

Cuando reciba un mensaje de este tipo, puede presionar Ctrl + alt = "" + Eliminar y abrir el libro de trabajo nuevamente (¡con suerte habiendo guardado el trabajo que había hecho!), Queriendo revisar el código para encontrar la declaración ofensiva. Cuando recorre el código con un solo paso, todo puede funcionar bien, pero cuando lo ejecuta a toda velocidad, una vez más puede fallar. ¿Cómo puede encontrar la declaración ofensiva?

Puede escribir una simple línea de código entre cada línea de código que podría ser el culpable. Entonces, el código de VBA originalmente puede verse así:

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

Este procedimiento, de hecho, no falla, pero ilustra lo que puede hacer si encuentra que el código falla cuando se ejecuta a toda velocidad, pero no cuando lo recorre.

Cambia el código anterior a este, con declaraciones insertadas Error 1, Error 2, etc .:

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

Aquí está el procedimiento de error:

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

Este procedimiento guarda un valor en el registro. La sintaxis de SaveSetting es:

Sintaxis de SaveSetting

Para los primeros tres parámetros, digamos que usa EOTB2 (para Excel Outside the Box 2), una selección aleatoria. En su lugar, podría utilizar SaveSetting "X", "X", "X", num. Si lo usa mucho, puede aprovechar los tres niveles AppName, Section y Key. De esa manera, si tiene muchas secciones en AppName, puede limpiar el registro para todas sus configuraciones usando el simple DeleteSetting "EOTB2" (o lo que sea que configure para AppName), y todas las secciones y claves también serán eliminadas.

Ahora ejecuta el procedimiento a toda velocidad y se bloquea. Entonces reinicia Excel, llega al VBE, abre la ventana Inmediato (presionando Ctrl + G) y escribe esto:

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

Si este procedimiento devuelve 4, por ejemplo, se bloqueó en algún momento después del error 4. Es poco probable que la sección If / End If fuera la culpable; lo más probable es que fuera ActiveWorkbook.Unprotect SheetPassword. (Recuerde que esto es solo un ejemplo, no lo que realmente sucedió).

Si su ejecución inicial del error 1, error 2, etc. muestra que el procedimiento se bloqueó en una gran sección de código después del error x, puede insertar más llamadas de error para reducirlo aún más. En cierto modo, haces una búsqueda binaria en un largo procedimiento para encontrar al culpable.

Este artículo invitado es de Bob Umlas, MVP de Excel. Es del libro, Más Excel fuera de la caja. Para ver los otros temas del libro, haga clic aquí.

Articulos interesantes...