Este fórum está sendo desativado

Depois de 9 anos, este fórum será desativado. Mas calma.... estamos migrando para uma comunidade no DISCORD. Junte-se a nós.

ENTRAR PARA DISCORD

Tópicos relacionados a códigos VBA, gravação de macros, etc.
#74083
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
Você não está autorizado a ver ou baixar esse anexo.
Editado pela última vez por PedroBB em 18 Mar 2024 às 17:06, em um total de 2 vezes.
#74084
É 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
#74086
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?
#74087
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.
#74089
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!!!!!!!!!!!!
#74091
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
Você não está autorizado a ver ou baixar esse anexo.
#74094
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
long long title how many chars? lets see 123 ok more? yes 60

We have created lots of YouTube videos just so you can achieve [...]

Another post test yes yes yes or no, maybe ni? :-/

The best flat phpBB theme around. Period. Fine craftmanship and [...]

Do you need a super MOD? Well here it is. chew on this

All you need is right here. Content tag, SEO, listing, Pizza and spaghetti [...]

Lasagna on me this time ok? I got plenty of cash

this should be fantastic. but what about links,images, bbcodes etc etc? [...]

Estamos migrando para uma comunidade no Discord