Notifications
Clear all

Variável publica + userform e otimização de código.

5 Posts
2 Usuários
0 Reactions
1,325 Visualizações
(@finaljustice)
Posts: 91
Estimable Member
Topic starter
 

Olá,

Tenho uma dúvida sobre userforms, estou montando uma userform e quero carregar uma variável que salvei na userform e ter essa variável em um módulo.
Para melhor compreensão, é um combobox com nomes de clientes já carregados. Ao selecionar o nome do cliente este código deveria descer o banco de dados e procurar qual linha este nome se encontra.

Private Sub ComboBox1_Change() 'selecionar nome do cliente
Application.ScreenUpdating = False
Sheets("BDCadastro").Range("B3").Select

Do While ActiveCell <> Empty
    If ActiveCell = ComboBox1 Then
        celladd = ActiveCell.Offset(0, -1).Address
        cellrow = ActiveCell.Row
        
    End If
    
    ActiveCell.Offset(1, 0).Select
        
Loop
Application.ScreenUpdating = True
End Sub

Achando a posição, quero então chamar um módulo que utilizará as variáveis celladd e cell row. Percebi que depois que é rodada esta parte do código as variáveis celladd e cellrow perdem seu valor, logo não consigo usa-lá no módulo. Tentei fazer com que fazer "Private Sub ComboBox1_Change()" ser "Public Sub ComboBox1_Change()" mas não adiantou e as declarei "Public celladd as Variant e Public cellrow as Integer".

Neste código, percebi que talvez ele fosse um pouco "ineficiente" pois percebi que mesmo depois de achar a célula desejada o código continua até o final da tabela. Vocês acreditam que isso é uma "ineficiência" significativa? Poderia substituir esse Do While- Loop por outra coisa, assim parando o código quando achar a célula desejada, mas será que isso trará uma agilidade significativa? (Atualmente para fazer essa procura demora-se algo em torno de 1 segundo (Application.screenupdating = false)).

Obrigado pela atenção e ajuda.

final

 
Postado : 07/06/2013 2:18 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 


Pode ser que eu não tenha entendido o problema, mas tenta fazer algo desta forma:

Call SUA_MACRO(celladd, cellrow)

No Módulo:

Sub SUA_MACRO(celladd, cellrow)
...
End Sub

Quanto ao Do... While... pode substituir (com os devidos tratamentos de erros, se necessários) por exemplo:
cellrow = Application.WorksheetFunction.Match(ComboBox1.Value, Sheets("BDCadastro").Range("B:B"), 0)


Veja se atende e, caso contrário, reporte o que está retornando de errado.

 
Postado : 07/06/2013 2:40 pm
(@finaljustice)
Posts: 91
Estimable Member
Topic starter
 


Pode ser que eu não tenha entendido o problema, mas tenta fazer algo desta forma:

Call SUA_MACRO(celladd, cellrow)

No Módulo:

Sub SUA_MACRO(celladd, cellrow)
...
End Sub

Quanto ao Do... While... pode substituir (com os devidos tratamentos de erros, se necessários) por exemplo:
cellrow = Application.WorksheetFunction.Match(ComboBox1.Value, Sheets("BDCadastro").Range("B:B"), 0)


Veja se atende e, caso contrário, reporte o que está retornando de errado.

Obrigado por responder!
Você acredita que vale a pena essa alteração em termos de performance do código? Que a substituição é possível isso eu sei, quero saber se vale a pena.
Consegui fazer funcionar, nomiei as variáveis Public somente no Módulo.

Att

 
Postado : 07/06/2013 3:04 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Final, toda implementação em qualquer código, desde que seguindo a dica do Edson que é muito importante (com os devidos tratamentos de erros, se necessários), não só na parte do Do While, mas como regra geral em todo o código onde for possível, deixarmos uma Varável como Publica para ser utilizada posteriormente representa um grande avanço na performance, uma vez que se vamos utiliza-la em seguida não precisamos fazer nova consulta ao BD.

Em sua rotina por exemplo, apesar de só ser uma parte, o ideal seria analisar o contexto todo, na linha "Sheets("BDCadastro").Range("B3").Select", não precisamos usar o Select, desde que a Sheet "BDCadastro" tenha sido referenciada antes, tambem podemos deixa-la como Publica :
De uma olhada no Modelo abaixo onde trabalhamos com um tipo de Cadastro com Front_End e o banco, a maioria a das variaveis estão como Publica.
Modelo Cadastro V3 - Acesso a outros BD + Graficos
http://www.tomasvasquez.com.br/forum/vi ... bJlHufBO2Q

Para resumir, pode-se estar alterando sua rotina por inteira, mas para isso, como disse acima teria de estudar o contexto todo, pois você utiliza instruções tipo :
If ActiveCell = ComboBox1 Then
celladd = ActiveCell.Offset(0, -1).Address
cellrow = ActiveCell.Row

End If

ActiveCell.Offset(1, 0).Select

Referindo-se a celula ativa e selecionando a mesma, e pelo que entendi na aba "BDCadastro", mas não sei qual é a proxima ação, se é só para localizar, ou fazer alguma alteração.

De uma olhada neste outro exemplo abaixo, onde temos uma Function de Pesquisa, que ao localizar o que se procura finaliza, acredito que irá ajudar em seu modelo.
Function para Pesquisa
viewtopic.php?f=28&t=2816

Espero ter ajudado, qq coisa retorne.

[]s

 
Postado : 07/06/2013 5:11 pm
(@finaljustice)
Posts: 91
Estimable Member
Topic starter
 

Final, toda implementação em qualquer código, desde que seguindo a dica do Edson que é muito importante (com os devidos tratamentos de erros, se necessários), não só na parte do Do While, mas como regra geral em todo o código onde for possível, deixarmos uma Varável como Publica para ser utilizada posteriormente representa um grande avanço na performance, uma vez que se vamos utiliza-la em seguida não precisamos fazer nova consulta ao BD.

Em sua rotina por exemplo, apesar de só ser uma parte, o ideal seria analisar o contexto todo, na linha "Sheets("BDCadastro").Range("B3").Select", não precisamos usar o Select, desde que a Sheet "BDCadastro" tenha sido referenciada antes, tambem podemos deixa-la como Publica :
De uma olhada no Modelo abaixo onde trabalhamos com um tipo de Cadastro com Front_End e o banco, a maioria a das variaveis estão como Publica.
Modelo Cadastro V3 - Acesso a outros BD + Graficos
http://www.tomasvasquez.com.br/forum/vi ... bJlHufBO2Q

Para resumir, pode-se estar alterando sua rotina por inteira, mas para isso, como disse acima teria de estudar o contexto todo, pois você utiliza instruções tipo :
If ActiveCell = ComboBox1 Then
celladd = ActiveCell.Offset(0, -1).Address
cellrow = ActiveCell.Row

End If

ActiveCell.Offset(1, 0).Select

Referindo-se a celula ativa e selecionando a mesma, e pelo que entendi na aba "BDCadastro", mas não sei qual é a proxima ação, se é só para localizar, ou fazer alguma alteração.

De uma olhada neste outro exemplo abaixo, onde temos uma Function de Pesquisa, que ao localizar o que se procura finaliza, acredito que irá ajudar em seu modelo.
Function para Pesquisa
viewtopic.php?f=28&t=2816

Espero ter ajudado, qq coisa retorne.

[]s

Muito obrigado pela resposta vou dar uma olhada nos links sugerido e dar uma estudada no que foi feito.
Att,
Final

 
Postado : 10/06/2013 11:07 am