Notifications
Clear all

CADASTRO ITENS DEMORADO

14 Posts
4 Usuários
0 Reactions
3,485 Visualizações
(@gabrielluz)
Posts: 12
Active Member
Topic starter
 

Pessoal muito boa tarde! Me chamo Gabriel.. preciso otimizar um código, que está demorando + de 50 segundos para dar insert em 12 linhas preenchidas em um formulário que criei (sequencialmente) pelo VBA...
Vou falar a forma que eu fiz isso.. tentando explicar detalhadamente e o mais simples possivel... (eu sei que está muitoo mal otimizado)

Aqui eu identifico a ultima linha vazia da aba, para dar os inserts lá:
'ultimaLinha = Sheets("VENDAS").Range("A1048576").End(xlUp).Row + 1

E aqui os inserts dos campos do meu formulario:

'

Cells(ultimaLinha, 1) = CDate(dataf.Value)
'Cells(ultimaLinha, 3) = CBESCOLHA.Text
'Cells(ultimaLinha, 2) = npedido.Value
'Cells(ultimaLinha, 4) = txt_codigo.Value
'Cells(ultimaLinha, 5) = txt_cliente.Text
'Cells(ultimaLinha, 6) = txtTransporte.Text
'Cells(ultimaLinha, 7) = outras.Text
'-----------
'Cells(ultimaLinha, 8) = T1.Text
'Cells(ultimaLinha, 9) = M1.Text
'Cells(ultimaLinha, 10) = q1.Value
'Cells(ultimaLinha, 11) = p1.Value
'Cells(ultimaLinha, 12) = r1.Text
'Cells(ultimaLinha, 13) = d1.Text
'Cells(ultimaLinha, 14) = obs.Text

Estes T1, M1, Q1.. etc... são os campos que vao de 1 a 12, e estão sendo inseridos na primeira linha vazia da aba, igual mencionei (entao tem o campo T2, M2, Q2..., T3, M3, Q3... até o 12)
O problema é que além de eu não saber fazer o looP para cadastrar isso 12x, em 12 linhas (podem ser até 12 linhas, se ele preencher até o 6, é para cadastrar 6 linhas..) (então no caso eu fiz todo esse código denovo 12 vezes, para cadastrar 12 vezes haha)

Está demorando + de 50 segundos para realizar o cadastro todo....
O problema é que, mesmo com o loop, creio que vai demorar + de 50 segundos de TODO o jeito, pois o loop ajuda a economizar código, mas a linha é a mesma, certo ?
existe algum método, para caso ele tenha preenchido todas as 12 linhas do meu formulario, cadastre todas rapidamente e sequencialmente uma embaixo da outra? (SALVARIA MINHA VIDA!)

Obs: a aba tem mais de 4000 linhas já preenchidas, notei que se eu apago todas elas, e deixo ela sem linhas, na hora de cadastrar a demora cai pela metade, porém ainda demora! (e tambem nao é viavel, pois voltara a ter 4000 linhas)
Se alguma boa alma estiver inspirada, se puder também me dar a luz de um código, que alem que deixe isso de maneira sequencial e rapida, também copie a formatação da linha anterior (para não ter necessidade de deixar linhas pré-criadas, seria magnificamente magnifico!)

Pessoal, desde ja meu muito obrigado!

 
Postado : 10/10/2019 10:16 am
leandroxtr
(@leandroxtr)
Posts: 447
Reputable Member
 

Olá, companheiro!

Fica realmente bem difícil te ajudar sem ter acesso a planilha, pois é um procedimento específico.
Pelo o que percebi, é algo tranquilo de ser feito via loop, mas eu nao me arriscaria criar uma macro sem entender o processo, e ter que fazer de novo pra consertar.
Se puder compartilhar o arquivo, ou algum modelo idêntico (com dados ilustrativos), terei o prazer em ajuda-lo.

Se te ajudou, não se esqueça de dar um like na resposta e marcar o tópico como finalizado.

Abraços!
Leandro Cordeiro

 
Postado : 10/10/2019 10:59 am
Mauro Coutinho
(@coutinho)
Posts: 95
Estimable Member
 

