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
#46469
Código: Selecionar todos
Deixei a macro que eu completei na planilha pra que vc me dê um feedback sobre o modo como eu fiz.
Agora que vi que vc respondeu no tópico anterior... estava escrevendo as novas dúvidas quando vc respondeu.
Sandro, caso ainda haja coisas a fazer, vamos em frente sem problemas, mas caso esteja pensando em fechar o tópico, peço que aguarde mais um pouco. Estou pesquisando sobre a questão de obter a cor condicional da célula, via VBA, porque é uma questão interessante. Pode ser que surja alguma coisa que nos ajude neste caso. Te dou um toque quando eu terminar.
Perfeitamente.... manteremos aberto.
Aproveito também para te perguntar se pode revisar se há alguma mensagem (acima) que tenha de alguma forma ajudado, e que tenha esquecido de clicar na mãozinha. Obrigado.
Com todo o agradecimento merecido... feito.

E muito obrigado pelo feedback.
#46479
Sandro,

If Passo = 6 Then
Set RngTabela = Range(Cells(LinCorte + 1, IniCol), Cells(UltLin, UltCol))
Set RngCol = Range(Cells(LinCorte + 1, ColData), Cells(UltLin, ColData))
SortTipo = xlSortOnValues: SortOrdem = xlDescending
End If

If Not RngTabela Is Nothing Then
Plan.Sort.SortFields.Clear
Plan.Sort.SortFields.Add Key:=RngCol, _
SortOn:=
SortTipo, Order:=SortOrdem, DataOption:=xlSortNormal

With Plan.Sort
.SetRange RngTabela: .Header = xlGuess: .MatchCase = False
.Orientation = xlTopToBottom: .SortMethod = xlPinYin: .Apply
End With
End If

SortTipo e SortOrdem são duas variáveis que eu criei (poderia ter sido qualquer outro nome) para o Sort saber que tipo de classificação, se é ascendene ou descendente.

Como os 5 passos realizam o Sort, hora de uma forma, hora de outra, se eu colocar no sort Order:= xlDescending, por exemplo, o sort sempre será descendente.
Fazendo SortOrdem = xlDescending
E depois no sort Order:= SortOrdem, se eu mudar SortOrdem para xlAscending, o sort será feito dessa forma.
Acho que o que te confundiu foi que eu dei o nome das variáveis parecido com nomes do VB.
Enxergue assim:
No IF do passo: kkk = xlDescending
E depois no sort: Order:= kkk


Eu acho que você enxergaria melhor a rotina se tirássemos o FOR PASSOS e fizéssemos comandos um após o outro, com diversos comandos Sort. Se concordar comigo, fazemos isso. Aliás, comentei esse possibilidade na época que apresentei o FOR PASSOS.

- - - - - - -

As macros podem ser acionadas por botões, e podem haver botões acionando a mesma macro em diversas planilhas (não é o seu caso). Podem também ser acionadas por teclado. Assim, a macro pode ser acionada quando o operador estiver em qualquer planilha, com qualquer célula selecionada.

Durante a execução a macro pode selecionar outras planilhas (não é o seu caso), selecionar outras células, etc. Se eu prefiro que ao encerrar a macro deixe na mesma planilha e mesma célula que estavam selecionadas antes da execução, a macro guarda onde estava (planilha e célula) e no final as seleciona.

Note que no início da macro as variáveis AquiP (planilha) e AquiC (célula) são definidas.

Tem vezes que isso não é desejado. Queremos mesmo é ir pra onde a macro atuou. Nesse caso, é só apagar essas linhas

Amanhã verei a questão da nova demanda.

Bom domingo.

Jimmy San Juan
#46513
Bom dia, Jimmy.

