none
Problema Função VBA RRS feed

  • Pergunta

  • Tenho um código que preciso utilizar no trabalho e gostaria de transformá-la em uma função, pois o SE é enorme e dá muito trabalho. Tenho noção apenas de Algoritmo, desconhecendo linguagens, porém curioso.

    Se alguém puder me ajudar, apenas corrigindo o bloco de código abaixo, agradeço imensamente e tentarei dar continuidade sozinho, pois como eu disse, sou curioso e gosto de tentar.

    Public Function Permanencia_BT(ingresso As Date, databt As Date, statusbt As String, ct1 As Date, dl1 As Date, ct2 As Date, dl2 As Date) As Integer
    
    Dim resultado As Variant
    
    'Se desligado
    If dl1 <> "" Then
        ElseIf ct2 = "" Then
           resultado = ActiveCell.FormulaR1C1 = "Datediff(d, date, dl1)"
    End If
    
    'Se admitido
    If ct1 <> "" Then
        ElseIf dl1 = "" Then
            resultado = ActiveCell.FormulaR1C1 = "Datediff(d, Date, databt)"
    End If
    
    'Aprovação/Reprovação BT
    If databt = "" Then
        ElseIf statusbt = "" Then
            resultado = ""
        ElseIf databt <> "" Then
            ElseIf statusbt = "Inapto" Then
                resultado = ""
        ElseIf databt <> "" Then
            ElseIf statusbt = "Apto" Then
                 resultado = ActiveCell.FormulaR1C1 = "Datediff(d, Date, databt)"
    End If
    
    'Admitido somente em 2
    If ct1 = "" Then
        ElseIf ct2 <> "" Then
        resultado = "Informar na primeira contratação"
    End If
    
    'Com status no BT sem data
    If databt = "" Then
        ElseIf statusbt <> "" Then
            resultado = "Informar data da Seleção Simulada"
    End If
    
    'Se ingresso é "", então ""
    If ingresso = "" Then
        resultado = ""
    End If
    
    End Function

    Obs.: já tentei inserir os blocos ao contrário, mas o erro "#VALOR!" é exibido das duas formas.

    Obrigado!


    sexta-feira, 11 de julho de 2014 15:07

Todas as Respostas

  • Boa noite Eduardo.

    Primeiramente peço a gentileza de um dos moderadores a transferência de seu tópico para o Fórum específico de VBA. Lá você terá mais chances de ser ajudado.

    Voltando à sua dúvida, como não tenho mais informações sobre as entradas e saídas esperadas, vou tentar lhe ajudar primeiramente de forma conceitual. Caso consiga detalhar melhor, posso tentar contribuir mais depois.

    • As funções criadas pelo usuário (UDF) sempre retornam o resultado na variável de mesmo nome da função. Assim, no seu caso, é preciso que vc associe o resultado desejado a uma variável de nome "Permanencia_BT". Como vc definiu a saída como "Integer", esse valor deve ter esse formato. Note que vc atribuiu à variável "resultado" o tipo "Variant" (Imagino que este seja o resultado que deve constar na planilha. Se for esse o caso, altere um dos dois formatos).
    • Não sei se é o caso, mas seus blocos de "If" podem estar errados:
    'Se desligado
    If dl1 <> "" Then
        ElseIf ct2 = "" Then
           resultado = ActiveCell.FormulaR1C1 = "Datediff(d, date, dl1)"
    End If

    O bloco acima tem resultado diferente de:

    'Se desligado If dl1 <> "" Then If ct2 = "" Then resultado = ActiveCell.FormulaR1C1 = "Datediff(d, date, dl1)"

    End If End If

    No 1º, caso < dl1="">, nada acontecerá. No 2º caso, se < dl1="">, então será avaliado se < ct2="">; se verdadeiro, a expressão será calculada.

    • Salvo engano (peço contribuições de quem souber), as UDF não podem inserir fórmulas na planilha, apenas resultados. Assim, a expressão a seguir não retorna um resultado válido:
    ActiveCell.FormulaR1C1 = "Datediff(d, date, dl1)"
    • Menos ainda se atribuir a uma variável:
    resultado = ActiveCell.FormulaR1C1 = "Datediff(d, date, dl1)"
    • Se quiser usar uma fórmula da planilha dentro do VBA, use algo do tipo:
    Teste = WorksheetFunction.Average(...)
    • Se a função existir no VBA, use diretamente:
    resultado = Datediff(...)

    Espero que as dicas te ajudem. Um abraço.


    Filipe Magno


    • Editado FilipeMagno segunda-feira, 14 de julho de 2014 02:01 Correção do Texto.
    domingo, 13 de julho de 2014 01:23