Página 1 de 1

Copiar Colar Com Outra Sequência [RESOLVIDO]

Enviado: 15 Fev 2024 às 00:43
por PedroBB
Pessoal,
Na planilha anexa, os dados são copiados usando Arrays, porém preciso alterar a sequência das colunas, assim:

Coluna AC (Data): Copiar para a Coluna A
Coluna AB (Produto): Copiar para a Coluna B
Coluna AD (Valor): Copiar para a Coluna C, se a Célula AH1 for 0
Coluna AE (%): Copiar para a Coluna C, se a Célula AH1 for 1
Coluna AA (Id): Não preciso Copiar

Grato,
Pedro

Re: Copiar Colar Arrays Com Outra Sequência

Enviado: 15 Fev 2024 às 09:36
por osvaldomp
É desnecessário trabalhar com dois códigos.

Private Sub CommandButton1_Click()
Dim LR As Long
LR = Cells(Rows.Count, 27).End(3).Row: [A:C] = ""
Range("AC1:AC" & LR).Copy [A1]
Range("AB1:AB" & LR).Copy [B1]
If [AH1] = 1 Then Range("AE1:AE" & LR).Copy [C1]
If [AH1] <> "" And [AH1] = 0 Then Range("AD1:AD" & LR).Copy [C1]
End Sub

Re: Copiar Colar Arrays Com Outra Sequência

Enviado: 15 Fev 2024 às 10:49
por PedroBB
osvaldomp escreveu: 15 Fev 2024 às 09:36 É desnecessário trabalhar com dois códigos.

Private Sub CommandButton1_Click()
Dim LR As Long
LR = Cells(Rows.Count, 27).End(3).Row: [A:C] = ""
Range("AC1:AC" & LR).Copy [A1]
Range("AB1:AB" & LR).Copy [B1]
If [AH1] = 1 Then Range("AE1:AE" & LR).Copy [C1]
If [AH1] <> "" And [AH1] = 0 Then Range("AD1:AD" & LR).Copy [C1]
End Sub
OsvaldoMP,
Muito Obrigado!
Eu estou lendo sobre a velocidade de processamento com Arrays e por isso estou alterando a função de copiar e colar.
Numa tabela com mais de 200.000 linhas, a sua fórmula ficou 5 vezes mais rápido do que com Arrays.
Ficou sensacional!
Pra meu aprendizado, poderia explicar por que é mais rápido do que com Arrays?

Re: Copiar Colar Arrays Com Outra Sequência

Enviado: 15 Fev 2024 às 14:40
por osvaldomp
Olá, @PedroBB.

A velocidade de processamento das coleções como Array, Collection e Dictionary, será bem maior se as operações forem executadas na própria coleção ou entre duas ou mais coleções, pois nesses casos o processo é todo efetuado na memória da máquina, que é rápida, e não existe interação com a planilha, que é lenta.

Da forma que está escrito o seu código, não existe processamento na Array, visto que os valores do intervalo da planilha são carregados nela e em seguida são descarregados dela na planilha. Isso acarreta duas operações de interação com a planilha, a carga e a descarga da Array. Então a Array fica servindo só como um elemento transportador de dados, pois nenhuma operação é efetuada nela.

Considerando de forma simplificada, pode-se dizer que o seu código faz Copiar/Colar duas vezes: copia da planilha e cola na Array e depois copia da Array e cola na planilha, ao passo que o código que eu sugeri faz o Copiar/Colar apenas uma vez para cada coluna, usando a Área de Transferência, e apesar de processar uma coluna por vez, ainda assim executa mais rápido, conforme o seu comentário.

Re: Copiar Colar Arrays Com Outra Sequência

Enviado: 15 Fev 2024 às 17:16
por PedroBB
osvaldomp escreveu: 15 Fev 2024 às 14:40 Olá, @PedroBB.

A velocidade de processamento das coleções como Array, Collection e Dictionary, será bem maior se as operações forem executadas na própria coleção ou entre duas ou mais coleções, pois nesses casos o processo é todo efetuado na memória da máquina, que é rápida, e não existe interação com a planilha, que é lenta.

