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.
Por Acrianinho
#65348
Boa noite.
Estou tentando montar um diário de classe interdisciplinar e estou com dificuldades em alguns pontos. A planilha (em anexo) tem diversas abas e algumas informações são dependentes de outras. Minha dor de cabeça atual está na planilha 1, CAPA.
Ocorre que tenho entradas dependentes, exemplo:
  • F17 seleciona a etapa (Ensino_Fundamental ou Ensino_Médio)
  • F18 seleciona o ano/série dependendo da etapa (6º ao 9º ano do fundamental ou 1ª a 3ª série do médio
Para estas duas entradas usei uma lista dependente com validação de dados.
  • F19 seleciona a disciplina relativa a cada ano/série
Para conseguir isso usei uma combinação de validação de dados e VBA.
Agora meu problema. Ao selecionar o ano/série e a disciplina preciso que o excel aponte na célula N17 a carga horária da devida disciplina (a carga horária muda de acordo com o ano/série e a disciplina)
Tentei usar o mesmo método usado para listar as disciplinas mas só consigo uma lista de carga horário. Não serve.
Tentei usar a função SE, mas ficou grande demais.
Tentei usar If no VBA, mas como é minha primeira vez com esse código (Comecei ontem....rssrs) não consegui fazer funcionar pois toda vez que tento atualizar o excel abre a guia do visual Basic.

Por favor, ajudem-me.
Você não está autorizado a ver ou baixar esse anexo.
Por osvaldomp
#65352
Experimente o código abaixo no lugar do existente.

O código irá buscar a carga horária na coluna F da planilha DADOS.
Código: Selecionar todos
Private Sub Worksheet_Change(ByVal Target As Range)
 Dim LR As Long
  If Intersect([F17:F18], Target) Is Nothing Then Exit Sub
  If Application.CountA([F17:F18]) < 2 Then [N17] = "": Exit Sub
  LR = Sheets("DADOS").Cells(Rows.Count, 6).End(3).Row
  [N17] = Evaluate("INDEX(DADOS!H1:H" & LR & ",MATCH(1,(F17=DADOS!F1:F" & LR & ")*(F18=DADOS!G1:G" & LR & "),0))")
End Sub
Por Acrianinho
#65354
@osvaldomp Obrigado pela resposta.
Seu código era exatamente o que eu queria Obrigado, mas ainda tenho um probleminha.... a atualização das disciplinas quando troco o ano/série parou. Tenho que fechar e abrir o excel para atualizar. Alguma dica?
Por osvaldomp
#65360
Acrianinho escreveu: 25 Jun 2021 às 01:47 Seu código era exatamente o que eu queria ...
Como alternativa segue uma solução via fórmula. Em CAPA!N17 cole uma cópia da fórmula abaixo e desative a macro existente.
=ÍNDICE(DADOS!H1:H69;CORRESP(1;(F17=DADOS!F1:F69)*(F18=DADOS!G1:G69);0))
Veja a observação no final desta postagem sobre o recálculo do arquivo.

... a atualização das disciplinas quando troco o ano/série parou.
opção1 - (recomendável) - na fórmula que está em CALC!C1 altere :
de ~~~> =SEERRO(PROCV($A$1&"."&B1;DADOS!E:H;3;0);1)
para ~~~> =SEERRO(PROCV(CAPA!F$17&"."&B1;DADOS!E:H;3;0);1)

opção2 - em CALC!A1 coloque ~~~> =CAPA!F17

Idem, idem para CALC!E1 e G1.
obs. o seu arquivo está marcado com a opção cálculo no modo Manual, isso implica que os resultados das fórmulas e dos Intervalos Nomeados (inclusive o intervalo Disciplinas) somente são atualizados ao apertar F9 ou ao Salvar/Reabrir o arquivo. Se viável, altere para Automático.

Se não for viável, e para não precisar apertar F9, no caso da solução por macro, você pode incluir a parte em vermelho no código que passei para forçar o Recálculo, conforme abaixo.
Application.Calculate
End Sub

Ou no caso de solução por fórmula, utilize o código abaixo, que irá recalcular após alteração manual em CAPA!F17 ou 18.
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect([F17:F18], Target) Is Nothing Then Exit Sub
If Application.CountA([F17:F18]) < 2 Then [N17] = "": Exit Sub
Application.Calculate
End Sub
Por Acrianinho
#65374
@osvaldomp Obrigado por sua ajuda.
A tabela está funcional usando seu primeiro código VBA junto com a mudança no PROCV que você propôs.
Mas, estou muito interessado nessa fórmula
=ÍNDICE(DADOS!H1:H69;CORRESP(1;(F17=DADOS!F1:F69)*(F18=DADOS!G1:G69);0))
já que não conhecia a função Índice nem Corresp, pena não ter funcionado (apresenta o erro #N/D quando apliquei mesmo excluindo todo o vba).
Funçando na internet ví que os parametros da função Corresp é: CORRESP(VALOR BUSCADO; MATRIZ; TIPO DE CORRESPONDENCIA). Na sua fórmula o valor procurado é 1 e a matriz é (F17=DADOS!F1:F69)*(F18=DADOS!G1:G69)... Queria muito entender isso. Poderia me explicar sua construção, por favor.
Por osvaldomp
#65376
Olá, @Acrianinho .

Veja se o arquivo anexo funciona aí. Se a fórmula retornar #N/D é porque a combinação ANO/SÉRIE e DISCIPLINA não foi encontrada na planilha DADOS.

Coloquei a fórmula que passei, mudei para cálculo Automático, apaguei a macro e alterei as fórmulas na planilha CAPA conforme comentei antes.

dica - aproveite pra ler o comentário sobre células mescladas ao final das minhas postagens.
Você não está autorizado a ver ou baixar esse anexo.
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