Erro de compilação ...
 
Notifications
Clear all

Erro de compilação - Função ou Sub não definida

4 Posts
3 Usuários
0 Reactions
976 Visualizações
(@teteuvec)
Posts: 6
Active Member
Topic starter
 

Prezados bom dia,

Estou tentando escrever um código capaz de fazer alguns cálculos. Mas quando ele é executado, o Split não divide a variável retornando #valor quando peço para ler qualquer resultado do vetor que foi gerado.
Alguém pode me ajudar a resolver este problema?

Public Function teste(a As String, b As String, c As String)
    Dim xvi() As Single
    Dim yvi() As Single
    Dim zvi() As Single
    Dim i As Integer
    Dim ninv(0 To 6) As Single
    Dim numcol As Integer
    Dim av() As Single
    Dim bv() As Single
    Dim cv() As Single

    Sheets("plan1").Select
    ninv(6) = Range("A1")
    ninv(3) = 0.001

    xvi = Split(a, "/")
    yvi = Split(b, "/")
    zvi = Split(c, "/")

'Neste ponto, é esperado 3 vetores criados a partir das variáveis a, b e c pelo Split. As 3 variáveis possuem 5 números separados por "/".
'At this point, I expect 3 vectors with the values of the variables a, b and c splited.
'Example:
'xvi(0) = 1600
'xvi(1) = 3000
'xvi(2) = 5000
'xvi(3) = 12000
'xvi(4) = 20000
'-------------x-------------

    For i = LBound(xvi) To UBound(xvi)
        av(0, i) = xvi(i)
        bv(0, i) = yvi(i)
        cv(0, i) = zvi(i)
    Next i

    For i = LBound(xvi) To UBound(xvi)
     av(1, i) = ninv(6)  av(0, i)
     av(2, i) = ninv(6) Mod av(0, i)
     av(3, i) = av(0, i) / bv(0, i)
     If av(1, i - 1) > xvi(1, i) Then
         av(1, i) = ninv(1)
         av(2, i) = ninv(2)
     End If
    Next i

'Neste ponto é esperado uma matriz chamada av com 20 elementos.
'At this point, I expect one matrix called "av" with 20 elements result of the "for".


    teste = av(0)
End Function
 
Postado : 04/05/2017 8:00 am
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

Teteuvec, bom dia.

Bem vindo ao Planilhando...

Split é uma função que retorna uma String, mas vc declarou as variáveis xvi, yvi e zvi que receberão o resultado da Split como sendo Single. Então, ou você declara também as 3 variáveis como String ou como Variant e se precisar usar o conteúdo convertido para Single, pode usar a função de conversão CSng(xvi) e assim por diante.

Muito embora rigorosamente isso não seja necessário - pois o VBA já usa o valor numério da String em cálculos se houver um -, use CSng(var) caso queira fazer a conversão explicitamente em seus cálculos mais adiante no código.

Obs.: não analisei o restante do código, somente essa sua demanda em relação ao Split.

 
Postado : 04/05/2017 9:36 am
(@skulden)
Posts: 170
Estimable Member
 

a, b e c são strings e você está tratando elas como números, depois você seta o av() e tenta operar com os elementos que estão dentro dele, que são textos.

Se a resposta lhe foi útil, clique no joinha!

 
Postado : 04/05/2017 10:15 am
(@teteuvec)
Posts: 6
Active Member
Topic starter
 

obrigado a todos! Edson era isso mesmo, funcionou. Segue abaixo o código completo e funcionando.

Function calcinverter(a As String, b As String, c As String)
    Dim xvi() As String
    Dim yvi() As String
    Dim zvi() As String
    Dim i As Integer
    Dim ninv(0 To 9) As Single
    Dim av() As Single
    Dim bv() As Single
    Dim cv() As Single
    Dim maxpower As Single
    Dim minpower As Single

    Sheets("System Specification").Select
    ninv(0) = Range("B3")
    
    xvi = Split(a, "/")
    yvi = Split(b, "/")
    zvi = Split(c, "/")

    ReDim av(4, UBound(xvi))
    ReDim bv(UBound(yvi))
    ReDim cv(UBound(zvi))

    For i = LBound(xvi) To UBound(xvi)
        av(0, i) = CSng(xvi(i))
        bv(i) = CSng(yvi(i))
        cv(i) = CSng(zvi(i))
        av(1, i) = ninv(0)  av(0, i)
        av(2, i) = ninv(0) Mod av(0, i)
            If i > 0 Then
                If av(1, i - 1) > av(1, i) And av(1, i) >= 1 Then
                    ninv(1) = av(1, i)
                    ninv(2) = av(0, i)
                    ninv(3) = av(2, i)
                    ninv(8) = cv(i)
                End If
            Else
                ninv(1) = av(1, i)
                ninv(2) = av(0, i)
                ninv(3) = av(2, i)
                ninv(8) = cv(i)
            End If
    Next i

    If ninv(3) > 0 Then
        For i = LBound(xvi) To UBound(xvi)
            av(3, i) = ninv(3)  av(0, i)
            av(4, i) = ninv(3) Mod av(0, i)
                If i > 0 Then
                    If av(4, i - 1) > av(4, i) And av(4, i - 1) > 0 Then
                        ninv(4) = av(3, i)
                        ninv(5) = av(0, i)
                        ninv(6) = av(4, i)
                        ninv(9) = cv(i)
                    End If
                Else
                    ninv(4) = av(3, i) + 1
                    ninv(5) = av(0, i)
                    ninv(6) = av(4, i)
                    ninv(9) = cv(i)
                End If
        Next i
    End If

    maxpower = ninv(1) * ninv(2) + ninv(4) * ninv(5)
    minpower = ninv(1) * ninv(8) + ninv(4) * ninv(9)
    ninv(7) = ninv(4) + ninv(1)
End Function
 
Postado : 04/05/2017 10:15 pm