#Golfinhu, logo EU que tenho uma tara incomum e até estranha por matrizes (rsrs), quando percebi que eu não sabia fazer isso (UDF Matricial), fui dar uma pesquisada e aprendi uma nova hoje, que é, como escrever uma UDF que funcione matricialmente. MUITO OBRIGADO por ter feito essa pergunta. Vamos lá!
O problema é que a função não está escrita considerando possibilidade de receber uma matriz como parâmetro ou devolver uma matriz como resultado. E esta adaptação é comigo mesmo! Foi relativamente fácil.
Escrevi de um jeito completo, à prova de erros e que funciona tanto matricialmente quanto não matricialmente com um texto como parâmetro, e com tratamento de erro caso o valor não seja um grau válido ou existam células vazias no meio!
Nota importante que eu só descobri depois de fazer: PODE USAR com <Enter> ou com <Ctrl>+<Shift>+<Enter> não faz diferença!
Exemplos de uso *(matriciais ou não):
=GrauParaDecimal("30º15'22"",0")
=GrauParaDecimal(A27)
=SOMA(GrauParaDecimal(A27:A29))
=SOMA(GrauParaDecimal(C3:C12))
=SOMA(GrauParaDecimal(A25:A30))
O novo código da UDF será esse, e dessa vez, os créditos são meus, rs, desculpe Reinaldão !
Option Explicit
Public Function GrauParaDecimal(Parametro As Variant) As Variant
'Autor:.....Fernando Fernandes
'Forum:.....Planilhando
'Contato:...fernando.fernandes@outlook.com.br
On Error GoTo DeuErro
Dim Intervalo As Excel.Range
Dim Celula As Excel.Range
Dim Coordenada As String
Dim Grau2Decimal As Double
Dim Grau As Integer
Dim Minuto As Integer
Dim Segundo As Integer
Dim Centesimo As Integer
Dim mtzEntrada As Variant
Dim mtzSaida As Variant
Dim i As Long
Dim j As Long
If VBA.TypeName(Parametro) = "String" Then
Texto:
Coordenada = VBA.CStr(Parametro)
Grau = VBA.CInt(Left(Coordenada, 2))
Minuto = VBA.CInt(Mid(Coordenada, 4, 2))
Segundo = VBA.CInt(Mid(Coordenada, 7, 2))
Centesimo = VBA.CInt(Right(Coordenada, 2))
Grau2Decimal = ((((Centesimo / 100) + Segundo) / 60) + Minuto) / 60 + Grau
GrauParaDecimal = VBA.CDbl(Grau2Decimal)
ElseIf VBA.TypeName(Parametro) = "Range" Then
If Parametro.Cells.Count = 1 Then GoTo Texto
mtzSaida = Parametro.Value
For i = LBound(mtzSaida, 1) To UBound(mtzSaida, 1) Step 1
For j = LBound(mtzSaida, 2) To UBound(mtzSaida, 2) Step 1
Coordenada = mtzSaida(i, j)
If Coordenada <> vbNullString Then
Grau = VBA.CInt(Left(Coordenada, 2))
Minuto = VBA.CInt(Mid(Coordenada, 4, 2))
Segundo = VBA.CInt(Mid(Coordenada, 7, 2))
Centesimo = VBA.CInt(Right(Coordenada, 2))
Grau2Decimal = ((((Centesimo / 100) + Segundo) / 60) + Minuto) / 60 + Grau
mtzSaida(i, j) = Grau2Decimal
Else
mtzSaida(i, j) = 0
End If
Next j
Next i
GrauParaDecimal = mtzSaida
End If
Exit Function
DeuErro:
Resume Next
End Function
Segue também um modelo onde essa UDF Matricial funciona. Vai encontrá-las nas células azuis.
Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel
Postado : 21/03/2016 8:08 pm