Ir ao conteúdo
  • Cadastre-se

Excel Mudar variável VBA conforme a linha de cálculo


Ir à solução Resolvido por Edson Luiz Branco,

Posts recomendados

Olá!

Possuo o seguinte código: 

<Const lammax = 0.75
Const epson = 0.0001    'precisão
Const n = 0.013         'coef. de manning
Const pi = 3.141592     'pi
Dim q As Single         'vazão
Dim i As Single         'declividade
Dim d As Single         'diâmetro
Dim a As Single
Dim a1 As Single
Dim a2 As Single
Dim ac As Single
Dim amax As Single      'angulo máximo
Dim xaux As Single
Dim acos1 As Single     'angulo auxiliar
Dim area1 As Single
Dim rh1 As Single
Dim area2 As Single
Dim rh2 As Single
Dim fmax As Single
Dim fmin As Single
Dim epi As Single
Dim sinal As Integer
Dim fa As Single
Dim fab As Single
Dim lamina As Single

Function calculaB(dp As Single, ip As Single, qp As Single) As Variant
    
    i = ip
    q = qp
    d = dp
        
    If q < 1.5 Then
        q = 1.5
    End If
    
    q = q / 1000

    'cálculo de amax
    xaux = 1 - (2 * lammax)
    acos1 = -Atn(xaux / (Sqr(-xaux * xaux + 1))) + pi / 2
    amax = 2 * acos1
    a = amax
        
    a1 = 0.0001
    a2 = amax
    
    If a1 < (pi) Then
        area1 = (a1 - Sin(a1)) * d ^ 2 / 8
        rh1 = area1 / (a1 * d / 2)
            Else
                a1 = 2 * pi - a1
                area1 = (pi * d ^ 2) / 4 - ((a1 - Sin(a1)) * d ^ 2 / 😎
                rh1 = area1 / ((pi * d) - a1 * d / 2)
    End If
    
    If a2 < (pi) Then
        area2 = (a2 - Sin(a2)) * d ^ 2 / 8
        rh2 = area2 / (a2 * d / 2)
            Else
                a2 = 2 * pi - a2
                area2 = (pi * d ^ 2) / 4 - ((a2 - Sin(a2)) * d ^ 2 / 😎
                rh2 = area2 / ((pi * d) - a2 * d / 2)
    End If
    
    fmax = q - 1 / n * area1 * rh1 ^ (2 / 3) * Sqr(i)
    fmin = q - 1 / n * area2 * rh2 ^ (2 / 3) * Sqr(i)
        
    sinal = Sgn(fmax)
    
    a1 = 0.0001
    a2 = 2 * pi
    epi = a1 - a2
    
    Do While Abs(epi) > epson
    
    ab = (a1 + a2) / 2
    ac = ab
    
    If a1 < (pi) Then
        area1 = (a1 - Sin(a1)) * d ^ 2 / 8
        rh1 = area1 / (a1 * d / 2)
            Else
                a1 = 2 * pi - a1
                area1 = (pi * d ^ 2) / 4 - ((a1 - Sin(a1)) * d ^ 2 / 😎
                rh1 = area1 / ((pi * d) - a1 * d / 2)
    End If
    
    If ab < (pi) Then
        area2 = (ab - Sin(ab)) * d ^ 2 / 8
        rh2 = area2 / (ab * d / 2)
            Else
                ab = 2 * pi - ab
                area2 = (pi * d ^ 2) / 4 - ((ab - Sin(ab)) * d ^ 2 / 😎
                rh2 = area2 / ((pi * d) - ab * d / 2)
    End If
    
    fa = q - 1 / n * area1 * rh1 ^ (2 / 3) * Sqr(i)
    fab = q - 1 / n * area2 * rh2 ^ (2 / 3) * Sqr(i)
    
    If Sgn(fab) = sinal Then
        a1 = ac
            Else
                a2 = ac
    End If
    epi = (a1 - a2)
    
    Loop
    
    lamina = (1 - Cos(ac / 2)) / 2
    lamina = Int(-lamina * 100) / 100
    aux_texto = Str$(-lamina)
    If -lamina < 0.75 Then
        calculaB = -lamina
        calculaB = ac
            Else
                calculaB = "conduto forçado"
    End If

End Function

Function veloc(ang As Single, di As Single, qp As Single) As Variant

ab = ang
d = di
q = qp

If ab < (pi) Then
    area2 = (ab - Sin(ab)) * d ^ 2 / 8
    rh2 = area2 / (ab * d / 2)
        Else
            ab = 2 * pi - ab
            area2 = (pi * d ^ 2) / 4 - ((ab - Sin(ab)) * d ^ 2 / 😎
            rh2 = area2 / ((pi * d) - ab * d / 2)
End If

vel = q / area2
veloc = vel

End Function>

 

Porém o valor de n não quero que seja uma constante e sim que a VBA pegue o valor da célula F conforme a linha em que esta calculando B, ou seja, se estou calculando na linha 26, quero que n seja F26. É possível?

Link para o comentário
Compartilhar em outros sites

  • Solução

Bom dia, @Carolina Nemeth

 

Em primeiro lugar, no início da UDF, use Application.Volatile para que sua function responda imediatamente  quando os valores forem alterados na coluna F.

E finalmente, para atribuir à variável n o valor da coluna F da mesma linha, pode ser usado o seguinte:

Function calculaB(dp As Single, ip As Single, qp As Single) As Variant
  Application.Volatile
  ...
  ...
  With Application.ThisCell
    n = .Worksheet.Range("F" & .Row).Value
  End With
  ...
  ...
End Function

 

  • Curtir 3
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...