Notifications
Clear all

Como Criar uma função Matricial com VBA

13 Posts
3 Usuários
0 Reactions
4,571 Visualizações
Wagner Morel
(@wagner-morel-vidal-nobre)
Posts: 0
Illustrious Member
Topic starter
 

Prezados companheiros do fórum,

Boa Noite!

Gostaria da ajuda de vocês para saber como faço para criar uma função matricial em VBA - Excel. Pode ser um exemplo qualquer. Para facilitar, eu pensei em uma pequena função que receba um Range e calcule o dobro dos valores desse Range. Numa planilha coloquei valores em A1, B1, A2 e B2. Gostaria de selecionar a faixa de células C1:D2 e, na barra de fórmula, digitar a função, teclar CTRL+SHIFT+ENTER para que a mesma me retorne o Dobro de cada um dos valores digitados na faixa A1:B2. Não consegui fazer isso, poderiam me ajudar?

Desenvolvo pequenas soluções em VBA Excel a valores que variam entre R$ 50,00 a R$ 200,00. Se te interessar, entre no meu instagran (vba_excel_desenvolvimento)

Atenciosamente
Wagner Morel

 
Postado : 11/10/2013 5:45 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Wagner,

Seria isso?

Range("C1:D2").Select
Selection.FormulaArray = "=(RC[-2]:R[1]C[-1])*2"

Abs,

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 11/10/2013 6:54 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Alem da dica do Mandrix, de um olhada em:

Working With Range.FormulaArray In VBA
Trabalhando com Range.FormulaArray Em VBA
http://colinlegg.wordpress.com/2012/05/ ... ay-in-vba/

[]s

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 11/10/2013 7:34 pm
Wagner Morel
(@wagner-morel-vidal-nobre)
Posts: 0
Illustrious Member
Topic starter
 

Mandrix e Mauro,

Boa Noite!

Muito obrigado por suas contribuições. Creio que talvez eu não tenha sido muito feliz na minha explicação inicial. Vou tentar explicar melhor:

Estou a procura de como criar uma função matricial. Seria uma UDF criada em VBA.

Como faço para criar uma função matricial simples que receba, por exemplo, um Range como parâmetro e que me retorne, por exemplo, o dobro dos valores contidos no Range recebido como parâmetro? Sei que poderia fazer facilmente isso sem necessariamente criar uma função matricial para fazer isso. Todavia, meu objetivo é aprender a criar uma função matricial em VBA de forma simples e poder usá-la na própria interface do Excel como se fosse uma função nativa (com é o caso da função Nativa MATRIZ.INVERSO).

Seria alguma coisa como (creio eu):
Function Dobro (Valores As Range) As Range
Dobro = Valor * 2
End Function

Assim, se eu tiver uma planilha com os seguintes valores:
A1 = 2, B1 = 4
A2 = 1, B2 = 3

Eu selecionaria a faixa C1:D2 (mesma quantidade de linhas e colunas que eu quero saber o dobro dos valores) e na barra de fórmulas eu digitaria = Dobro(A1:B2) e teclaria CTRL+SHIFT + ENTER pois se trata de um cálculo matricial. Isso, então me levaria ao seguinte resultado:
C1 = 4, D1 = 8
C2 = 2, D2 = 6.

Teria como fazer isso?

Desenvolvo pequenas soluções em VBA Excel a valores que variam entre R$ 50,00 a R$ 200,00. Se te interessar, entre no meu instagran (vba_excel_desenvolvimento)

Atenciosamente
Wagner Morel

 
Postado : 12/10/2013 5:46 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Wagner, numa busca rapida encontrei o link abaixo onde temos uma UDF (Matricial) apesar de não ser o tipo de operação que pretende, mas acho que é um inicio, no momento estou com outros afazeres, depois vejo com mais calma, por enquanto veja se ajuda.

Tem até um exemplo para baixar.
Excel UDF : Partial Correlation Matrix
http://www.listendata.com/2013/02/excel ... atrix.html

[]s

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 12/10/2013 7:04 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Wagner, numa busca rapida encontrei o link abaixo onde temos uma UDF (Matricial) apesar de não ser o tipo de operação que pretende, mas acho que é um inicio, no momento estou com outros afazeres, depois vejo com mais calma, por enquanto veja se ajuda.

Tem até um exemplo para baixar.
Excel UDF : Partial Correlation Matrix
http://www.listendata.com/2013/02/excel ... atrix.html

[]s

Editada:
Wagner, dando uma olhada melhor, esta UDF não transforma automaticamente em Matricial, temos de finalizar com CTRL+SHIFT+ENTER da mesma forma, vou continuar pesquisando.

[]s

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 12/10/2013 7:31 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Wagner,
Não endendi direito a demanda/duvida?

Matricial, pelo que sei, tem o objetivo de simplificar um calculo + complexo/longo.
A função, é um adicional no Excel, sendo "disparada" pelo "atalho" --> ctrl+alt+enter
Nem toda matricial "recebe" as chaves "{"; temos na função SOMARPRODUTO um bom exemplo disso
Então a "inclusão" das chaves, mesmo que em uma UDF, disparará essa função do Excel

Quanto ao seu exemplo

Eu selecionaria a faixa C1:D2 (mesma quantidade de linhas e colunas que eu quero saber o dobro dos valores) e na barra de fórmulas eu digitaria = Dobro(A1:B2) e teclaria CTRL+SHIFT + ENTER pois se trata de um cálculo matricial. Isso, então me levaria ao seguinte resultado:
C1 = 4, D1 = 8
C2 = 2, D2 = 6.

