Usar o IFERROR no VBA

Espero que alguém me possa ajudar, por favor? Pesquisei muito no Google e não sei qual é o problema. Só me interesso por vba, por isso não sou especialista...

Estou a tentar automatizar alguns cálculos numa folha de cálculo enorme no trabalho, e acho que me está a escapar algo muito estúpido. Basicamente, um dos cálculos é uma divisão simples de uma célula por outra célula. Quando ocorrer um erro, quero que devolva um 0. Aqui está o código que continua a passar-se. over:

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

Author: Community, 2018-01-08

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
 3
Author: Middle, 2018-01-08 16:34:09
Ao programar, é sempre melhor evitar um erro ao verificar a sua possibilidade primeiro, em vez de disparar um e depois lidar com ele. Verifique se a célula está vazia ou a zero antes de efectuar o cálculo:
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.

 8
Author: Absinthe, 2018-01-08 14:55:29

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.

 4
Author: Mathieu Guindon, 2018-01-08 15:02:24

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).

Enfim....

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
 1
Author: Darren Bartrup-Cook, 2018-01-08 15:01:16