GabrielLuz, li e reli varias vezes, até acho que entendi, mas não compreendi, está confusa a sua explicão:

Você diz :
Estes T1, M1, Q1.. etc... são os campos que vao de 1 a 12 - mas nas instruções da parte da rotina temos 14 dados lançados na planilha.
mas sesses 'Cells(ultimaLinha, 1) = CDate(dataf.Value) vão de i a 7 e não faz menção deles
entao tem o campo T2, M2, Q2..., T3, M3, Q3... até o 12 - esses não vi nessa parte da rotina
podem ser até 12 linhas, se ele preencher até o 6, é para cadastrar 6 linhas.. - meio confuso, não sei se está se referindo talvez aos campos do formulário em branco

Quanto as 4000 linhas, uma vez que está só capturando a Última Linha vazia: ultimaLinha = Sheets("VENDAS").Range("A1048576").End(xlUp).Row + 1, não é ela que deixa lento, e sim, se, provavelmente você tiver formulas em todas essas linhas e em alguma parte da rotina estiver forçando o excel a recalcular.
Assim, seria bom que colocasse seu modelo reduzido com dados ficticios se for o caso, ou detalhar melhor, lembre-se, você conhece e sabe o que quer, nós vamos por suposições.

[]s
Mauro Coutinho

 
Postado : 10/10/2019 11:06 am
(@gabrielluz)
Posts: 12
Active Member
Topic starter
 

Amigo mil desculpas..
Então, na verdade são 14 Colunas para preencher em 1 linha, e até 12 linhas que podem ser inseridas na planilha.
Os dados que vão de 1 a 7, é da primeira coluna até a 7, são dados que serão repetidos na proxima linha, os dados que serão novos são dai pra frente.
o usuario pode preencher apenas 2 das 12 linhas, ou 3 das 12 linhas, então, deve ser cadastrado referente as linhas que ele preencher no formulario.

e aproveitando, como eu anexo minha planilha aqui no forum? sou novo e não estou conseguindo achar a opção de anexo

 
Postado : 10/10/2019 11:54 am
(@gabrielluz)
Posts: 12
Active Member
Topic starter
 

Vocês vao perceber que eu fiz um rolo danado para cadastrar as linhas, primeiro para identificar quantas linhas foram preenchidas eu criei 12 checkbox haha, e falei pra ele desativar/ativar quando tal linha for preenchida, e fora da sub, la embaixo, criei 12 eventos de checkbox_change, fazendo então checkbox1_change, checkbox2_change, e em cada evento change ele realizava o cadastro da linha....

 
Postado : 10/10/2019 12:05 pm
(@srobles)
Posts: 231
Estimable Member
 

Gabriel,

Veja se as alterações feitas em seu modelo, atendem sua necessidade.

Link:https://www.sendspace.com/file/l0e1ix

Espero ter ajudado.

Abs.

Saulo Robles

 
Postado : 10/10/2019 9:52 pm
(@gabrielluz)
Posts: 12
Active Member
Topic starter
 

srobles PELO AMOR DE DEUS!! ERA EXATAMENTE ISSO E MUIITOOO MELHOR AINDA DO QUE EU ESPERAVA!
MAGOO!! DO EXCEL!!
Seria muitaa ousadia pedir como faz para retirar caso um item tenha sido cadastrar errado na listbox?

Mais uma vez, meu muitoo obrigado!

 
Postado : 11/10/2019 7:18 am
(@srobles)
Posts: 231
Estimable Member
 

Gabriel,

Exiba o código do frmLancarVendas e adicione a linha abaixo logo no começo (acima de todos os outros códigos):

Dim itemSelecionado As Long

No evento Click do ListBox, adicione o que se segue :

    If Me.ListBox1.ListIndex > 0 And Me.ListBox1.Selected(Me.ListBox1.ListIndex) = True Then itemSelecionado = Me.ListBox1.ListIndex