Da forma que está escrito o seu código, não existe processamento na Array, visto que os valores do intervalo da planilha são carregados nela e em seguida são descarregados dela na planilha. Isso acarreta duas operações de interação com a planilha, a carga e a descarga da Array. Então a Array fica servindo só como um elemento transportador de dados, pois nenhuma operação é efetuada nela.

Considerando de forma simplificada, pode-se dizer que o seu código faz Copiar/Colar duas vezes: copia da planilha e cola na Array e depois copia da Array e cola na planilha, ao passo que o código que eu sugeri faz o Copiar/Colar apenas uma vez para cada coluna, usando a Área de Transferência, e apesar de processar uma coluna por vez, ainda assim executa mais rápido, conforme o seu comentário.
Show de Bola.
Valeu!!!!!!!!!!!!

Re: Copiar Colar Arrays Com Outra Sequência [RESOLVIDO]

Enviado: 16 Fev 2024 às 09:24
por PedroBB
Apareceu uma nova demanda:
Preciso concatenar as colunas AC, AB e AA e colar na Coluna C.
Tentei assim, mas dá erro tipos incompatíveis, erro 13.
.Range(("AC5:AC" & UltimaLinha) & "-" & .Range("AB5:AB" & UltimaLinha) & "-" & .Range("AA5:AA" & UltimaLinha).Copy .[C5]

É possível concatenar?

Grato,
Pedro

Re: Copiar Colar Arrays Com Outra Sequência [RESOLVIDO]

Enviado: 16 Fev 2024 às 16:01
por osvaldomp
Seguem 3 opções que retornam resultados iguais.
_____________________________________________________________________________________________________
Sub ConCatEval() 'insere direto os resultados na coluna A via Evaluate, mas em seguida é preciso formatar as datas
Dim r As Range
Application.ScreenUpdating = False
If [A2] <> "" Then Range("A2:C" & Cells(Rows.Count, 1).End(3).Row).Value = ""
With Range("A2:A" & Cells(Rows.Count, 27).End(3).Row)
.Value = Evaluate(.Offset(, 28).Address & "& "" - "" & " & .Offset(, 27).Address & "& "" - "" & " & .Offset(, 26).Address)
End With
For Each r In Range("A2:A" & Cells(Rows.Count, 27).End(3).Row)
r.Value = Format(Left(r.Value, 5), "dd/mm/yyyy") & Right(r.Value, Len(r.Value) - 5)
Next r
Range("AD2:AE" & Cells(Rows.Count, 27).End(3).Row).Copy [B2]
End Sub
_____________________________________________________________________________________________________
Sub ConCatForm() 'insere fórmulas na coluna A e em seguida substitui pelos respectivos valores
Application.ScreenUpdating = False
If [A2] <> "" Then Range("A2:C" & Cells(Rows.Count, 1).End(3).Row).Value = ""
With Range("A2:A" & Cells(Rows.Count, 27).End(3).Row)
.Formula = "=TEXT(AC2,""dd/mm/aaaa"")&"" - ""&AB2&"" - ""&AA2"
.Value = .Value
End With
Range("AD2:AE" & Cells(Rows.Count, 27).End(3).Row).Copy [B2]
End Sub
_____________________________________________________________________________________________________
Sub ConCatLoop() 'Loop na coluna A para inserir os resultados
Dim LR As Long, k As Long
Application.ScreenUpdating = False
If [A2] <> "" Then Range("A2:C" & Cells(Rows.Count, 1).End(3).Row).Value = ""
LR = Cells(Rows.Count, 27).End(3).Row
For k = 2 To LR
Cells(k, 1) = Format(Cells(k, 29).Value, "mm/dd/yyyy") & " - " & Cells(k, 28) & " - " & Cells(k, 27)
Next k
Range("AD2:AE" & Cells(Rows.Count, 27).End(3).Row).Copy [B2]
End Sub
_____________________________________________________________________________________________________

dica - para responder clique em +Resposta, localizada abaixo da última postagem; só clique em Responder com Citação se necessário

Re: Copiar Colar Arrays Com Outra Sequência [RESOLVIDO]

Enviado: 18 Mar 2024 às 17:04
por PedroBB
Valeu.
Muito Obrigado!!!!!!!!