Parcialmente (por ser um pouco diferente do que descreveu), a matricial "nativa" do Excel já faz.
Se selecionar a range D1:E2, e na barra de formula escrever A1:B2*2 e finalizar com ctrl+alt+enter; terá como retorno o que descreveu,(veja no anexo)
com um adicional:
Se depois disso tentar alterar sómente uma das celulas receberá a mensagem:

"Voce não pode alterar parte de uma matriz"

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 13/10/2013 6:45 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Reinaldo bom dia, pelo que eu entendi, o Wagner quer criar uma UDF que apos selecionar o Range ela já defina como uma formula Matricial, por exemplo :

Na roptina abaixo, faz ação que ele pretende, a Propriedade FormulaArray faz esta transformação.

Sub FunctionMatricial()
 
    Worksheets("Plan1").Range("C1:C2").FormulaArray = "=(A2:B3)*2"
 
End Sub

Então pelo que entendi seria transformar esta rotina em uma UDF onde selecionariamos a mesma na opção Inserir Função e escolheriámos a Definida Pelo Usuário, e sem ter de teclar CTRL+SHIFT+ENTER para finalizar.

Acredito que é isto, ontem não tive muito tempo para verificar, hoje se der vou ver se consigo algo, acredito que se for possível o porque o Excel não tem este tipo de função nativa.

[]s

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 13/10/2013 6:57 am
Wagner Morel
(@wagner-morel-vidal-nobre)
Posts: 0
Illustrious Member
Topic starter
 

Mauro,

Obrigado. Continuamos procurando. Vou dar uma olhada nesses links que você passou.

Reinaldo,

Obrigado pelas explicações e contribuição. Você tem razão, mas, realmente, é o que o Mauro comentou. Estou tentando aprender como fazer, em VBA, uma função matricial. O fato de querer fazer uma que calcule o dobro dos valores de um Range qualquer foi apenas um exemplo simples que me veio à mente. Pode ser qualquer outro exemplo que receba valores em um Range, faça alguma coisa com esses valores e devolva os resultados para um outro Range. O objetivo é aprender a criar uma função matricial com VBA.

Desenvolvo pequenas soluções em VBA Excel a valores que variam entre R$ 50,00 a R$ 200,00. Se te interessar, entre no meu instagran (vba_excel_desenvolvimento)

Atenciosamente
Wagner Morel

 
Postado : 13/10/2013 6:31 pm
benzadeus
(@benzadeus)
Posts: 78
Trusted Member
 
Function fncUDFMatricial(rng As Range) As Variant
    Dim lngTotalRows As Long
    Dim lngTotalCols As Long
    Dim Temp() As Variant
    Dim lngRow As Long
    Dim lngCol As Long
    Dim var As Variant
        
    With Application.Caller
        lngTotalRows = .Rows.Count
        lngTotalCols = .Columns.Count
    End With
    ReDim Temp(1 To lngTotalRows, 1 To lngTotalCols)
    For lngRow = 1 To lngTotalRows
        For lngCol = 1 To lngTotalCols
            var = rng(lngRow, lngCol)
            On Error Resume Next
            'Operação desejada:
            var = var * 2
            If Err.Number <> 0 Then var = CVErr(xlErrValue)
            On Error GoTo 0
            Temp(lngRow, lngCol) = var
        Next lngCol
     Next lngRow
     fncUDFMatricial = Temp
End Function

Felipe Costa Gualberto
Microsoft Excel MVP
http://www.ambienteoffice.com.br

 
Postado : 13/10/2013 7:19 pm
Wagner Morel
(@wagner-morel-vidal-nobre)
Posts: 0
Illustrious Member
Topic starter
 

benzadeus (Felipe),

Bom Dia!

Cara, sensacional! Perfeito! É exatamente isso! Muito obrigado mesmo. Vou ter umas rotinas por aqui que vou precisar muito utilizar esse tipo de função. Agora vou poder analisar melhor o código e aprender como trabalha.

Obrigado também aos incansáveis amigos Mandrix, Mauro Coutinho e Reinaldo por suas valiosas contribuições.

Desenvolvo pequenas soluções em VBA Excel a valores que variam entre R$ 50,00 a R$ 200,00. Se te interessar, entre no meu instagran (vba_excel_desenvolvimento)

Atenciosamente
Wagner Morel

 
Postado : 14/10/2013 4:31 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Wagner, ontem eu havia visto a function que o Benzadeus postou, mas continuei achando que não era bem isto que queria, eu estava pesquisando por uma Function UDF onde não necessitaríamos teclar CTRL+SHIFT+ENTER para finalizar e termos a condição de Matricial .
Ainda bem que a rotina dele ajudou, mas ainda vou continuar pesquisando uma forma de se fazer como eu disse.

[]s

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 14/10/2013 10:12 am
Wagner Morel
(@wagner-morel-vidal-nobre)
Posts: 0
Illustrious Member
Topic starter
 

É verdade, Mauro. Seria também muito interessante dessa forma (sem necessitar digitar CTRL+SHIFT+ENTER).

Desenvolvo pequenas soluções em VBA Excel a valores que variam entre R$ 50,00 a R$ 200,00. Se te interessar, entre no meu instagran (vba_excel_desenvolvimento)

Atenciosamente
Wagner Morel

 
Postado : 14/10/2013 11:47 am