Manipulação de entr...
 
Notifications
Clear all

Manipulação de entradas - Erro '13' tipos incompatíveis

7 Posts
3 Usuários
0 Reactions
1,916 Visualizações
(@mathiasime)
Posts: 0
New Member
Topic starter
 

Boa tarde,

Tenho uma macro na qual defino uma função (mcubicspline) dentro de outra (mgetvoldol); a mgetvoldol calcula, no loop, a variável delta que é input da mcubicspline.

A mcubicspline trata o delta como uma matriz mas o output da mgetvol é um variant (double).

Dessa maneira, quando se tenta indexar um índice de matriz no delta, tenho o erro: "Erro em tempo de execução '13': tipos incompatíveis".

Fiz um teste o qual não solucionou mas ajudou: quando chamo a função mcubicspline referenciando, para o valor atribuído ao delta, uma célula com seu valor, calculo o spline de maneira correta, no entanto, quando escrevo, no cabeçalho da função, o valor do delta, tenho erro de #valor.

Sei que a função mcubicspline está correta mas estou com dificuldade em manipular as variáveis para linkar as duas funções, poderiam me ajudar?

Abaixo seguem os códigos:

Function mgetVolDol(Futuro As Double, Taxa As Double, Strike As Double, DU As Double, XArray As Variant, YArray As Variant) As Double
Dim x0, x, y, dum As Double
Dim delta As Variant
x0 = 0
x = 0.1
Do While Abs(x - x0) > 0.000001
x0 = x
dum = (Log(Futuro / Strike) + x ^ 2 / 2 * DU / 252) / (x * Sqr(DU / 252))
y = mNorm(dum)
delta = 1 - y 'se ploto o valor numa celula, a spline funciona, senão a spline dá erro de valor.
Range("p6").Value = delta
x = mCubicSpline(XArray, YArray, Range("p6").Value)
Loop
mgetVolDol = x
End Function

Function mCubicSpline(XArray As Variant, YArray As Variant, x As Variant)
Dim nRates As Double
nRates = Application.WorksheetFunction.Count(XArray) - 1
Dim m(), N(), Alfa(), Beta(), delta(), Q(), a(), B(), C() As Variant
'XArray é a matriz de deltas [0.05 0.10 0.25 0.35 0.50 0.65 0.75 0.90 0.95]
'YArray é a matriz de vols vinda da mVolatIDI para cada um dos deltas da XArray
'X é a resolução dos deltas no gráfico
ReDim m(0 To nRates + 1)
ReDim N(0 To nRates + 1)
ReDim Alfa(0 To nRates + 1)
ReDim Beta(0 To nRates + 1)
ReDim delta(0 To nRates + 1)
ReDim Q(0 To nRates + 1)
ReDim a(0 To nRates + 1)
ReDim B(0 To nRates + 1)
ReDim C(0 To nRates + 1)

For i = 0 To nRates - 1
m(i) = XArray(i + 2) - XArray(i + 1)
N(i) = YArray(i + 2) - YArray(i + 1)
Next

For i = 1 To nRates - 1
Q(i) = 3 * (N(i) / m(i) - N(i - 1) / m(i - 1))
Next

Alfa(0) = 1
Beta(0) = 0
delta(0) = 0

For i = 1 To nRates - 1
Alfa(i) = 2 * (m(i - 1) + m(i)) - m(i - 1) * Beta(i - 1)
Beta(i) = m(i) / Alfa(i)
delta(i) = (Q(i) - m(i - 1) * delta(i - 1)) / Alfa(i)
Next

Alfa(nRates) = 0
B(nRates) = 0
delta(nRates) = 0

For j = (nRates - 1) To 0 Step -1
B(j) = delta(j) - Beta(j) * Beta(j + 1)
a(j) = N(j) / m(j) - m(j) / 3 * (B(j + 1) + 2 * B(j))
C(j) = (B(j + 1) - B(j)) / (3 * m(j))
Next

nn = Application.Count(x)

Dim z() As Double
ReDim z(0 To nn + 1)

For i = 1 To nn
ArrayNo = Application.Match(x(i), XArray) ERRO '13' ACONTECE AQUI PARA TIPOS INCOMPATÍVEIS EM x(i)
Ti = Application.Index(XArray, ArrayNo)
y1 = Application.Index(YArray, ArrayNo)
ai = Application.Index(a(), ArrayNo)
bi = Application.Index(B(), ArrayNo)
ci = Application.Index(C(), ArrayNo)
z(i - 1) = y1 + ai * (x(i) - Ti) + bi * (x(i) - Ti) ^ 2 + ci * (x(i) - Ti) ^ 3
Next

mCubicSpline = Application.Transpose(z())

