Notifications
Clear all

Resumir / otimizar código

2 Posts
2 Usuários
0 Reactions
907 Visualizações
(@sandrolima)
Posts: 0
Estimable Member
Topic starter
 

Boa noite, pessoal

Escrevi um código que insere o registro mais recente sempre no topo de uma tabela (TB_Pacientes) e busca sempre o maior número de registro na coluna cadastro, acrescido de +1, para inserir o novo registro com esse número .
Feito isso o código executa a rotina descrita abaixo que foi feita com a ajuda do gravador de macros.

Parte do código:

tabela.Sort. _
        SortFields.Clear
    tabela.Sort. _
        SortFields.Add Key:=Range("TB_Pacientes[[#All],[Data]]"), SortOn:= _
        xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    
    With tabela.Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    
    Range("TB_Pacientes[Cadastro]").FormulaR1C1 = _
        "=LIN()-LIN(TB_Pacientes[[#Cabeçalhos],[Cadastro]])"
    Range("TB_Pacientes[Cadastro]").Select
        Selection.Copy
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    
    tabela.Sort. _
        SortFields.Clear
    tabela.Sort. _
        SortFields.Add Key:=Range("TB_Pacientes[[#All],[Data]]"), SortOn:= _
        xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    
    With tabela.Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    
    Range("TB_Pacientes[Nome]").Select
    tabela.Sort.SortFields.Clear
    tabela.Sort. _
        SortFields.Add Key:=Range("TB_Pacientes[[#All],[Nome]]"), SortOn:= _
        xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    
    With tabela.Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    
    tabela.Sort.SortFields.Clear
    tabela.ListRows(1).Range(1, 1).Select
    Application.CutCopyMode = False
    
    Set tabela = Nothing

Basicamente o que ele faz é apagar os valores da coluna de cadastros, colocar em ordem ascendente (menor para o maior) os registros da tabela conforme a data, renumerar os registros usando a fórmula =LIN()-LIN(valor da linha anterior), organizar novamente em forma descendente (conforme a data de registro) e no final organizar em ordem alfabética de A-Z.

Tudo isso para que os registros mais recentes fiquem no topo da tabela e recebam número de cadastro de forma crescente e ao final organize o nome dos pacientes na sequencia alfabética.

Enfim... o código apresenta muitas repetições de comando (como disse foi realizado com o gravador de macros). Há como resumir ou há uma maneira melhor de fazer essa rotina:
- Registros mais recentes recebem números maiores e devem ficar no topo da tabela.

Obrigado a quem puder ajudar.

 
Postado : 05/09/2018 5:49 pm
(@mprudencio)
Posts: 2749
Famed Member
 

Eu nao sei como funciona sua planilha, mas se eu entendi não faria isso se fosse voce.

Isso pode te causar problemas no futuro.

Teria que testar o codigo mas nesta parte

    With tabela.Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

Basta deixar assim:

    With tabela.Sort
        .Header = xlYes
        .Apply
    End With

Marcelo Prudencio
Microsoft Excel Brasil no Facebook

"Começar já é a metade do caminho."
Autor Desconhecido

Simplifica que simples fica.
Nicole Tomazella.

"O Simples é Sempre Melhor Que o Complicado"
Jorge Paulo Lemann.

 
Postado : 05/09/2018 7:02 pm