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.
  • Avatar do usuário
  • Avatar do usuário
#1774
Pessoal,

Mais um help aqui dos gênios.

Em uma linha de separação de peças onde o operador separada através de uma ficha chamada "boleta", montei um Form para incluir dados para controle de produtividade. Como por padrão a cada operador é lançado no controle 10 boletas por vez. Hoje eu fiz um form direto na planilha, esta funcionando bem, mas com o tempo vai pesando, agora optei por fazer em UserForm no ambiente VBA. O que acontece.

A sequencia de lançamento é para cada txt_cbu que vai do 1 até o 10 no frame CBUs os dados seriam para o mesmo operador, lançado no cabeçalho inicial. O que acontece, em muitas das vezes um operador não chega a pegar 10 boletas em uma vez, o que ficaria várias textbox do frame CBUs vazio mas com o nome do operador inserido no cabeçalho inicial.

Não sei se fiz a sequencia certa do codigo, mas ficou muito lento para processar.

Não sei se fui claro o suficiente, mas qualquer coisa vou postando as duvidas.

Conto com a ajuda dos Srs.
Você não está autorizado a ver ou baixar esse anexo.
#1815
Berti,

Dei uma analisada na sua planilha. Tem várias coisas que podem ser melhoradas nela. Eu revisei o código do botão Lançar. Acredito que com as mudanças já da pra você ter uma ideia melhor de como trabalhar com os dados e depois implementar as melhorias nas demais macros.
Código: Selecionar todos
Private Sub cmd_lancar_Click()

'Para você inserir os dados numa planilha via form não é necessário ativá-la
'ThisWorkbook.Worksheets("Entrega de Boletas").Activate
'Range("A2").Select

'Dim pegahora

'Essa abordagem com o tempo vai deixar lento o seu programa
'pois vai sempre percorrer toda a planilha até chegar na última planilha
'O ideal é você identificar quantas linhas estão preenchidas
''Do
''If Not IsEmpty(ActiveCell) Then
''    ActiveCell.Offset(1, 0).Select
''End If

''Subtituí o seu código pelo código abaixo

'Vamos declarar variáveis para facilitar o nosso trabalho
Dim sCodSeparador As String 'Declarei como string pois não tenho certeza se o código sempre será numérico
Dim sSeparador As String
Dim sEmpresa As String
Dim lQtde As Long
Dim dData As Date
Dim sStatus As String
Dim sGrupo As String
Dim i As Long 'variável para identificar quantas linhas estão preenchidas

'É importante validar os dados antes de inserí-los na planilha
'Vamos verificar se os dados foram digitados corretamente
'Esta validação abaixo é apenas um ponto de partida

If txt_codseparador = Empty Then MsgBox "Ops! Você não informou o Código Separador", vbExclamation: txt_codseparador.SetFocus: Exit Sub
If Not opt_diaatual And Not opt_diaseguinte Then MsgBox "Ops! Informe o dia corretamente", vbExclamation: Exit Sub
If opt_diaseguinte And Not IsDate(txt_dataseguinte) Then MsgBox "Ops! Data no formato inválido", vbExclamation: txt_dataseguinte.SetFocus: Exit Sub

'Agora que sabemos que os dados estão cadastrados corretamente, vamos colocá-los nas variáveis
'Esses são os dados do cabeçalho, padrão para todos os CBU's
sCodSeparador = txt_codseparador
sSeparador = txt_separador
sEmpresa = txt_empresa
sGrupo = txt_grupo

If opt_diaatual.Value Then dData = Date Else dData = CDate(txt_dataseguinte)

'Declarando os objetos que irão receber os dados do CBU
Dim txtCBU As MSForms.TextBox
Dim txtQtdeR As MSForms.TextBox
Dim txtQtde As MSForms.TextBox
Dim txtObs As MSForms.TextBox

'Desabilita os cálculos da planilha (A planilha está muito pesada com muitas fórmulas)
Application.Calculation = xlManual

'Agora vamos fazer um loop para percorrer os CBU's
For k = 1 To 10
    'Criando os objetos do CBU
    Set txtCBU = Me.Controls("txt_cbu" & k)
    Set txtQtdeR = Me.Controls("txt_qtdresultado" & k)
    Set txtQtde = Me.Controls("txt_qtd" & k)
    Set txtObs = Me.Controls("txt_obs" & k)
    
    'vamos verificar se existe algo preenchido no CBU
    'se existir, vamos lançar os dados na planilha
    
    If txtCBU <> "" Then
        'Vamos verificar quantas linhas estão preenchidas na planilha e acrescentar 1 (prox linha)
        'Obs.: Plan9 é a planilha Entrega de Boletas (Verificar o nome do objeto)
        'i será o número da próxima linha a ser preenchida na planilha
        i = WorksheetFunction.CountA(Plan9.Columns(1)) + 1
        
        'vamos preencher os dados
        Plan9.Cells(i, 1) = sCodSeparador
        Plan9.Cells(i, 2) = sSeparador
        Plan9.Cells(i, 3) = sEmpresa
        Plan9.Cells(i, 4) = txtCBU
        Plan9.Cells(i, 5) = IIf(txtQtde = Empty, txtQtdeR, txtQtde)
        Plan9.Cells(i, 6) = dData
        Plan9.Cells(i, 7) = "Em Separação" 'Já verifiquei se o CBU está vazio no if anterior
        Plan9.Cells(i, 8) = Time
        Plan9.Cells(i, 9) = txtObs
        Plan9.Cells(i, 10) = sGrupo
    
    End If
    
Next k
'Habilita os cálculos novamente
Application.Calculation = xlAutomatic

'Fecha o Formulário
Unload Me

End Sub
O arquivo está em anexo também.
Você não está autorizado a ver ou baixar esse anexo.
#1968
Espetacular Laennder, roda liso!
Não sei como eu estava complicando demais algo que era simples na sua ótica!

Tem duas partes que não eu não captei direito, se puder dar uma explicada básica:
Código: Selecionar todos
'Declarando os objetos que irão receber os dados do CBU
Dim txtCBU As MSForms.TextBox
Dim txtQtdeR As MSForms.TextBox
Dim txtQtde As MSForms.TextBox
Dim txtObs As MSForms.TextBox
e
Código: Selecionar todos
'Agora vamos fazer um loop para percorrer os CBU's
For k = 1 To 10
    'Criando os objetos do CBU
    Set txtCBU = Me.Controls("txt_cbu" & k)
    Set txtQtdeR = Me.Controls("txt_qtdresultado" & k)
    Set txtQtde = Me.Controls("txt_qtd" & k)
    Set txtObs = Me.Controls("txt_obs" & k)
No demais está show!

Uma pergunta: Você deve ter percebido que tenho várias Function Vlookup que me busca resultados das CBUs, você acha que do jeito que está dá para manter e não terei problemas futuros? Ou da pra otimizar esses códigos.

Obrigado mais uma vez. :)
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