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.
#37447
Pessoal. Boa noite!

Atualmente tenho 2 códigos idênticos que transferem dados de 2 tabelas (ListObjects tbCompra ; ListObjects tbVenda) para uma terceira tabela (ListObjects tbTotal), onde as informações são consolidadas.

Entretanto, os dados que alimentam as tabelas tbCompra e tbVenda estão em uma planilha (plan2 Carteira) na mesma pasta de trabalho.

Gostaria de contar a ajuda dos amigos para ajustar um dos códigos de forma que a tabela (tbTotal) receba os dados diretamente da planilha (plan2 Carteira) sem a necessidade de passar pelas tabelas tbCompra e tbVenda. Com isso, posso eliminar as 2 tabelas citadas, melhorar o desempenho do arquivo e simplificar a rotina de manipulação dos dados.
Importante destacar que os dados somente são migrados para a tbTotal quando as 5 colunas (A, B, C, D, E) de cada tabela tbCompra e tbVenda são preenchidas. Por exemplo, se as 5 colunas da tbCompra forem preenchidas e as da tbVenda não, então somente os dados da tbCompra é que migrarão.
As informações contidas no último parágrafo são apenas para conhecimento, pois o código atual já contempla esta regra.
Lembrando que na planilha (plan2 Carteira) os dados mudam de colunas e como não se trata de uma tabela, não sei o que substitui o ListObjects no atual código.
Estou enviando a planilha contendo os códigos para facilitar o entendimento.

Desde já agradeço a ajuda e permaneço à disposição para esclarecimentos adicionais.

Att

Luís
Você não está autorizado a ver ou baixar esse anexo.
#37608
Olá, Luis.

Se entendi corretamente, você quer inserir os dados na planilha Carteira e aí replicar os dados na planilha Total.

Há alguma conveniência/necessidade para não inserir os dados diretamente na planilha Total ?
#37611
Boa noite Osvaldo!
Primeiramente, obrigado pela atenção!
Sim, uma enorme conveniência, pois se tiver que digitar os dados na planilha total, terei um enorme retrabalho em face à grande base de dados que cresceu exponencialmente nos últimos meses. O arquivo que enviei contém apenas uma amostra de dados para exemplificar a rotina.
Além disso, o código desenvolvido na planilha total faz cálculos de preço médio que leva em consideração algumas variáveis/regras antes do cálculo, as quais são gerenciadas pela planilha carteira. Neste sentido, qualquer imput manual inserido erroneamente na planilha total, poderá gerar distorções de preço e consequentemente prejuízos ao negócio.
Há algum tempo iniciamos o projeto com apenas 3 tabelas (compra, venda e total). Naquela oportunidade, o nosso colega aqui do fórum, se não me falha a memória, o nome dele é babdallas, criou o código que está no anexo que enviei na 1ª msg, que executa perfeitamente o que necessito, porém o código atual considera especificamente a transferência de dados entre tabelas e também a transferência dos dados que estão dispostos em colunas sequenciais (a,b,c,d,e,f....).
Como o projeto cresceu e houve a necessidade de inserção de novas colunas,então criamos uma planilha (carteira) e atualmente os dados que necessitam ser transferidos para a tabela total já não estão mais dispostos em colunas sequenciais. Além disso, surgiu a necessidade da transferência de dados não ser mais entre tabelas, mas entre uma planilha comum (carteira) e uma tabela (total).
Meu conhecimento em vba é praticamente zero, por isso desde já peço relevar minha ignorância, mas imaginei um pequeno ajuste no código, substituindo o ListObjects por algum outro critério que referencia uma planilha contendo dados em colunas alternadas.
Enfim, resumidamente é isso.....
Me faça saber se existe algo mais que necessito informá-lo.
Mais uma vez reitero meu agradecimento por sua atenção.
Att
Luís
#37614
Olá, Luís.
Entendi.
Como me parece que está difícil de você obter ajuda, eu me proponho a elaborar um novo código para replicar os dados da planilha Carteira na planilha Total. Eu acho menos trabalhoso e mais confiável escrever códigos novos do que fazer adaptações em códigos existentes.
No entanto não vou considerar outras operações tais como os cálculos que você comentou ou ordenação/classificação de dados na planilha Total.
Assim, você poderá resolver essa pendência inicial de replicar os dados. Depois, se precisar de um novo código para implementar mais operações, ou você desenvolve aí ou abre um novo tópico aqui no fórum.
Retorne se houver interesse.
#37654
Olá, Luís.
Veja se ajuda.

