Ranking de pontuaçã...
 
Notifications
Clear all

Ranking de pontuação

16 Posts
2 Usuários
0 Reactions
2,594 Visualizações
(@puretna)
Posts: 11
Active Member
Topic starter
 

Boa noite !
Sou novato no Excel e, principalmente, em VBA. Estou fazendo um ranking de pontuação no qual a cada mês (dispostos em colunas sucessivas) o valor da pontuação é acrescido em 8%. Ex: Janeiro: Pontos * 8%; Fevereiro: Pontos * 16% e assim sucessivamente........
Fiz uma macro assim:
Janeiro

Sub Calcular()
For Rownum = 3 To 50
        If Cells(Rownum, 2) = 0 Or Cells(Rownum, 2) = "" Then
        Cells(Rownum, 2) = ""
        Else
        coeficiente = 8 / 100
        Cells(Rownum, 2) = Cells(Rownum, 2) * (1 + coeficiente)
        End If
Next Rownum
End Sub

Fevereiro:
Sub Calcular1()
For Rownum = 3 To 50
        If Cells(Rownum, 3) = 0 Or Cells(Rownum, 3) = "" Then
        Cells(Rownum, 3) = ""
        Else
        coeficiente = 16 / 100
        Cells(Rownum, 3) = Cells(Rownum, 3) * (1 + coeficiente)
        End If
Next Rownum
End Sub.

Até que deu certo, só que eu teria que fazer vários botões, porque, na verdade, é mais de um ano. Pergunta: Teria como otimizar isso, pra não ter que fazer tantas sub rotinas, ou ainda não ter que fazer macro, sendo apenas atualizado automaticamente na planilha ao digitar um valor na célula (direto no Excel daria referência circular) ?

Desde já agradeço!

 
Postado : 12/05/2013 5:03 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa noite!!
Só com formulas não resolve?

Use a Pesquisa do fórum e a Biblioteca!

Tem como postar seu arquivo modelo compactado?

Att

 
Postado : 12/05/2013 5:11 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Pretna, se entendi corretamente, coloque a rotina abaixo na aba em que são efetuado os lançamentos, veja que na rotina defini os percentuais em Constantes, e utilizei a Instrução Select Case para realizar as ações conforme a coluna, range e valor, só coloquei 3 meses,m mas é só acrescentar os outros e ajustar os CASES :

Pelo codigo que postou, (If Cells(Rownum, 2)) estou supondo que a Coluna A não é digitado ou se é não é calculado nada.

    Option Explicit
    
    'Constantes definindo o percentual dos Meses
    Const pJan = 0.08
    Const pFev = 0.16
    Const pMar = 0.24


    Private Sub Worksheet_Change(ByVal Target As Range)
         
        Dim sCol
        Dim sRG
        Dim sVal

       
        sCol = Target.Column 'Qual coluna estou
        sRG = Target.Address(False, False) 'Qual Celulas estou
        sVal = Target.Value 'Qual Valor digitei
         
        'Instrução para se evitar loop infinito
        Application.EnableEvents = False
        
        'Executa as ações conforme o Case
        Select Case Target.Column
        
            Case 2 'Coluna B - Janeiro
                sVal = sVal * (1 + pJan)
                Range(sRG).Value = sVal
            
            Case 3 'Coluna C - Fevereiro
                sVal = sVal * (1 + pFev)
                Range(sRG).Value = sVal
            
            Case 4 'Coluna D - Março
                sVal = sVal * (1 + pMar)
                Range(sRG).Value = sVal
                
            Case Else
                Application.EnableEvents = True
                Exit Sub
             
        End Select
        
        Application.EnableEvents = True
       
    End Sub

Faça os testes e veja se é isto, qq duvida retorne.

[]s

 
Postado : 13/05/2013 6:16 am
(@puretna)
Posts: 11
Active Member
Topic starter
 

Mauro, cara.......perfeito! :D
Quer dizer, só um pequeno problema: na linha 2 da planilha devo colocar os meses, e dá erro, já que toda a coluna está marcado pra retornar um cálculo, tentei corrigir por conta, mas sem sucesso............Só resolvendo esse pequeno problema e a planilha ficará perfeita!.
Desde já agradeço e obrigado por compartilhar seu conhecimento.

 
Postado : 13/05/2013 12:10 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Supondo que os calculos serão feitos sempre que se digitar da linha 3 para baixo ignorando a digitação nas linhas 1 e 2, acrescente as linhas abaixo :

Dim sLin
sLin = Target.Row 'Qual linha estou

'Esta isntrução antes da captura da Coluna (sCol)
If sLin < 3 Then Exit Sub

sCol = Target.Column 'Qual coluna estou

...............

[]s

 
Postado : 13/05/2013 1:00 pm
(@puretna)
Posts: 11
Active Member
Topic starter
 

Eu tava usando entirerow :D
Perfeito Mauro, Obrigado!

Sem querer abusar,só pra entender pesquisei sobre o código target.address (false, false) o false,false tem a ver com referências relativas, e o target.adress, por padrão, retornaria uma referência absoluta. É isso ? Por exemplo, target.address sem os falses, eu teria que retornar uma célula ou um intervalo específico, por exemplo $a$1 ? E é necessário usar o target.value e target.Address simultaneamente ? Obrigado

 
Postado : 13/05/2013 3:55 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Puretna, de fato tem haver com as referencias Absolutas e Relativas, por padrão Target pega o Valor digitado, se rodar a rotina passo a passo utilizando a tecla F8, em cada passo que avançar coloque o cursor do Mouse em cima das váriaveis e será mostrado o valor das mesmas.