E finalmente, no evento KeyDown do ListBox, adicione:

    If itemSelecionado >= 0 Then
        If KeyCode = vbKeyDelete Then
            If MsgBox("Deseja remover o item selecionado da lista?", vbQuestion + vbYesNo, "Remover item") = vbYes Then
                Me.ListBox1.RemoveItem itemSelecionado
                With Me.lblContagem
                    .Caption = "Total de " & Me.ListBox1.ListCount & " item(ns)"
                End With
                itemSelecionado = -1
            End If
        End If
    Else
        MsgBox "Selecione um dos itens da lista!", vbExclamation, "Erro"
    End If

Para remover um item da lista, basta selecionar um item e teclar Delete.

Espero ter ajudado.

Abs.

Saulo Robles

 
Postado : 11/10/2019 9:24 am
(@gabrielluz)
Posts: 12
Active Member
Topic starter
 

Meu amigo, perfeito! mas teve um problema!
Ele está sempre deletando o primeiro item da lista, independente de qual item eu seleciono, como faço a correção ?

Desde já, muitooo obrigado novamente!!!

 
Postado : 11/10/2019 9:55 am
(@gabrielluz)
Posts: 12
Active Member
Topic starter
 

srobles meu amigo pessima noticia! ficou realmente muito bom o modo com que foi programado, e por incrivel que pareça, na hora que eu coloquei para rodar na planilha original, o tempo gigantesco de demora voltou a acontecer... se não é o código, o que poderia ser??

 
Postado : 11/10/2019 10:42 am
(@gabrielluz)
Posts: 12
Active Member
Topic starter
 

Notei que se eu estiver com a planilha da empresa aberta, junto com a que voce me mandou (que cadastra quase intantaneamente) por conta da planilha da empresa estar aberta junto, a sua tambem, que antes estava bem rapida, fica muito lenta tambem.!!!!

Creio entao que o problema esteja na planilha em si, mas ainda não compreendo o que seja !!

 
Postado : 11/10/2019 11:17 am
(@srobles)
Posts: 231
Estimable Member
 

Gabriel,

Atualizei o modelo. Favor baixar o mesmo no link deixado em meu post anterior.

Quanto á questão da demora no processamento, infelizmente sem ter acesso á pasta completa fica difícil te dar uma solução definitiva, pois temos "n" possibilidades que podem causar o problema, como por exemplo, formatação condicional, campo com fórmulas matriciais, campo com validação de dados....enfim, as causas podem ser muitas.

Favor, veja se a pasta completa possui algumas das implementações que citei acima, e se possível, veja se as mesmas podem ser removidas.

Espero ter ajudado.

Abs.

Saulo Robles

 
Postado : 11/10/2019 11:48 am
(@gabrielluz)
Posts: 12
Active Member
Topic starter
 

srobles, por meio de diversos testes eu notei que ao excluir 8 guias (sem ser a que está com o código) o tempo de processamento dela se torna muito mais eficaz, entao creio que as outras guias estão "pesando" o processamento da de vendas...

mas agora não sei o que fazer, a unica coisa em comum em todas elas são a quantidade excessiva de linhas pré criadas, poderia ser esta uma possibilidade?

//vou baixar o modelo atualizado

//otimo, seu novo modelo funciona perfeitamente a exclusão, já poderei usar da maneira que eu gosto!
Agora só preciso resolver a questão da demora na planilha original :(

 
Postado : 11/10/2019 11:57 am
(@gabrielluz)
Posts: 12
Active Member
Topic starter
 

Meus amigos meu problema foi completamente resolvido, e até melhorado graças ao srobles, que além de me disponibilizar ajuda aqui no Fórum me ajudou com mensagens privadas e foi extremamente atencioso, dando ótimas soluções para os meus problemas, a solução definitiva da demora foi adicionar as linhas:

Ao inicio do código:

Application.Calculation = xlCalculateManual

E ao final do código:

 Application.Calculate
          Application.Calculation = xlAutomatic

Muito obrigado mesmo, a todos que vieram, e especialmente ao srobles o qual me ajudou a solucionar de uma vez!
Darei como problema solucionado, até a próxima senhores!

 
Postado : 11/10/2019 2:20 pm