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
Avatar do usuário
Por JCabral
Avatar
#73398
Boa tarde

Pedindo ajuda para o seguinte problema:

- Tenho uma Timeline com todas as semanas do ano e precisava de uma Function que me devolvesse o range de cada semana, ou seja, quando eu invocasse a Function passando a semana como parâmetro ela devolvia o range dessa semana.
No exemplo que anexo, tenho os seguintes valores expectáveis de retorno da Function:
SEMANA RESULTADOS EXPECTÁVEIS
1-------------------------- $L$8
2-------------------------- $M$8:$S$8
3--------------------------$T$8:$Z$8
4--------------------------$AA$8:$AG$8
5--------------------------$AH$8:$AN$8
…-------------------------- …......
53--------------------------$NF$8:$NL$8

Na planilha que anexo acho que é mais percetível o que gostaria de obter.

Obrigado
Jorge Cabral
Você não está autorizado a ver ou baixar esse anexo.
Por osvaldomp
#73399
Salve, Jorge.

Se você quiser saber apenas o intervalo de uma certa semana, então coloque o número da semana em C11 e a Função em D11.

Se você quiser saber os intervalos de várias semanas, então coloque os respectivos números, em qualquer ordem, a partir de C11 e a função a partir de D11.

Function WeekRange()
Dim frstAdd As String, lstAdd As String
frstAdd = Rows(8).Find(Application.Caller.Offset(, -1).Value, lookat:=xlWhole).Address
lstAdd = Rows(8).Find(Application.Caller.Offset(, -1).Value, lookat:=xlWhole, SearchDirection:=xlPrevious).Address
WeekRange = IIf(frstAdd = lstAdd, frstAdd, frstAdd & ":" & lstAdd)
End Function
Avatar do usuário
Por JCabral
Avatar
#73400
Viva @Osvaldomp

Muito obrigado mais uma vez pela resposta

O que estava precisando era algo do tipo "Function WeekRange(nWeek as Integer) as String", para que fosse possível chamar a função no meio de outro código. Não preciso que me retorne o range da semana na planilha, apenas coloquei lá para mostrar os resultados expectáveis da função.

Não terei sido claro no pedido que fiz mas espero que agora esteja mais claro.

Acresce que a Function tem que correr numa Planilha protegida com password.

Obrigado
Jorge
Editado pela última vez por JCabral em 20 Jun 2023 às 08:34, em um total de 1 vez.
Avatar do usuário
Por Foxtri
Posts Avatar
#73401
Bom dia.
Segue outra opção.
Em D11 =SEERRO(ENDEREÇO(8;CORRESP(C11;$L$8:$NL$8;0)+11)&SE(CONT.SE($L$8:$NL$8;C11)>1;":"&ENDEREÇO(8;CORRESP(C11;$L$8:$NL$8;0)+11+CONT.SE($L$8:$NL$8;C11)-1);"");"...")
Copie abaixo.
Até
Foxtri
Avatar do usuário
Por JCabral
Avatar
#73402
Bom dia @Foxtri

Obrigado pela sua solução, mas preciso que seja uma Function em VBA para em um outro código invocar a Function e ela me retornar o range da semana. Não tenho necessidade de colocar o range na planilha

Acresce que a Function tem que correr numa Planilha protegida com password.

Obrigado
Jorge
Por osvaldomp
#73403
Veja este exemplo.

Sub BozoDonkey()
Dim k As Long
k = 5
MsgBox WeekRange(k)
End Sub

Function WeekRange(c As Long)
Dim frstAdd As String, lstAdd As String
ActiveSheet.Unprotect "senha"
frstAdd = Rows(8).Find(c, lookat:=xlWhole).Address
lstAdd = Rows(8).Find(c, lookat:=xlWhole, SearchDirection:=xlPrevious).Address
ActiveSheet.Protect "senha"
WeekRange = IIf(frstAdd = lstAdd, frstAdd, frstAdd & ":" & lstAdd)
End Function

Se conveniente, Unprotect e Protect podem ser inseridos na Sub e não na UDF.
Avatar do usuário
Por JCabral
Avatar
#73404
Obrigado Osvaldo

A partir da sua primeira solução já tinha conseguido chegar mais ou menos à solução que pretendia, o problema estava que com o FIND não é possível o range de procura estar trancado, resolvi destrancado apenas a linha 8 e assim já não preciso proteger e desproteger a planilha.

Muito obrigado mais uma vez.
Jorge
Avatar do usuário
Por Foxtri
Posts Avatar
#73405
Boa tarde Cabral
Não tinha observado o seu comentario.
Segue uma opção:

Function RangeSemana(Num As Integer)
Dim ColIni As Integer, ColFim As Integer
ColIni = Application.Match(Num, Range("L8:NL8"), 0) + 11
ColFim = Evaluate("SMALL(IF(L8:NL8=" & Num & " ,column(L8:NL8)),COUNTIF(L8:NL8," & Num & "))")
RangeSemana = Range(Cells(8, ColIni), Cells(8, ColFim)).Address
End Function

A proposito sr Osvaldo , o nome dado Sub BozoDonkey é para indiretamente chamar alguem aqui deste forum de Palhaço ??

Até
Foxtri
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