End Function

 
Postado : 03/08/2015 12:37 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Nem vou tentar entender os cálculos, se diz que está ok, acredito.
Porem o erro 13 normalmente ocorre quando tenta utilizar; por exemplo; um texto/string em uma variável definida como numérica; ou vice-versa, ou ainda é recebido uma mensagem de erro onde se espera um valor numérico.
Assim verifique se as definições e suas utilizações estão compatíveis.
Outra situação e que ao "chamar" a função "mCubicSpline", o valor atribuído a variável X da função é Range("p6").value --> x = mCubicSpline(XArray, YArray, Range("p6").Value); é possível que ao receber esse valor, esse x não seja considerado um Array

 
Postado : 03/08/2015 12:56 pm
(@mathiasime)
Posts: 0
New Member
Topic starter
 

Nem vou tentar entender os cálculos, se diz que está ok, acredito.
Porem o erro 13 normalmente ocorre quando tenta utilizar; por exemplo; um texto/string em uma variável definida como numérica; ou vice-versa, ou ainda é recebido uma mensagem de erro onde se espera um valor numérico.
Assim verifique se as definições e suas utilizações estão compatíveis.
Outra situação e que ao "chamar" a função "mCubicSpline", o valor atribuído a variável X da função é Range("p6").value --> x = mCubicSpline(XArray, YArray, Range("p6").Value); é possível que ao receber esse valor, esse x não seja considerado um Array

Reinaldo, um exemplo de valor output de delta no loop da mgetvoldol é 0.0592 e esse valor entra na mcubispline. Por que quando imprimo esse valor em uma célula, e chamo a função referenciando-a, a mcubicspline funciona mas quando escrevo no cabeçalho da função o 0.0592 ela dá erro de valor?

Não entendo também a incompatibilidade entre o output de delta na mgetvoldol e o input na mcubicspline se na spline defino-a como variant e entra como double.

 
Postado : 03/08/2015 1:14 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

O que você define/entende como "quando escrevo no cabeçalho da função"? é o trecho --> delta = 1 - y; se sim o problema pode estar na outra função (nNorm) --> y = mNorm(dum)
Mas como voce apontou o erro em ArrayNo = Application.Match(x(i), XArray) ERRO '13' ACONTECE AQUI PARA TIPOS INCOMPATÍVEIS EM x(i), tudo leva a crer que o problema está na range P6, talvez ao informar o valor na função voce esqueceu de altrerar na chamada da função ??

Se postar um modelo, talvez possamos chegar a uma solução

 
Postado : 03/08/2015 1:27 pm
(@mathiasime)
Posts: 0
New Member
Topic starter
 

O que você define/entende como "quando escrevo no cabeçalho da função"? é o trecho --> delta = 1 - y; se sim o problema pode estar na outra função (nNorm) --> y = mNorm(dum)
Mas como voce apontou o erro em ArrayNo = Application.Match(x(i), XArray) ERRO '13' ACONTECE AQUI PARA TIPOS INCOMPATÍVEIS EM x(i), tudo leva a crer que o problema está na range P6, talvez ao informar o valor na função voce esqueceu de altrerar na chamada da função ??

Se postar um modelo, talvez possamos chegar a uma solução

Reinaldo, a função mnorm tá funcionando certinha também, ja chequei.

O que você define/entende como "quando escrevo no cabeçalho da função"?
Se inputo na célula u23 0,052 e chamo a mcubicspline como =mcubicspline(vetor1; vetor2; u23), tenho o resultado que desejo; já se escrevo na barra de função =mcubicspline(vetor1; vetor2; 0.052) a funcao retorna #valor.

Eu poderia transformar meu delta (variant mas na pratica uma double) em uma matriz unitaria de maneira que ao entrar na mcubicspline ele reconheca o input matricialmente? Como faria?

 
Postado : 03/08/2015 1:58 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Bom não consigo acompanhar/simular, pois não sei a que se refere Vetor1....; mas na execução da função o valor de X é esperado uma matriz (x(i)), ao informar um valor na função
a definição passa a assumir um valor numérico, e não consegue atribuir um valor à X(i), porque procurar X(i) e não apenas X
Precisaria entender/visualizar melhor o objetivo

 
Postado : 03/08/2015 2:16 pm
(@edcronos)
Posts: 1006
Noble Member
 

tbm não entendi já que não se tem uma planilha com dados para testar

delta = 1 - y 'se ploto o valor numa celula, a spline funciona, senão a spline dá erro de valor.
Range("p6").Value = delta
x = mCubicSpline(XArray, YArray, Range("p6").Value)

Function mCubicSpline(XArray As Variant, YArray As Variant, x As Variant)

ArrayNo = Application.Match(x(i), XArray) 'ERRO '13' ACONTECE AQUI PARA TIPOS INCOMPATÍVEIS EM x(i)

considerando o exposto assim como o reinaldo falou o X é tratado como array sendo que é uma variavel comum
a função mCubicSpline exige que X tenha vários valores para percorrer que são provavelmente uma matriz ou até uma range com valoreS

já a função mgetVolDol passa o Valor de X como um valor simples e não uma matriz
pela logica o valor de X teria que ser algo como uma equação e não um valor simples

 
Postado : 03/08/2015 7:57 pm