Obrigado pelas explicações.
SortTipo e SortOrdem são duas variáveis que eu criei (poderia ter sido qualquer outro nome) para o Sort saber que tipo de classificação, se é ascendene ou descendente.
Compreendido... e elas seriam (pergunto para meu aprendizado) do tipo Variant?
Acho que o que te confundiu foi que eu dei o nome das variáveis parecido com nomes do VB.
Um pouco... mas está esclarecido agora.
Eu acho que você enxergaria melhor a rotina se tirássemos o FOR PASSOS e fizéssemos comandos um após o outro, com diversos comandos Sort. Se concordar comigo, fazemos isso. Aliás, comentei esse possibilidade na época que apresentei o FOR PASSOS.
Por mim tudo bem continuar assim... acho muito bom poder aprender outras formas de escrita do código.
Se pudesse me ensinar comentando o trecho antes do "Next" dentro do passo 5 já estria ótimo.
Note que no início da macro as variáveis AquiP (planilha) e AquiC (célula) são definidas.
Só vi isso depois.
Amanhã verei a questão da nova demanda.
Ok... e muito obrigado novamente.

Tenha uma excelente semana.
#46520
Bom dia Sandro,
SandroLima escreveu:Compreendido... e elas seriam (pergunto para meu aprendizado) do tipo Variant?
Pode ser long. Eu só declaro variáveis e seu tipo, para matrizes acima de um certo tamanho, porque ai sim é significativo o ganho de memória. Para variáveis não matrizes, economizar 2 ou 4 bytes é como economizar centavos na compra de um apartamento.

A finalidade de evitar erros na digitação de variáveis, ou tipo de conteúdo da variável, eu dispenso, porque mais me atrapalha do que ajuda.

Vou ver a questão da condicional no registro.

Boa semana!!!!!

Jimmy San Juan
#46591
Boa noite Sandro,

Alterei a macro e agora as células sem cor na data, estão classificadas primeiro pela cor do registro (que ficam no topo da lista das datas sem cor), e depois pela data (descendente), e depois pelo valor do registro. Pelo que entendi nos teus últimos posts, era isso, correto?

Mudei a parte dos 5 passos porque não tava gostando da apresentação. Explico porque. A ideia de fazer os 5 passos, e não diversos SORTS seguidos, era separar as informações relevantes ao Sort (faixa a classificar, coluna base da classificação, tipo de classificação e ordem) dos demais comandos do Sort, para vermos apenas o que interessa, e visualizar melhor o que está sendo feito. Eu não estava satisfeito com a clareza das informações e por isso mudei. Acho que agora está melhor.

Na variável S(0) está a faixa a ser classificada (tabela toda, ou apenas a parte de cima, ou a de baixo)
Na S(1) estão as 3 informações relevantes do primeiro critério de classificação: coluna base da classificação, tipo de classificação e ordem). Essas 3 informações estão nas variáveis S(1)(0), S(1)(1) e S(1)(2) respectivamente. Talvez você não esteja acostumado com essa forma de acessar elementos de matrizes, porque ela não é usual, mas achei melhor fazer assim. Para passos que tem mais de um critério, estão sendo usadas S(2), S(3).... e assim por diante. Dimensionei a matriz com 3 porque estou usando no máximo 3 critérios, mas se for o caso de incluir mais, é só dimensionar a matriz com esse número e criar os critérios.

Teste com rigor!!!! kkkkkk

Qualquer problema, avise.

Jimmy San Juan
Você não está autorizado a ver ou baixar esse anexo.
#46626
Boa noite, Jimmy
Alterei a macro e agora as células sem cor na data, estão classificadas primeiro pela cor do registro (que ficam no topo da lista das datas sem cor), e depois pela data (descendente), e depois pelo valor do registro. Pelo que entendi nos teus últimos posts, era isso, correto?
Corretíssimo. A primeira vista parece que ficou exatamente como estava desejando.
Mudei a parte dos 5 passos porque não tava gostando da apresentação. Explico porque. A ideia de fazer os 5 passos, e não diversos SORTS seguidos, era separar as informações relevantes ao Sort (faixa a classificar, coluna base da classificação, tipo de classificação e ordem) dos demais comandos do Sort, para vermos apenas o que interessa, e visualizar melhor o que está sendo feito. Eu não estava satisfeito com a clareza das informações e por isso mudei. Acho que agora está melhor.
Confesso que em um primeiro instante foi um verdadeiro nó para eu entender... mas passado um tempo ficou mais fácil identificar cada etapa dentro dos passos (quando seleciona o intervalo, o critério de classificação e a ordem).

