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
#71839
Boa noite

Em tempos pedi aqui ajuda para através de formatação condicional fosse evidenciado numa Timeline quais as tarefas que estavam em determinado Roteiro, ou seja, na linha 19 da Timeline eu escolho qual o Roteiro e as tarefas que estão definidas na aba ROTEIROS aparecem evidenciadas. Tudo OK até aqui

O que eu precisava agora era que quando eu colocasse o cursor em uma determinada semana, e desde que em B1 estivesse um "X" apenas fossem mostradas na coluna TAREFA, as tarefas que estavam nos roteiros dessa semana.

Existem umas condicionantes, o Layout não pode ser alterado, não queria transformar o Layout ou parte dele em TABELA
Aqui apenas mostro parte da TIMELINE, que no ficheiro original tem os meses todos e os dias todos do ano;
Este TIMELINE não é fixo, todos os anos ele muda em função do respectivo ano;
Os ROTEIROS não são fixos, aqui mostro 4 mas podem ser "n" e terem diferentes tarefas em cada dia da semana

No ficheiro anexo mostro dois exemplos, um para quando o cursor está na semana W1 e outro para quando o Cursor está na semana W2

Obrigado pela ajuda
Você não está autorizado a ver ou baixar esse anexo.
#71842
Salve, Jorge.

Experimente uma cópia do código abaixo instalada no módulo da planilha TIMELINE.
A remoção do Auto Filtro pode ser incrementada no próprio código ou via um novo código. Retorne se precisar de ajuda.
Código: Selecionar todos
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 Dim wd As Long, LR As Long, i As Long, x As Variant, c As Range
  If Target.Count > 1 Then Exit Sub
  If [B1] <> "X" Or Target.Row <> 9 Or Target.Value = "" Then Exit Sub
  On Error Resume Next
  Me.AutoFilterMode = False
  On Error GoTo 0
  LR = [A20].End(4).Row
  wd = Application.Weekday(Target.Offset(-2).Value)
  ReDim x(0)
  For i = 20 To LR
   For Each c In Cells(i, Target.Column).Resize(, 7 - wd)
    If c.DisplayFormat.Interior.Color = 10086143 Then
     x(UBound(x)) = Cells(c.Row, 1)
     ReDim Preserve x(UBound(x) + 1)
     Exit For
    End If
   Next c
  Next i
  Range("A19", Cells(19, Columns.Count).End(1)).AutoFilter Field:=1, Criteria1:=x, Operator:=xlFilterValues
End Sub
#71849
Boa tarde Caro Osvaldo

Mais uma vez muito obrigado.
Julgo que está quase, quase perfeito, o que está a faltar e se me puder ajudar era fantástico, é:
- Vi que o filtro é ativado quando clico na semana, W1, W2,...,Wn, não tinha pensado nisso mas parece-me uma ótima opção, se possível quando clico fora o filtro é desativado e mostra tudo, é possível?
- Quando ativo o filtro é possível não mostrar os botões dos filtros, mantendo contudo as linhas filtradas?

Com estas duas demandas acho que ficaria TOP!

Obrigado
Jorge
#71852
Experimente este no lugar do anterior.
Código: Selecionar todos
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 Dim wd As Long, i As Long, c As Range, b As Boolean
  Application.ScreenUpdating = False
  Rows("20:150").Hidden = False
  If Target.Count > 1 Then Exit Sub
  If [B1] <> "X" Or Target.Row <> 9 Or Target.Value = "" Then Exit Sub
  wd = Application.Weekday(Target.Offset(-2).Value)
  For i = 20 To [A20].End(4).Row
   For Each c In Cells(i, Target.Column).Resize(, 7 - wd)
    If c.DisplayFormat.Interior.Color = 10086143 Then b = True: Exit For
   Next c
   Rows(i).Hidden = Not b: b = False
  Next i
End Sub
#
obs. para elaborar o código acima e também o anterior, tive problemas por conta de células mescladas na sua planilha.
Células mescladas são desnecessárias, inúteis e em algum momento irão provocar sérios problemas com fórmulas e ou com macros na sua planilha.
#71854
Caro Osvaldo

Quanto à tua observação não posso estar mais de acordo, o que se passa é que a parte do layout A1:L19 era completamente fixo até esta nova demanda. razão pela qual elaborei da forma mais rápida na altura. Posso colocar ai o texto necessário e você proceder às alterações necessárias para maximizar o código.

Por culpa minha não expliquei a razão da necessidade de fazer o filtro, mas é assim, por norma tenho muitas tarefas, muitas mesmo, e preciso de introduzir dados apenas nas que estão seleccionadas, as que estão pintadas, daí ter pedido o filtro, mas preciso que depois de filtrar possa introduzir os dados.
O que tinha pedido era que, conforme tinhas feito quando selecciono W1 ou W2 ou W3..... é filtrada a semana como estás a fazer, mas que me permita introduzir dados nas células que estão pintadas, mas quando selecciono na coluna da semanas mas fora de W1, W2, W3.... então mostra tudo.

Não sei se fui totalmente claro?
Quanto ao layout entre A1 e L19 podes fazer todas as alterações que consideres necessárias desde que o texto nas células mescladas fiquem centradas.

Muito obrigado mais uma vez
#71855
Jorge, veja se assim atende.
É igual ao código anterior, apenas alterei a ordem das instruções.
Adicionei também um código para reexibir todas as linhas via duplo clique em B1.
Cole ambos em substituição ao anterior.

Código: Selecionar todos
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 Dim wd As Long, i As Long, c As Range, b As Boolean
  If Target.Count > 1 Then Exit Sub
  If [B1] <> "X" Or Target.Row <> 9 Or Target.Value = "" Then Exit Sub
  Application.ScreenUpdating = False
  Rows("20:150").Hidden = False
  wd = Application.Weekday(Target.Offset(-2).Value)
  For i = 20 To [A20].End(4).Row
   For Each c In Cells(i, Target.Column).Resize(, 7 - wd)
    If c.DisplayFormat.Interior.Color = 10086143 Then b = True: Exit For
   Next c
   Rows(i).Hidden = Not b: b = False
  Next i
End Sub


Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
 If Target.Address = "$B$1" Then
  Rows("20:150").Hidden = False
  Cancel = True
 End If
End Sub
#
funcionamento

se B1=X
1.para mostrar somente as linhas que na coluna A contenham as Tarefas conforme a semana selecionada, selecione na linha 9 a semana desejada (W1 ou W2 ou W3 ou ...)
2. após, qualquer outra célula selecionada na planilha, que não seja uma das citadas acima, o filtro não será alterado pelo código

se B1<>X
3. a diferença de funcionamento em relação aos itens 1 e 2 acima é que mesmo selecionando W1 ou W2 ou W3 ou ... o código não será executado; esta condição será útil nos casos em que for preciso editar aquelas células

4. para desfazer o filtro e assim reexibir todas as linhas a partir da linha 20 até a linha 150, aplique duplo clique em B1. A reexibição das linhas citadas independe do conteúdo de B1 ao aplicar o duplo clique.
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