Notifications
Clear all

Concatenar matrizes

10 Posts
3 Usuários
1 Reactions
2,664 Visualizações
(@leonardo)
Posts: 81
Trusted Member
Topic starter
 

Olá amigos, estou com um dilema,...

Como faço para concatenar os dados entre duas matrizes em uma nova matriz?

Segue uma imagem do que estou precisando. 

 
Postado : 09/09/2020 7:24 pm
(@herikalwp)
Posts: 10
Active Member
 

@leonardo, não entendo porque isso precisa ser por VBA. Não é muito mais simples usar a função concatenar no Excel?

Se for por VBA não tem como fazer sem utilizar um loop (For To, por exemplo -> range1 da matriz3 =valor da range1 da matriz 1 & valor da range1 da matriz2). Não dá para igualar um intervalo múltiplo a outro intervalo múltiplo, isso precisa ser feito um elemento por vez.

No seu exemplo o código ficaria assim:

Dim linha As Long

linha = 2

For linha = 2 To 4

Cells(linha, 4).Value = Cells(linha, 1).Value & Cells(linha, 2).Value

Next

 

Caso tenha resolvido não esqueça de sinalizar.


Editado pela Moderação. Motivos: 1)Procure utilizar o botão Código (< >) sempre que for inserir código VBA ou Fórmulas. 2) Ao responder, não clique insistentemente no botão pra enviar a resposta: aguarde alguns instantes até que sua mensagem esteja disponível na página (excluídos 12 respostas repetidas!)

 
Postado : 10/09/2020 1:18 pm
(@leonardo)
Posts: 81
Trusted Member
Topic starter
 

@herikalwp

Eu gostaria de utilizar matrizes (arrays) porque minha base de dados é grande. Por matrizes eu consigo uma performance bem melhor. De qualquer formar, agradeço a ajuda amigão!

 
Postado : 10/09/2020 1:33 pm
(@herikalwp)
Posts: 10
Active Member
 

@leonardo, não entendo porque pretende fazer isso via VBA, pois o Excel trás a função nativa que parece resolver de forma simples.

Primeiro tenha em conta que intervalos múltiplos não podem ser simplesmente igualados ou somados, é necessário percorrer um elemento por vez, o que deve ser feito através de um loop.

Segue uma sugestão:

Dim linha As Long

linha = 2

For linha = 2 To 4

Cells(linha, 4).Value = Cells(linha, 1).Value & Cells(linha, 2).Value

Next

Se resolveu, não esqueça de sinalizar.


Editado pela Moderação. Motivo: Procure utilizar o botão Código (< >) sempre que for inserir código VBA ou Fórmulas.

 
Postado : 10/09/2020 1:45 pm
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

Nota da moderação:

@herikalwp

Talvez não tenha percebido a nota de edição no rodapé de sua primeira resposta e a eliminação das 12 mensagens repetidas e talvez por esse mesmo motivo inadvertidamente tenha incorrido na mesma prática por mais 3 vezes. Então segue agora como postagem normal, uma vez que estamos temporariamente sem MP:

1) Procure utilizar o botão Código (< >) sempre que for inserir código VBA ou Fórmulas (Cole o código no editor, depois selecione e clique no botão). 

2) Ao responder, não clique insistentemente no botão pra enviar a resposta: aguarde alguns instantes até que sua mensagem esteja disponível na página. Como o fórum foi recém migrado, ainda não está em sua versão definitiva e o problema da lentidão, pelo menos a maior parte, é do lado de cá e não de sua internet que esteja lenta.

@EdsonBR

 
Postado : 10/09/2020 2:36 pm
(@herikalwp)
Posts: 10
Active Member
 

@EdsonBR

Valeu pela dica do Código.

Quanto às repetições, na verdade estava dando erro na página toda vez que clicava em enviar resposta, achei que não tinha ido.

 
Postado : 10/09/2020 5:26 pm
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

Sem problemas, @herikalwp, não esquente a cabeça. Isso está acontecendo com bastante frequência agora, consequência da lentidão.

 
Postado : 10/09/2020 5:46 pm
(@herikalwp)
Posts: 10
Active Member
 

@leonardo não dá para trabalhar com array desta forma (usar a função para concatenar tudo de uma vez). Você precisará percorrer cada elemento do array. No caso, se os dados estão em planilhas criar arrays para carregar essas informações só vai sobrecarregar a memória (e conseguir o contrário do que você quer, que é performance).

Percorrer as células parece mais vantajoso. Mas caso você tenha os dados em outra fonte, aí os arrays podem resolver. Neste caso a solução é construir um loop para percorrer os elementos um a um.

Já tive um problema semelhante envolvendo matrizes e o que descobri é que não tem como fazer a operação na matriz como um todo, tem que ser um elemento da matriz por vez.

Enfim, tem coisas que ainda poderiam ser simplificadas pela Microsoft e não foram...

 
Postado : 10/09/2020 5:52 pm
leonardo reacted
(@leonardo)
Posts: 81
Trusted Member
Topic starter
 
Postado por: @herikalwp

@leonardo não dá para trabalhar com array desta forma (usar a função para concatenar tudo de uma vez). Você precisará percorrer cada elemento do array. No caso, se os dados estão em planilhas criar arrays para carregar essas informações só vai sobrecarregar a memória (e conseguir o contrário do que você quer, que é performance).

Percorrer as células parece mais vantajoso. Mas caso você tenha os dados em outra fonte, aí os arrays podem resolver. Neste caso a solução é construir um loop para percorrer os elementos um a um.

Já tive um problema semelhante envolvendo matrizes e o que descobri é que não tem como fazer a operação na matriz como um todo, tem que ser um elemento da matriz por vez.

Enfim, tem coisas que ainda poderiam ser simplificadas pela Microsoft e não foram...

Show, obrigado!

 
Postado : 10/09/2020 10:06 pm
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 
Postado por: @herikalwp

Se for por VBA não tem como fazer sem utilizar um loop...

... Não dá para igualar um intervalo múltiplo a outro intervalo múltiplo, isso precisa ser feito um elemento por vez.

...é necessário percorrer um elemento por vez, o que deve ser feito através de um loop....

...não dá para trabalhar com array desta forma (usar a função para concatenar tudo de uma vez). Você precisará percorrer cada elemento do array...

Não necessariamente tenha que ser por loop, @herikalwp

Há alguns truques para retornar e/ou atribuir uma matriz ou intervalo diretamente em uma só operação, sem necessidade de loops. Por exemplo, no caso do @leonardo, a expressão seguinte faz exatamente o que ele deseja, em uma só instrução, e sem loop. Agora, se a performance é a mesma, já não saberia dizer.

Sub Concatenar_Matrizes2()
  [D2:D4] = [Concatenate(A2:A4,B2:B4)]
End Sub
 

 
Postado : 10/09/2020 10:42 pm