Usar o IFERROR no VBA
Sheets("Bridge").Range("W" & SumIfInt) = Application.WorksheetFunction.IfError(Sheets("Bridge").Range("AA" & SumIfInt) / Sheets("Bridge").Range("D" & SumIfInt), 0)
eu recebo um erro de tempo de execução 6 Overflow
obrigado antecipadamente
4 answers
Tente isto sem a função de erro. Como mencionado abaixo, você deve usar em erro continuar a seguir com muito cuidado.
Atenção: {[1] } irá ignorar todos os casos de erro para o resto do código, a menos que On error goto 0
esteja presente. Além disso, se você gostaria de pegar um erro específico, você pode usar if error = 'number' then
para lidar com eles de acordo. Aplicacao.função do documento de trabalho.iserror é melhor usado no excel, do que no excel vba.
On error resume next
Sheets("Bridge").Range("W" & SumIfInt) = Sheets("Bridge").Range("AA" &
SumIfInt) / Sheets("Bridge").Range("D" & SumIfInt)
if err <>0 then
Sheets("Bridge").Range("W" & SumIfInt) = 0
end if
On error goto 0
If IsEmpty(Sheets("Bridge").Range("D" & SumIfInt)) Or Sheets("Bridge").Range("D" & SumIfInt) = 0 Then
Sheets("Bridge").Range("W" & SumIfInt) = 0
Else
Sheets("Bridge").Range("W" & SumIfInt) = Sheets("Bridge").Range("AA" & SumIfInt) / Sheets("Bridge").Range("D" & SumIfInt)
End If
No erro continuar a seguir basicamente diz "Se você encontrar um erro basta ignorá-lo". Isto pode causar todo o tipo de problemas inesperados e só deve ser usado como último recurso.
Verifique também a função IsError na VBA.
Qual é o tipo declarado de SumIfInt
? Se isso é Integer
, seu valor legal máximo é 32.767, porque Integer
é um tipo de 16-bit-e usando um tipo inteiro de 16-bit assinado para representar números de linha em uma planilha do Excel é uma boa maneira de alcançar erro de execução 6 "Overflow".
Utilize um tipo inteiro de 32 bits em vez disso:
Dim SumIfInt As Long
SE Sheets("Bridge").Range("D" & SumIfInt)
é um valor muito pequeno, é possível que usá-lo como denominador faça o resultado transbordar um Integer
, ou possivelmente até mesmo um Long
- nesse caso em vez disso, deve usar um Double
Tipo de ponto flutuante.
Quando ocorrer um erro, quero que devolva um 0.É melhor que o código não acertasse num erro. O único erro que você deve estar preocupado aqui, é "Divisão por Zero" - na verdade, também "Digite Mismatch" se alguma das células envolvidas pode conter um valor de erro - em qualquer caso, empurrando o erro para baixo do tapete com
On Error Resume Next
não está mostrando nada sobre como evitar essa situação no futuro.
O melhor código de manipulação de erros é o código que evita levantar erros evitáveis em primeiro lugar.
Dim divisorValue As Variant
divisorValue = Sheets("Bridge").Range("D" & SumIfInt)
If IsError(divisorValue) Or IsEmpty(divisorValue) Then
' return 0 and bail out
Exit Function
End If
Dim divisor As Double
divisor = CDbl(divisorValue)
Agora use o valor conhecido por ser ok divisor
em vez disso.
Uma nota sobre a tua gestão de objectos: estás a dizer exactamente a mesma referência de objectos várias vezes - isso é ineficiente.
Se Sheets("Bridge")
existe em tempo de compilação em ThisWorkbook
(O Livro de trabalho que está a correr o código), então você nunca precisa de dereferência dessa forma-VBA cria uma variável de objecto de âmbito global para cada folha de trabalho no livro de trabalho - seleccione-a no Vbe's Project Explorer (Ctrl+R), mostre as suas propriedades (F4), depois configure as suas (Name)
para algo significativo, por exemplo BridgeSheet
. Então podes fazer isto.
BridgeSheet.Range("D" & SumIfInt)
Outra dica: quanto mais você embalar em uma única instrução, mais difícil se torna a depuração, porque mais possíveis pontos de falha existem.
Considere puxar os valores invidividuais envolvidos para suas próprias variáveis, então validando-as, Então executando a divisão uma vez que você sabe fazer isso não vai explodir.
Tente evitar a criação de erros em primeiro lugar - On Error
deve geralmente ser usado para lidar com erros inesperados.
O raciocínio por trás disso é que se um erro genuíno ocorreu após o On Error Resume Next
seria ignorado e sua soma seria 0.
por exemplo, se alguém escreveu 500 em vez de um500 vais ter apenas um 0 (improvável, mas ... na verdade, não muito rebuscado-nunca abaixo da estimativa um idiota suficientemente talentoso).
Se Sheets("Bridge").Range("D" & SumIfInt)
é zero ou vazio você vai ter uma divisão por 0 erro.
Desde que tudo o resto esteja correto (sem texto, todos os outros números presentes), então esta é a única figura que você precisa verificar:
Sub Test()
Dim SumIfInt As Long
SumIfInt = 2
With ThisWorkbook.Sheets("Bridge")
If .Range("D" & SumIfInt) = 0 Then
.Range("W" & SumIfInt) = 0
Else
.Range("W" & SumIfInt) = .Range("AA" & SumIfInt) / .Range("D" & SumIfInt)
End If
End With
End Sub