Como fica leitura desse trecho, por exemplo:
Minha interpretração (mas gostaria da sua leitura):
If Passo = 5 Then 'Reclassifica apenas as datas NÃO COLORIDAS por Registros coloridos e Data
Se estivermos no passo 5
Set S(0) = Range(Cells(LinCorte + 1, IniCol), Cells(UltLin, UltCol))
Eu "seto"/aponto como área em que a macro vai executar o intervalo....
Código: Selecionar todos
S(1) = Array(Range(Cells(LinCorte + 1, ColReg), Cells(UltLin, ColReg)), xlSortOnCellColor, xlDescending)
            S(2) = Array(Range(Cells(LinCorte + 1, ColReg), Cells(UltLin, ColReg)), xlSortOnValues, xlDescending)
            S(3) = Array(Range(Cells(LinCorte + 1, ColData), Cells(UltLin, ColData)), xlSortOnValues, xlDescending)
Aqui entendo que executa a sequência/critérios da classificação mas não soube interpretar/comentar de maneira a fazer conexão com a linha anterior.
Entendi mas não soube trazer para a forma comentada.

O trecho abaixo eu ainda não sei interpretar quase nada:
Código: Selecionar todos
'Realiza a classificação
        If Not IsEmpty(S(0)) Then
            Plan.Sort.SortFields.Clear  'Limpa  os critérios de classificação
            For Idx = 1 To UBound(S)    'Define os critérios de classificação
                If Not IsEmpty(S(Idx)) Then _
                    Plan.Sort.SortFields.Add Key:=S(Idx)(0), SortOn:=S(Idx)(1), _
                         Order:=S(Idx)(2), DataOption:=xlSortNormal
            Next
            With Plan.Sort                'Executa a classificação
                .SetRange S(0): .Header = xlGuess: .MatchCase = False
                .Orientation = xlTopToBottom: .SortMethod = xlPinYin: .Apply
            End With
        End If
    Next
Se não for pedir muito Jimmy. Gostaria dos comentários nesse trecho.
Ao contrário do que já possa ter parecido para alguém em outra situação, gosto muito de aprender/entender um código que atende uma necessidade minha.

Vou continuar testando exaustivamente com rigor rsrs.

Tenha uma boa noite e mais uma vez muito obrigado.
#46634
Bom dia Sandro,

Ótimo!!! Vamos à parte mais interessante, que é trocar conhecimento!!

Começando pelo básico, que você já sabe, mas caso alguém esteja acompanhando o tópico, lá vai:

O comando For Passo = 1 To 5 será responsável por executar o que está dentro dele 5 vezes.
Na primeira, a variável Passo terá valor de 1, na segunda 2, e assim por diante.
Cada uma das vezes que for executado seu interior, os comandos IF farão a matriz S assumir conteúdos diferentes, logo, o SORT fará coisas diferentes, porque o Sort se baseia no conteúdo de S.

Em linhas gerais, os valores colocados na matriz S apenas definem os parâmetros onde o Sort vai atuar.

A instrução
S(1) = Array(Range(Cells(IniLin, ColData), Cells(UltLin, ColData)), xlSortOnCellColor, xlDescending)
É igual a
S(1)(0) = Range(Cells(IniLin, ColData), Cells(UltLin, ColData))
S(1)(1) =xlSortOnCellColor
S(1)(2) = xlDescending)

Em S(0) é colocado o intervalo de atuação do Sort, por exemplo, no passo 3 é o intervalo de toda a tabela (B15:I301).

