Limitando o que causou uma falha - Dicas do Excel

Às vezes, o Excel simplesmente envia uma mensagem do tipo “O Excel parou de funcionar. Pedimos desculpas por qualquer inconveniente. ”

Ao receber essa mensagem, você pode pressionar Ctrl + alt = "" + Delete e abrir a pasta de trabalho novamente (espero ter salvo todo o trabalho que você fez!), Desejando percorrer o código para encontrar a declaração ofensiva. Quando você executa uma única etapa do código, tudo pode funcionar bem, mas quando você executa em velocidade total, mais uma vez ele pode travar. Como você pode encontrar a declaração ofensiva?

Você pode escrever uma linha simples de código entre cada linha de código que pode ser a culpada. Portanto, o código VBA pode ser originalmente semelhante a este:

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

Esse procedimento, na verdade, não trava, mas ilustra o que você pode fazer se descobrir que o código trava quando executado em velocidade total, mas não quando você o percorre.

Você altera o código acima para este, com instruções inseridas Bug 1, Bug 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

Este é o procedimento do bug:

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

Este procedimento salva um valor no registro. A sintaxe para SaveSetting é:

SaveSetting Sintaxe

Para os três primeiros parâmetros, digamos que você use EOTB2 (para Excel Fora da Caixa 2) - uma seleção aleatória. Em vez disso, você pode usar SaveSetting "X", "X", "X", num. Se você usa muito isso, pode aproveitar as vantagens dos três níveis AppName, Section e Key. Dessa forma, se você tiver muitas seções no AppName, poderá limpar o registro de todas as suas configurações usando o simples DeleteSetting "EOTB2" (ou o que você definir para AppName), e todas as seções e chaves também serão excluídas.

Agora você executa o procedimento em velocidade total e ele trava. Então, você reinicia o Excel, chega ao VBE, abre a janela Imediata (pressionando Ctrl + G) e digita:

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

Se este procedimento retornar 4, por exemplo, ele travou em algum momento após o Bug 4. É improvável que a seção If / End If fosse a culpada; mais provavelmente era ActiveWorkbook.Unprotect SheetPassword. (Lembre-se de que este é apenas um exemplo, não o que realmente aconteceu.)

Se a sua execução inicial do Bug 1, Bug 2, etc. mostrar que o procedimento travou em uma grande seção do código após o Bug x, você pode inserir mais chamadas de bug para restringi-lo ainda mais. Você meio que faz uma pesquisa binária em um longo procedimento para encontrar o culpado.

Este artigo convidado é do Excel MVP Bob Umlas. É do livro More Excel Outside the Box. Para ver os outros tópicos do livro, clique aqui.

Artigos interessantes...