none
Executar Worksheet_Calculate() apenas 1 vez, para não entrar em looping e apresentar debug RRS feed

  • Pergunta

  • Bom dia,

    Estou utilizando um lynk DDE (Dynamic data exchange) de um equipamento com a célula H24, tendo seu valor variando entre 0 e 1.

    Minha programação abaixo roda quando o valor da célula H24 é =1, porém apresenta um problema, ele entra em um looping infinito até dar erro. Como poderia fazer para rodar a programação apenas 1 vez quando a célula H24 for =1 para não entrar no looping infinito.

    Eu acredito que não posso usar outro Private Sub que não seja o calculte pois como estou usando um DDE os valores não são inseridos manualmente e assim não funcionam, tentei usar o change etc mais não funcionou.

    Segue programação feita:

    Private Sub Worksheet_Calculate()
    Static OldVal1 As Variant
        OldVal1 = Range("H24").Value
    If Range("H24").Value = 1 Then

        Application.Goto Reference:="Tab_Ciclo"
        ActiveWindow.SmallScroll Down:=3
        Selection.Copy
        Application.Goto Reference:="A_fim"
        Selection.End(xlUp).Select
        ActiveCell.Offset(1, 0).Range("A1").Select
        Selection.PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone _
            , SkipBlanks:=False, Transpose:=False
        Selection.PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone _
            , SkipBlanks:=False, Transpose:=False
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Sheets("Sheet1").Select
        ActiveCell.Offset(0, 5).Range("A1").Select
        Application.CutCopyMode = False
        ActiveCell.FormulaR1C1 = ""
        ActiveCell.Offset(1, 0).Range("A1").Select
    End If

    End Sub

    quarta-feira, 13 de setembro de 2017 12:11

Respostas

  • Olá, boa tarde.

    Um teste que sugiro é utilizar uma variável ou célula de controle para validar a execução da macro. Note que você criou uma variável estática que serviria para esta finalidade, mas não a utilizou no código. Teste algo do tipo:

    ''''OldVal1 = Range("H24").Value 'Remova daqui

    If Range("H24").Value = 1 and Range("H24").Value <> OldVal1 Then

    OldVal1 = Range("H24").Value 'insira aqui

    Adicionalmente, caso esta variável não tenha outra finalidade, eu declararia ela como uma variável pública de módulo (mantém seu estado entre execuções). Não estou certo que da forma que você fez o estado será mantido entre chamadas. Se ela for necessária para outra coisa crie uma específica.

    Abraço.


    Filipe Magno


    • Editado FilipeMagno quarta-feira, 13 de setembro de 2017 20:31 Complementação
    • Marcado como Resposta Simaosimao segunda-feira, 18 de setembro de 2017 13:13
    quarta-feira, 13 de setembro de 2017 20:29