Vou usar como exemplo S(1), que contém as informações necessárias para executar o primeiro critério de classificação.
Em S(1) são colocadas as 3 informações básicas para o Sort classificar, que são:

- S(1)(0)
Por qual coluna será classificado? Na verdade não se aponta para a coluna como um todo, mas a faixa dessa coluna que o Sort colocará em ordem. No caso do Passo 3, essa faixa é D15:D301 (Data). Para colorar em ordem essa faixa, o Sort vai trocar de lugar as linhas de todo o intervalo definido em S(0), pois não fica certo colocar a menor data em cima, por exemplo, sem que o status, a disponibilidade, o registro, a Sub, o fluxo, etc, acompanhem essa data. É pra saber o que deve acompanhar essa data que definimos S(0).

- S(1)(1)
Que tipo de informação será classificada? O valor das células? A cor de fundo? A cor da fonte? Ícone?
No Passo 3, estou definindo xlSortOnCellColor, que significa “cor de fundo”. Se fosse xlSortOnValues significaria “valor da célula”, como é usado no passo 4.

- S(1)(2)
Define se é em ordem crescente ou decrescente (xlDescending ou xlAscending)

Vou precisar fazer uma parada. De tarde finalizo explicando a parte do SORT.

Jimmy San Juan
#46726
Bom dia, Jimmy
A instrução
S(1) = Array(Range(Cells(IniLin, ColData), Cells(UltLin, ColData)), xlSortOnCellColor, xlDescending)
É igual a
S(1)(0) = Range(Cells(IniLin, ColData), Cells(UltLin, ColData))
S(1)(1) =xlSortOnCellColor
S(1)(2) = xlDescending)
Ficou bem claro o entendimento do código após esta explicação.
Vou precisar fazer uma parada. De tarde finalizo explicando a parte do SORT.
Isso seria bom.

Obrigado e tenha uma excelente semana.
#46731
Boa tarde Sandro,

Segue a explicação.

No comando Sort:

If Not IsEmpty(S(0)) Then
Só vai realizer o Sort se a faixa S(0) tiver sido definida. No caso do passo 2, não há classificação sendo feita, apenas a renumeração do registro, então S(0) não é definido. O IF não executa o SORT nesse caso.

A linha Plan.Sort.SortFields.Clear limpa todos os critérios de classificação que por ventura tenham sido definidos anteriormente. Isso pra poder definir os novos critérios sem correr o risco de que sejam acrescentados a critérios antigos.

For Idx = 1 To UBound(S) 'Define os critérios de classificação.
Ubound(S) retorna a quantidade de dimensões de S. Como o DIM define S com 3 dimensões, o FOR vai fazer Idx (indexador) variar de 1 a 3, ou seja, o interior do FOR vai ser executada 3 vezes: a primeira com Idx valendo 1, a segunda valendo 2 e a terceira valendo 3. Se um dia precisar aumentar a quantidade de critérios, teremos que alterar o DIM para 4 (exemplo), e o FOR já vai fazer de 1 a 4 automaticamente. Esse FOR é responsável por informar ao SORT os dados de todos os critérios de classificação.

Temos passos que só usam/definem 1 critério. Outros poderiam usar 2 critérios (não é o caso, mas poderia ser). A instrução If Not IsEmpty(S(Idx)) Then só usará os S(Idx) que tiverem sido definidos com critérios de classificação, pulando os S(Idx) em branco.

A linha Plan.Sort.SortFields.Add insere os critérios definidos. Note que ela usa S(Idx)(0), S(Idx)(1) e S(Idx)(2) que são os 3 elementos que compõe o critério S(Idx), e que foram definidos nos IFs de cada passo.

.SetRange S(0): .Header = xlGuess: .MatchCase = False, .Orientation = xlTopToBottom: .SortMethod = xlPinYin: .Apply define a faixa de atuação do Sort (em S(0)), define alguns outros parâmenros e o .APPLY finalmente realiza o SORT.

