Notifications
Clear all

Não consigo usar variáveis como parametros de funções

13 Posts
5 Usuários
0 Reactions
2,420 Visualizações
(@oseas)
Posts: 0
New Member
Topic starter
 

Galera! blz?

Sou novo no VBA, preciso de um Help!!
Não estou conseguindo usar variáveis como parâmetros de funções, como faço isso?

Por exemplo:
ActiveCell.FormulaR1C1 = "=GetKM(variavel,-32,RC[-5],RC[-4])"

onde tem variável, não consigo coloca-la, da erro!!
tentei colocar cells(l,c), tbm não funciona!
por ex:
ActiveCell.FormulaR1C1 = "=GetKM(cells(l,c),-32,RC[-5],RC[-4])"

Abaixo está o código

'calcula as distancias de todos
Sub calcula_distancia_todos()
Dim lin1, lin2 As Integer

 ' quantidade de linhas da mesma equipe
 lin1 = 2 'primeira ocorrencia
 lin2 = 2 ' ultima ocorrencia
latit = 0
longit = 0

 Do While Cells(lin1, 47).Value = Cells(lin2, 47).Value    
    latit = Cells(lin1, 64).Value
    longit = Cells(lin1, 65).Value
    
    'qtdLinhas = qtdLinhas + 1
    Cells(lin2 + 1, 69).Select
    ActiveCell.FormulaR1C1 = "=GetKM(latit,longit,RC[-5],RC[-4])"
    lin2 = lin2 + 1
    
 Loop
' lin1 = lin2
End Sub


'Distancia Linear entre dois pontos
Function GetKM(lat1Degrees As Double, lon1Degrees As Double, lat2Degrees As Double, lon2Degrees As Double)
    Dim earthSphereRadiusKilometers As Double
    Dim kilometerConversionToMilesFactor As Double
    Dim lat1Radians As Double
    Dim lon1Radians As Double
    Dim lat2Radians As Double
    Dim lon2Radians As Double
    Dim AsinBase As Double
    Dim DerivedAsin As Double
    'Mean radius of the earth (replace with 3443.89849 to get nautical miles)
    earthSphereRadiusKilometers = 6371
    'Convert kilometers into miles
    kilometerConversionToMilesFactor = 0.621371
    'Convert each decimal degree to radians
    lat1Radians = (lat1Degrees / 180) * 3.14159265359
    lon1Radians = (lon1Degrees / 180) * 3.14159265359
    lat2Radians = (lat2Degrees / 180) * 3.14159265359
    lon2Radians = (lon2Degrees / 180) * 3.14159265359
    AsinBase = Sin(Sqr(Sin((lat1Radians - lat2Radians) / 2) ^ 2 + Cos(lat1Radians) * Cos(lat2Radians) * Sin((lon1Radians - lon2Radians) / 2) ^ 2))
    DerivedAsin = (AsinBase / Sqr(-AsinBase * AsinBase + 1))
    'Get distance from [lat1,lon1] to [lat2,lon2]
    GetKM = Round(2 * DerivedAsin * earthSphereRadiusKilometers, 2)
    'Miles: = Round(2 * DerivedAsin * (earthSphereRadiusKilometers * kilometerConversionToMilesFactor), 2)
End Function

O problema está nas variáveis latit e longit, tentei de varias formas, não consegui!

Alguem pode me ajudar! pfv!!

 
Postado : 28/11/2016 2:17 pm
(@mprudencio)
Posts: 0
New Member
 

Uma função nao precisa ter ActiveCell.FormulaR1C1, porque a função sera inserida sempre na celula ativa

Tente remover essa parte do codigo

 
Postado : 28/11/2016 2:25 pm
(@oseas)
Posts: 0
New Member
Topic starter
 

tentei, não deu certo!

a função ficaria solta?
...
GetKM(latit,longit,RC[-5],RC[-4])
...

é isso msm?

 
Postado : 28/11/2016 2:49 pm
(@edsonbr)
Posts: 0
New Member
 

Oseas, acho que o que o Marcelo quis dizer é que vc só precisa mesmo é da função GetKM, essa outra rotina, a "calcula_distancia_todos()" poderia tranquilamente ser dispensada.

Para isso, vc usaria direto a função GetKM nas células do Excel (uma função criada assim é chamada de UDF - User Defined Function ou Função Definida pelo Usuário).

Não sei quais células vc irá usar para inserir o resultado do cálculo da distância, mas digamos que seja em A1 e que as coordenadas de latitude e longitude iniciais e finais estejam em B1, C1, D1 e E1 respectivamente.
Então no Excel (não no VBA), em A1 seria suficiente inserir a fórmula =GetKM(B1;C1;D1;E1). Feito isso é só arrastar a "fórmula" para as demais células, como vc faria com qualquer fórmula normal do Excel.

 
Postado : 28/11/2016 10:20 pm
(@djunqueira)
Posts: 0
New Member
 

Vc tb pode calcular distância entre dois ou mais endereços usando funções do Excel, SERVIÇOWEB() e FILTROXML(), com acesso ao Google Maps.

Veja como na planilha anexa na aba 'hoteis info'.

 
Postado : 28/11/2016 10:58 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Para passar sua "função" na planilha com variaveis, deve utilizar a linha de codigo conforme abaixo:
Note que os dados da formula antes e depois da(s) variavel(is) são concatenados

    'qtdLinhas = qtdLinhas + 1
    Cells(lin2 + 1, 69).FormulaR1C1 = "=GetKM(" & Latit & "," & Longit & ",RC[-5],RC[-4])"
    'ActiveCell.FormulaR1C1 = "=GetKM(latit,longit,RC[-5],RC[-4])"
 