1. instale os dois códigos abaixo em dois módulos comuns. No editor de VBA menu Inserir / Módulo, cole o primeiro código, insira mais um módulo e cole o segundo código.
2. preencha os dados na planilha Carteira, qualquer quantidade de linhas, e rode o primeiro código. Serão replicados os dados nas colunas F:J.
4. em seguida rode o segundo código.
5. se o resultado for satisfatório você poderá remover o apóstrofo inicial da linha 'OrdenaTabela do primeiro código, assim o segundo também será executado ao executar o primeiro.
Código: Selecionar todos
'replica os dados da planilha Carteira na Tabela da planilha Total_Compra_Venda
Sub ReplicaDados()
 Dim emp As Range, rng(), LR As Long
  For Each emp In Range("F12:F" & Cells(Rows.Count, 6).End(3).Row)
   With Sheets("Total_Compra_Venda").Range("tbTotal")
    If Application.CountA(.Columns(5)) = 0 Then
     LR = 0
    Else: LR = .Columns(5).Find(what:="*", SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row - 2
    End If
    rng = Array(emp, emp.Offset(, 15), emp.Offset(, 14), emp.Offset(, 16), emp.Offset(, 23))
     .Cells(LR + 1, 5).Resize(, 5) = rng
    rng = Array(emp, emp.Offset(, 15), emp.Offset(, 26), -emp.Offset(, 27), emp.Offset(, 36))
     .Cells(LR + 2, 5).Resize(, 5) = rng
   End With
  Next emp
 'OrdenaTabela
End Sub
Código: Selecionar todos
'ordena a Tabela tbTotal por EMPRESA, FORNECEDOR, DATA
Sub OrdenaTabela()
 With Sheets("Total_Compra_Venda").ListObjects("tbTotal") '.Sort
  .Sort.SortFields.Clear
  .Range.Sort key1:=.ListColumns("EMPRESA").DataBodyRange.Cells(1), Order1:=xlAscending, DataOption1:=xlSortNormal, _
    Key2:=.ListColumns("FORNECEDOR").DataBodyRange.Cells(1), Order2:=xlAscending, DataOption2:=xlSortNormal, _
     Key3:=.ListColumns("DATA").DataBodyRange.Cells(1), Order2:=xlAscending, DataOption2:=xlSortNormal, _
      SortMethod:=xlPinYin, MatchCase:=False, Header:=xlYes
 End With
End Sub
#37657
Boa noite Osvaldo!
Agradeço o envio do novo código!
Quando criei o tópico, comentei que tenho 2 tabelas independentes (tbCompra e tbVenda), ou seja, assim que todas as 5 colunas de ambas as tabelas são preenchidas, os dados são carregados para a tabelatotal, porém se apenas as 5 colunas da tabela de compra estiverem preenchidas, então apenas os dados de compras são carregados para a tabela total.
Isto posto, após realização de testes no seu código, segue algumas necessidades de ajustes para refletir o descrito acima:
1 - Assim que os dados de compra (colunas F, T, U,V,AC) forem preenchidos na plan Carteira, o código deverá levar apenas essa informação para a tabela total. Atualmente o seu código está preenchendo 1 linha com os dados de compra na tabelatotal e logo abaixo 1 linha com os dados de venda zerados (colunas F,U,AF,AG, AP) já que nem sempre haverá dados de venda no momento de digitação dos dados de compra.
2 - Fiz o teste no módulo, conforme seu orientação, porém necessito que o código fique na planilha Carteira e seja acionado através do evento change, a fim de transferir os dados imediatamente após o preenchimento de todas as respectivas colunas.
As 5 colunas dos dados de compra são: F, T, U,V,AC. Preciso que os dados migrem para a tabelatotal somente após o preenchimento obrigatoriamente de TODAS as 5 colunas.
As 6 colunas dos dados de venda são: F,U,AF,AG,AH,AP. Preciso que os dados migrem para a tabelatotal somente após o preenchimento obrigatoriamente de TODAS as 6 colunas.
Com relação ao módulo de ordenação, aparentemente está ok, mas vou teste-lo novamente após os ajustes solicitados.
Se tiver alguma dúvida, permaneço a disposição.
E.T. a tabela de vendas são 6 colunas e não 5 como havia mencionado nas msgs anteriores. Esqueci de mencionar a coluna AH
#37727
osvaldomp escreveu: No entanto não vou considerar outras operações tais como os cálculos que você comentou ou ordenação/classificação de dados na planilha Total.
Isso inclui não verificar células de preenchimento obrigatório e tampouco o disparo do código de forma automática (WorkSheet_Change).
Luisp escreveu: ... assim que todas as 5 colunas de ambas as tabelas são preenchidas, os dados são carregados para a tabelatotal, porém se apenas as 5 colunas da tabela de compra estiverem preenchidas, então apenas os dados de compras são carregados para a tabela total.
Veja o comentário acima em azul.

Atualmente o seu código está preenchendo 1 linha com os dados de compra na tabelatotal e logo abaixo 1 linha com os dados de venda zerados (colunas F,U,AF,AG, AP) já que nem sempre haverá dados de venda ...
Eu tomei por base a planilha Carteira e nela todos os registros de Venda estão preenchidos. ;)
Para contornar, altere o código conforme abaixo.
substitua estas linhas
Código: Selecionar todos
rng = Array(emp, emp.Offset(, 15), emp.Offset(, 26), -emp.Offset(, 27), emp.Offset(, 36))
     .Cells(LR + 2, 5).Resize(, 5) = rng