- - - - - - -

Mudando de assunto.

Percebo que esta planilha está relacionada com aquele outro tópico que desenvolvemos há alguns meses:
http://gurudoexcel.com/forum/viewtopic. ... &start=120
como ficou aquilo? Faltou algo? Não sei se paramos com tudo resolvido ou ainda com pendências.

Boa senama!!!

Jimmy San Juan
#46759
Boa tarde, Jimmy
Segue a explicação.
Muito obrigado pelas explicações... está bem claro.
Mudando de assunto.
Percebo que esta planilha está relacionada com aquele outro tópico que desenvolvemos há alguns meses:como ficou aquilo? Faltou algo? Não sei se paramos com tudo resolvido ou ainda com pendências.
Totalmente a ver com ela... é ela mesmo... continuo evoluindo ela sempre... cada melhoria que vejo que poderia me ajudar venho aqui para solicitar ajuda quando preciso. Lembra que lá tinha essa parte de classificação que tiramos da Macro de inserir linha para diminuir o tempo dela.
Boa memória a sua rsrs.

Sobre como ficou... não ficou. E lamento muito sobre isso.
Fiquei constrangido em continuar pedindo ajuda na planilha depois daquele episódio em que foi sugerido que nosso tópico não era para o meu aprendizado ou necessidade minha.
Mas está aí para provar... é exatamente a mesma planilha... apenas resumida para sanar especificamente a necessidade apresentada nesse tópico.
Apesar de continuar usando o "modus operandi" anterior da minha planilha, ainda tenho a sua macro lá armazenada para um dia quem sabe continuar desenvolvendo-a.
Por enquanto continuo fazendo nela o que fazia antes. Crio uma planilha espelho e nela faço os desdobramentos (mães e filhas) de parcelas e atendimentos manualmente. Não tenho conhecimento para prosseguir nossa ideia.

Vou deixar o tópico aberto mais dois ou três dias para qualquer comentário ou caso algum usuário queira aproveitar para mais alguma coisa.

Muito obrigado mais uma vez... sempre muito prestativo, Jimmy.
Tenha uma semana abençoada.
Avatar do usuário
Por Jimmy
Avatar
#46766
Sandro,

Não deveria ter deixado se constranger! Foram apenas opiniões diferentes, mas a sua é a que vale mais, porque melhor do que eu ou que aquele colega, você é quem sabe o quanto aprende, o quanto resolve, o quanto ajuda, etc. Lembro que naquela ocasião falei que sempre há um motivo pra alguém fazer algo de uma determinada forma. Você tem os teus!

Por estes dias estou com obras em casa, e meio apertado de tempo, mas acho que deveria continuar a seguir a tua linha de aprendizado.

Pense nisso.

Boa semana pra você também.
#46977
Boa tarde, Jimmy.
Não deveria ter deixado se constranger! Foram apenas opiniões diferentes, mas a sua é a que vale mais, porque melhor do que eu ou que aquele colega, você é quem sabe o quanto aprende, o quanto resolve, o quanto ajuda, etc. Lembro que naquela ocasião falei que sempre há um motivo pra alguém fazer algo de uma determinada forma. Você tem os teus!
Bom demais ler isso passado esse tempo... tira um peso.
Por estes dias estou com obras em casa, e meio apertado de tempo, mas acho que deveria continuar a seguir a tua linha de aprendizado.
Pense nisso.
Por mim sem problemas... Como sempre dizia lá... não tenho pressa. Também estarei em curso esse final de semana e até a segunda-feira.
Ia ser bom demais retomar o andamento daquele tópico. Quem sabe novas ideias depois desse tempo não surgiram?

Se estiver disposto retomo o tópico lá ou abro um novo para dar seguimento.

Como falei antes (após deixar aberto por alguns dias) vou então encerrar o tópico aqui e mais uma vez muitíssimo obrigado pela ajuda e principalmente pelas explicações dadas.
Tenha um excelente final de semana.
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