Postado : 29/11/2016 6:00 am
(@oseas)
Posts: 0
New Member
Topic starter
 

Para passar sua "função" na planilha com variaveis, deve utilizar a linha de codigo conforme abaixo:
Note que os dados da formula antes e depois da(s) variavel(is) são concatenados

    'qtdLinhas = qtdLinhas + 1
    Cells(lin2 + 1, 69).FormulaR1C1 = "=GetKM(" & Latit & "," & Longit & ",RC[-5],RC[-4])"
    'ActiveCell.FormulaR1C1 = "=GetKM(latit,longit,RC[-5],RC[-4])"

Obrigado!! O caminho é esse!

só teve um pequeno probleminha, a virgula foi substituída por " ; " ponto e vírgula.
ex:

no excel a formula está sendo exibida assim:
=GetKM(-13;584334999999900;-38;928992;BL5;BM5)

onde deveria ser:
=GetKM(-13,584334999999900;-38,928992;BL5;BM5)

Sabe o que poderia ser isso?

 
Postado : 29/11/2016 7:51 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Ao utilizar o VBA para "passar" formulas, cada parâmetro deve ser "separado" por virgulas, ao "gravar" essas formulas na planilha, automaticamente são substituidas pelo padrão da linguagem do sistema, no caso Brasil ";" (ponto e virgula)
Assim sua formula deve ficar na planilha GetKm(latit;Longit;Range1;Range2) , ou seja quatro parametros.
Verifique como a variavel latit recebe o valor da planilha, não deveria haver troca. Poste seu modelo/exemplo

 
Postado : 29/11/2016 8:46 am
(@oseas)
Posts: 0
New Member
Topic starter
 

Obrigado, Reinado!
Está quase pronto!
Só tem um errinho..

latit = Cells(lin1, 64).Value
longit = Cells(lin1, 65).Value

'qtdLinhas = qtdLinhas + 1
Cells(lin2 + 1, 69).FormulaR1C1 = "=GetKM(" & latit & "," & longit & " ,RC[-5],RC[-4])"

latit armazena o conteudo de uma célula e longit de outra.

esses valores são por exemplo, da forma: -13,584334999999900 -38,928992000000000
ou seja:
latit = -13,584334999999900
longite = -38,928992000000000

o que está acontecendo é:

Ao aplicar Cells(lin2 + 1, 69).FormulaR1C1 = "=GetKM(" & latit & "," & longit & " ,RC[-5],RC[-4])"

A fórmula retornado na Cells(lin2 + 1, 69) do excel está sendo: =GetKM(-13;584334999999900;-38;928992;BL3;BM3)

observe que o "," do valor de latit foi substituida por ";"

a forma correta seria: =GetKM(-13,584334999999900;-38,928992;BL3;BM3)

Deu pra entender?

 
Postado : 29/11/2016 9:58 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Ai está o "erro". O VBA deve entender o valor como 13.58433, pois o ponto é o separador decimal. Não sendo assim, experimente utilizar uma função de substituição: Replace;
Algo =/- assim: --> latit = VBA.Replace(latit, ",", ".")
Ou ainda definir as variaveis previamente como double
ou ainda passe na formula a range não o valor.

 
Postado : 29/11/2016 10:21 am
(@oseas)
Posts: 0
New Member
Topic starter
 

Ai está o "erro". O VBA deve entender o valor como 13.58433, pois o ponto é o separador decimal. Não sendo assim, experimente utilizar uma função de substituição: Replace;
Algo =/- assim: --> latit = VBA.Replace(latit, ",", ".")
Ou ainda definir as variaveis previamente como double
ou ainda passe na formula a range não o valor.

Com essas instruções só não consegui corrigir o segundo parametro, a formula no excel ficou assim:
=GetKM(-13,5843349999999;-38928992;BL3;BM3).

O segundo parametro deveria ser -38,928992.
A vírgula foi "comida"

Sua última sugestão foi passar na formula a range e não o valor.
Como eu faço isso? lembrando que deve ser de um forma que eu possa variar! ou seja, tem que ter uma variável envolvida. Essa solução, na verdade, seria a melhor para mim.

 
Postado : 29/11/2016 12:51 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Talvez assim:

Sub calcula_distancia_todos()
Dim lin1 As Integer, lin2 As Integer
Dim Latit As Range, Longit As Range

' quantidade de linhas da mesma equipe
lin1 = 2 'primeira ocorrencia
lin2 = 2 ' ultima ocorrencia

Do While Cells(lin1, 47).Value = Cells(lin2, 47).Value
    Set Latit = Range("BL" & lin1)
    Set Longit = Range("BM" & lin1)
    
    'qtdLinhas = qtdLinhas + 1
    Cells(lin2 + 1, 69).Select
    ActiveCell.FormulaR1C1 = "=GetKM(latit,longit,RC[-5],RC[-4])"
    lin2 = lin2 + 1
    
Loop
' lin1 = lin2
End Sub
 
Postado : 30/11/2016 4:12 am
(@oseas)
Posts: 0
New Member
Topic starter
 

Obrigado, Reinaldo!
Resolvido..

 
Postado : 01/12/2016 6:51 pm