por estas
Código: Selecionar todos
 If emp.Offset(, 26).Value <> "" Then
     rng = Array(emp, emp.Offset(, 15), emp.Offset(, 26), -emp.Offset(, 27), emp.Offset(, 36))
     .Cells(LR + 2, 5).Resize(, 5) = rng
 End If
#37736
Prezado Osvaldo. Bom dia!
Mesmo sem receber a solução plena para o meu tópico, agradeço pelo tempo que você dedicou para tentar me ajudar!
Sua solução atendeu parcialmente o que preciso, mas não resolveu o meu problema. "É como dar um dar um carrinho de controle remoto ao seu filho, mas sem o controle remoto. Ele até brinca, mas não consegue extrair o máximo do brinquedo".
Como você mesmo disse: "Você acha menos trabalhoso e mais confiável escrever códigos novos do que fazer adaptações em códigos existentes".
Mas a sua solução para mim é exatamente o contrário do que você pensa para você, ou seja, se eu quiser ter a plenitude do que pedi neste tópico, terei que abrir um novo tópico e contar com a boa vontade de outro colega para adaptar o seu código à realidade que necessito.
Com todo respeito, vou manter o tópico aberto para tentar encontrar a solução que preciso, mais reitero minha sincera minha gratidão por sua parcial ajuda.
Bom domingo.
Att
Luís
#37737
Respondido via MP.
#37739
No topo da página clique em Fórum / Membros / clique sobre o nick do usuário / clique no ícone "envelope"
#37740
Eu respondi a sua MP e inclusive também enviei uma MP para o colega que me ajudou a criar o código que postei neste tópico, mas percebi que as msg fiaram paradas na caixa de saída e não sei o motivo das msg não saírem da caixa de saída.
Caso não consiga enviar uma MP ao colega babdallas, não me resta alternativa a não ser continuar pedindo ajuda por aqui.
#37741
Osvaldo, como não tive o seu retorno sobre a MP, penso que talvez não consegui encaminha-la conforme dito na msg anterior. Sendo assim, vou continuar postando meus pedidos por aqui, visando obter ajuda dos colegas do forúm.
#37742
Pessoal. Bom dia!

Será que alguém pode me ajudar a finalizar este tópico, complementando a solução sugerida pelo colega Osvaldo no que tange:

1º - Ajustar o código criado pelo colega Osvaldo para inserir na tabelatotal apenas os novos dados digitados na planilha Carteira, pois atualmente cada vez que o código roda ele inseri na tabelatotal todos os dados digitados na planilha Carteira, gerando duplicidade de dados na tabelatotal;

2º - Após solução do item 1º, ajustar o código para ele rodar automaticamente através do evento change dentro da planilha Carteira, obedecendo o seguinte critério:
2.1 - Dados de compra são: Preciso que os dados migrem da planilha Carteira para a tabela (tabelatotal) que está dentro da planilha Total_Compra_Venda somente após o preenchimento de TODAS as 5 colunas (F,T,U,V,AC);
2.2 - Dados de venda: Preciso que os dados migrem da planilha Carteira para a tabela (tabelatotal) que está dentro da planilha Total_Compra_Venda somente após o preenchimento de TODAS as 6 colunas (F,U,AF,AG,AH,AP);

Agradeço a ajuda.
Obrigado.
Att
Luís
#38137
Veja se ajuda.
Você não está autorizado a ver ou baixar esse anexo.
#38157
Babdallas, boa noite!

Amigo o código ficou muito bom. Parabéns pelo excelente trabalho e sincera gratidão pela ajuda prestada!!
Só gostaria de lhe pedir mais um favor:
Quando enviei a planilha, acabei invertendo os nomes das colunas T (Fornecedor) e U (Data Compra). O correto é T (Data Compra) e U (Fornecedor).
Somente agora após testar o seu código e copia-lo para a planilha original que percebi a inversão. Até tentei alterar a sequencia das letras que representam as colunas dentro do seu código, mas não adiantou.
Se for possível realizar essa alteração, agradeço mais esta ajuda. Caso contrário, eu adapto a minha planilha ao seu código.
Muito obrigado,
Luís
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