Notifications
Clear all

Macro com "VLOOKUP()" e interpolação linear

6 Posts
2 Usuários
0 Reactions
1,186 Visualizações
(@eduardo93)
Posts: 4
Active Member
Topic starter
 

Olá a todos,

Eu estou criando um macro que lê dados de uma tabela em outro arquivo .xlsx, a partir de um valor entrado pelo usuário. Para isso, usei a função "VLOOKUP()". Até aí, tudo funcionou perfeitamente. O problema é que, quando o usuário entra com um valor que não está presente na tabela, a função retorna "#VALOR!". No entanto, eu gostaria de programar uma interpolação linear entre os dados da tabela para esses casos. Li que deveria tentar fazer um "error trap", mas todas as minhas tentativas deram errado. Alguém poderia me ajudar a resolver esse problema? Desde já, obrigado.

Abaixo está um trecho do macro:

Public Function CZERNYax(tipo As String, i As Variant) As Variant
       
    If tipo = "1" Then
        If i > 2 Then
            CZERNYax = 8
        Elseif i <= 2 Then

'Se i houver na tabela (ok!):'

            CZERNYax = Application.WorksheetFunction.VLookup(i, Workbooks("Tabelas de Czerny.xlsx").Worksheets("Tipo 1").Range("A8:B28"), 2, 0)

'Se i não houver na tabela (não ok!):

'          CZERNYax = ?
        End If
   End If

'[...]'

End Function
 
Postado : 18/04/2014 10:48 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde!!

Leia:
http://www.cpearson.com/excel/errorhandling.htm

Att

 
Postado : 18/04/2014 10:51 am
(@eduardo93)
Posts: 4
Active Member
Topic starter
 

Boa tarde!

Após ler o texto que você me indicou, decidi fazer da seguinte maneira:

Public Function CZERNYax(tipo As String, i As Variant) As Variant
       
    If tipo = "1" Then
        If i > 2 Then
            CZERNYax = 8
        Elseif i <= 2 Then
            CZERNYax = Application.WorksheetFunction.VLookup(i, Workbooks("Tabelas de Czerny.xlsx").Worksheets("Tipo 1").Range("A8:B28"), 2, 0)
            On Error Resume Next
                   If Err.Number <> 0 Then
                          CZERNYax = 0    'Adotei o valor 0 apenas como exemplo para testar o cálculo
                   End If
        End If
   End If

'[...]

End Function

Mesmo assim, o problema continua. A função segue retornando "#VALOR!" quando eu busco valores que não estão na tabela. Aparentemente, na execução do macro, o programa não está reconhecendo isso como um erro, propriamente dito. Talvez por isso não esteja dando certo. Será que existe algo mais que possa ser feito? Ou será que estou fazendo a error trap do modo errado?

Desde já, obrigado!

 
Postado : 18/04/2014 11:25 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde!!

Combine na célula a usar a Função com Seerro ->

=SEERRO(CZERNYax(

Att

 
Postado : 18/04/2014 1:35 pm
(@eduardo93)
Posts: 4
Active Member
Topic starter
 

Boa tarde, Alexandre!

Baseado no texto que você recomendou, observei que estava cometendo um erro na ordem de execução da error trap. Percebi que deveria fazer:

'[...]

ElseIf i <= 2 Then
            On Error Resume Next
            CZERNYax = Application.WorksheetFunction.VLookup(i, Workbooks("Tabelas de Czerny.xlsx").Worksheets("Tipo 2A").Range("A8:B28"), 2, 0)
            If Err.Number <> 0 Then
                CZERNYax = 0  
            End If
        End If

'[...]

A princípio eu estava fazendo:

'[...]

ElseIf i <= 2 Then
            CZERNYax = Application.WorksheetFunction.VLookup(i, Workbooks("Tabelas de Czerny.xlsx").Worksheets("Tipo 2A").Range("A8:B28"), 2, 0)
            On Error Resume Next
            If Err.Number <> 0 Then
                CZERNYax = 0  
            End If
        End If

'[...]

Como é possível ver, o erro estava em colocar "On Error Resume Next" depois do valor de "CZERNYax". Pessoalmente, não consigo entender muito bem porque daria errado da primeira maneira. Talvez esteja relacionado à lógica do procedimento "On Error" no VBA. Em todo caso, funcionou.

Agradeço pela ajuda!

 
Postado : 18/04/2014 2:54 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde!!

Que bom que resolveu!!

Att

 
Postado : 19/04/2014 9:30 am