a expressão Target.Address(False, False), poderia ser escrita sem os Falses ou Target.Address(0, 0) ou ainda Target.Address(True, True) ou em combinações (0,1) - (1,1)....
Depende muito de como iremos utilizar o resultado, que dependendo do endereço captado teremos erro se definirmos de uma maneira que outra propriedade não aceite.

Quanto a : usar o target.value e target.Address simultaneamente ? é possivel para obtermos informação, podemos utilizar em uma mensagem por exemplo a expressão : MsgBox "Value de " & Target.Address & " é " & Target.Value mas se defiinir a Variavel da meneira abaixo :
sVal = Target.Address & Target.Value o resultado será o endereço e o valor, e somente, não podendo utilizar este resultado em uma expressão decalculo, e sim só de informação.
Finalizando :
Address = Endereço da Celula
Row = a linha
Value = o Valor

[]s

 
Postado : 13/05/2013 6:02 pm
(@puretna)
Posts: 11
Active Member
Topic starter
 

Tirei um tempinho pra estudar o código, Mauro. Realmente, fiz alguns testes com o Target.Address pra entender melhor inclusive o msgbox indicado por vc, deu pra entender bem.
Outra dúvida que tinha era, como o Target.column já havia sido declarado para todos os case, e o (sval) já tinha sido declarado como target.value, não seria necessário o código: Range(target.address).value =sval, mas é necessário especificar sim. Dúvidas de newbie :D
Obrigado mais uma vez

 
Postado : 15/05/2013 10:45 am
(@puretna)
Posts: 11
Active Member
Topic starter
 

Sem querer abusar :D , por exemplo se entregar essa planilha à outra pessoa e esta quiser modificar algo como inserir dados em qualquer linha, aleatóriamente(na planihla original está marcado para ignorar cálculos nas linhas 1 e 2) tem como definir isso ?
tentei algumas códigos, mas sem sucesso ?
Obrigado!

 
Postado : 17/05/2013 4:00 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Sem querer abusar :D , por exemplo se entregar essa planilha à outra pessoa e esta quiser modificar algo como inserir dados em qualquer linha, aleatóriamente(na planihla original está marcado para ignorar cálculos nas linhas 1 e 2) tem como definir isso ?
tentei algumas códigos, mas sem sucesso ?
Obrigado!

Pela forma que está desenhada a rotina, a mesma irá rodar conforme definiu-se nos Case quanto as linhas iniciais a ignorar e as colunas que ao receberem algum valor deverá fazer o calculo.

Lógicamente, podemos atribuir atraves de algumas condições (IFs) alguns intervalos a serem ignorados, mas para isto teriamos de defini-los, não podendo ser aleatório, podemos definir somente uma área, um determinado conjunto de ranges, mas tem de ter os parametros definidos.

[]s

 
Postado : 17/05/2013 5:05 pm
(@puretna)
Posts: 11
Active Member
Topic starter
 

Então nao teria como eu digitar um código ' se eu digitar na céula (independente da célula) em que estou for texto saia da rotina' ?

 
Postado : 17/05/2013 5:39 pm
(@puretna)
Posts: 11
Active Member
Topic starter
 

Então nao teria como eu digitar um código ' se o que eu digitar na célula (independente da célula) em que estou for texto então saia da rotina' ?

Corrigindo o post :D

 
Postado : 17/05/2013 6:14 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Então nao teria como eu digitar um código ' se eu digitar na céula (independente da célula) em que estou for texto saia da rotina' ?

Como eu disse antes, existem formas de definirmos o que queremos, só que no post anterior você disse se se digitarem aleatoriamente, não citou que se digitar um "texto" em vez de numero.

Se for esta a questão, é só colocarmos uma outra condição logo no inicio da rotina para verificar se o que foi digitado é Valor Numérico ou não, se Numerico a rotina continua se não sai sem executar nada ou direcionarmos atravez da instrução GO TO para outra rotina.
O ideal é você ter em mente todas as possibilidades que poderão interferir em seu projeto para depois montar uma rotina ideal, é mais fácil fazer desde o inicio cercando todas as possibilidades do que ter de ficar ajustando a cada nova possibilidade.

[]s

 
Postado : 17/05/2013 6:16 pm
(@puretna)
Posts: 11
Active Member
Topic starter
 

Entendi. Estava pensando na possibilidade de entregar essa planilha à outra pessoa, e esta resolva preencher outras linhas com meses, por exemplo, se o banco de dados for muito extenso.
Obrigado, Mauro ! Ajudou bastante.

 
Postado : 17/05/2013 6:27 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Só para seu entendimento, a rotina abaixo verifica se o valor digitado em A1 é Numerico ou Texto :

Sub Teste_Se_e_Numero()

    Dim sValor
    
    sValor = Range("A1")
    
    If Not IsNumeric(sValor) Then
    
        MsgBox "O Valor em A1não é Numerico"
        
    Else
    
        MsgBox "O Valor em A1 é Numerico"
    
End If

Podemos utilizar a Expressão com o Operador Not ou sem ele, ficando assim:

If IsNumeric(sValor) Then

A diferença é só na sequencia, ou seja com o Operador "Not" irá ser executo o primeiro MSGBOX e sem o contrario.

[]s

 
Postado : 17/05/2013 6:33 pm
Página 1 / 2