Olá Igor,
Algumas considerações:
a) Para saber o porque da rotina não entrar no loop, precisaria da planilha, pois o valor da célula D2 é que define a parada ou não do loop. Acredito que na planilha ela esteja zerada, logo, se o loop vai acontecer ENQUANTO D2 é diferente de zero, nem vai entrar no loop.
b) Você deveria adotar como critério de parada a variável FUNCAO. Não pare quando ela for zero, porque pode ser que nunca seja. Defina uma faixa de erro admissível, e pare quando atingir essa faixa. Ex:, DO WHILE ABS(FUNCAO) < 0,01. Um detalhe: se a função retorna valores no domínio dos números reais, a variável funcao não pode ser definida como inteiro. Se v, inicia com 0,1 e incrementa de 0,1 em 0,1, também não pode ser um inteiro. Se f vale 0,02, idem. É melhor deixar as variáveis sem definição, por enquanto.
c) não entendi a razão da variável RE
d) O método que está utilizando para obter as raizes é horrível, e pode ser que nunca atinja o resultado. Você inicia com V=0,1, e depois vai somando 0,1. Pode ser que esse passo (0,1) seja muito grande para gerar um erro de 0,01 (do exemplo acima). Pode ser que as raizes da equação sejam ambas negativas, logo, cada vez que somar 0,1, estará se afastando das raizes. Pode ser que a raiz mais próxima seja 654 mil, logo, vai demorar um bocado pra chegar lá indo no passo de 0,1 em 0,1.
e) o método da dicotomia é mais simples, muito mais eficiente que este seu, mas ineficiente se comparado com outros. Você define um intervalo onde está pelo menos uma das raizes. Digamos 0 e 100, e calcula f(0) e f(100). Ai calcula o ponto médio (no caso, 50) e calcula f(50). Se o sinal de f(0) for diferente do sinal de f(50) (um negativo e outro positivo) significa que a raiz está entre zero e 50, pois de um lado da raiz a curva está do lado oposto do que está do outro lado. Nesse caso, você mantem o zero e 50 passa a ocupar o lugar do 100. Assim, o intervalo agora é 0 a 50. Calcula novamente o ponto médio, calcula seu f, e verifica novamente os sinais. Se entre 0 e 25 o sinal for o mesmo, significa que a raiz está entre 25 e 50. Assim, o 25 assume o lugar do zero, e o intervalo passa a ser 25-50. Vai repetindo o processo, que vai estreitando o intervalo ao redor da raiz. Quando o intervalo estiver abaixo de uma certa precisão que você definiu, pode parar o processo. O ruim desse método é que você tem que saber qual o intervalo inicial que contém a raiz, ou seja, descobrir 2 valores que gerem sinais diferentes quando jogados na função.
f) há um método mais eficiente chamado Newton-Raphson, muito mais eficiente que a dicotomia, e que exige apenas um número qualquer como início. Fixa o número 100, por exemplo, e manda rodar que ele acha a raiz com muito menos iterações. Você vai precisar da função (normalmente nominada por f(x), que você já tem, e da primeira derivada da função, nominada f'(x) (tem uma linha após o f, e diz-se "efe linha de x". No seu caso a primeira derivada é
funcao = - 1030.16 / v^2 - 24.453 * f * 2 * v - 2 * v
g) procure por outros métodos no google, procurando por "raizes funções cálculo numérico" ou "raizes funções método iterativo"
Teste a rotina abaixo
Código: Selecionar todosPrivate Sub CommandButton1_Click()
Set W = Sheets("Plan1")
W.Select
funcao = 2E+22
Re = 25400 * v
f = 0.02
passo = 0.0001
v = passo
For Ciclos = 1 To 10000000
funcao = -186.2 + 1030.16 / v - 24.453 * f * v ^ 2 - v ^ 2
v = v + passo
If Abs(funcao) < 0.1 Then Exit For
Next
W.Range("A2").Value = v
W.Range("B2").Value = Re
W.Range("C2").Value = f
W.Range("D2").Value = funcao
W.Range("E2").Value = Ciclos
End Sub
Note que eu substitui o DO pelo FOR, porque o DO pode entrar em loop eterno e até travar o Excel, enquanto que o FOR tem quantidade de ciclos limitado; pode demorar dependendo do valor limite, mas uma hora termina. Aumente o valor limite, se achar necessário.
Se esta mensagem colabora para a solução do problema, peço que dê um Like, clicando no botão com o "positivo", acima e a direita.
Jimmy San Juan