Problemas na função...
 
Notifications
Clear all

Problemas na função sumif

5 Posts
4 Usuários
0 Reactions
767 Visualizações
(@fhqa1991)
Posts: 2
New Member
Topic starter
 

Boa tarde!

Sou novo aqui no fórum e estou aprendendo aos poucos o VBA.

Não consigo achar o meu erro nessa função. Estou querendo pegar as informações de outra aba. "Info Contratos" e estou na aba "Contratos.

Function total_linhas() As Integer

Range("a1").Select
total_linhas = (Cells(Rows.Count, 1).End(xlUp).Row)

End Function

Sub calcpordia()

Dim i As Integer
Dim j As Integer
Dim linhas As Double
Dim k As Integer

linhas = total_linhas()

For i = 7 To linhas

For j = 11 To 741

If Cells(6, j) >= Cells(i, 9) And Cells(6, j) <= Cells(i, 10) Then
k = j + 21
Cells(i, j) = WorksheetFunction.SumIf(Sheets("Info. Contratos").Range(Cells(6, 4), Cells(2000, 4)), Cells(i, 2), Sheets("Info. Contratos").Range(Cells(6, k), Cells(2000, k)))

Else

Cells(i, j) = 0

End If

Next
Next

End Sub

 
Postado : 08/04/2016 9:38 am
fcarlosc
(@fcarlosc)
Posts: 453
Honorable Member
 

Olá amigo.
Dá uma olha em ("Info. Contratos") está com um espaço.

 
Postado : 08/04/2016 9:59 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde fhqa1991,

Seja bem vind(x) ao fórum!

Onde está dando erro e qual a mensagem do erro? De estrutura não vejo nada de errado.

Se não for ERRO propriamente dito, envia um breve modelo da planilha para eu simular aqui e me fala o que deveria acontecer.

Testa e me fala:

Option Explicit

Sub calcpordia()
Dim wb      As Workbook
Dim wsCont  As Worksheet
Dim wsInfo  As Worksheet
Dim linhas  As Double
Dim i       As Integer
Dim j       As Integer
Dim k       As Integer

    Set wb = ThisWorkbook
    Set wsCont = wb.Worksheets("Contratos")
    Set wsInfo = wb.Worksheets("Info. Contratos")

    linhas = wsCont.Cells(Rows.Count, 1).End(xlUp).Row
    
    For i = 7 To linhas
        For j = 11 To 741
            If wsCont.Cells(6, j).Value >= wsCont.Cells(i, 9).Value And _
               wsCont.Cells(6, j).Value <= wsCont.Cells(i, 10).Value Then
                k = j + 21
                wsCont.Cells(i, j).Value = Application.WorksheetFunction.SumIf( _
                              wsInfo.Range(wsInfo.Cells(6, 4), wsInfo.Cells(2000, 4)), _
                              wsCont.Cells(i, 2).Value, _
                              wsInfo.Range(wsInfo.Cells(6, k), wsInfo.Cells(2000, k)))
            Else
                wsCont.Cells(i, j) = 0
            End If
        Next
    Next
    
    Set wsCont = Nothing
    Set wsInfo = Nothing
    Set wb = Nothing

End Sub

Qualquer coisa da o grito.
Abraço

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 08/04/2016 10:17 am
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

Boa tarde, colegas.

Bem, enquanto estava analisando e preparando a resposta o Bernardo se adiantou e já matou o problema, então vou só complementar prá não perder o serviço.

O problema está em que, como vc não qualificou todos os intervalos, a origem dos dados virou um legítimo "balaio de gato". :P

Vamos analisar por exemplo a linha...

Cells(i, j) = WorksheetFunction.SumIf(Sheets("Info. Contratos").Range(Cells(6, 4), Cells(2000, 4)), Cells(i, 2), Sheets("Info. Contratos").Range(Cells(6, k), Cells(2000, k)))

Como vc relatou no início, vc está na planilha "Contratos", então ela é a planilha ativa, certo? Assim, todas as Cells e Ranges estarão se referindo a Contratos. Assim, nessa linha, as referências são:

Cells(i, j) -> Contratos
Cells(6, 4) -> Contratos (aqui é que está um dos erros, acredito, pois creio que vc quisesse se referir a Cells(6, 4) de "Info. Contratos", não é mesmo? Seria necessário qualificar Cells(6, 4) com o nome da planilha na frente, como fez o Bernardo)
Cells(2000, 4) -> Contratos (mesmo problema, teria que qualificar já que a planilha ativa é a Contratos. O Bernardo declarou uma variável para isso, o que facilita muito, senão vc teria que repetir Sheets("Info. Contratos").Cells(2000, 4))
Cells(i, 2) -> Contratos (aqui não sei se vc quis se referir a Contratos ou a Info. Contratos, suponho que esteja certo e seja Contratos mesmo)
Cells(6, k) -> Contratos (problema, idem)
Cells(2000, k) -> Contratos (problema, idem)

Portanto, caso vc não quisesse criar uma variável antes para qualificar os intervalos, teria que qualificar da forma mais trabalhosa, assim:

Cells(i, j) = WorksheetFunction.SumIf(Sheets("Info. Contratos").Range(Sheets("Info. Contratos").Cells(6, 4), Sheets("Info. Contratos").Cells(2000, 4)), Cells(i, 2), Sheets("Info. Contratos").Range(Cells(6, k), Sheets("Info. Contratos").Cells(2000, k)))

Mas é sempre vantagem usar a metodologia que o Bernardo usou, pois além do código ficar mais legível, menos susceptível ao erro e mais fácil de digitar, também minimiza o número de chamadas às referências dos objetos (contagem do número de pontos ".") o que torna o código mais rápido.

 
Postado : 08/04/2016 12:04 pm
(@fhqa1991)
Posts: 2
New Member
Topic starter
 

Bernardo

Cara.

Muito obrigado!! Seu código funcionou perfeitamente. Muito obrigado mesmo!
Me salvou aqui, sei nem como agradecer!

Estou estudando bastante tentando me aperfeiçoar, ainda estou muito iniciante, mas um dia espero poder ajudar os outros aqui deste modo!

Abração

Edson!

Muito obrigado pela aula. Vou tentar me aperfeiçoar ao máximo.

Até comprei VBA e Macros do Bill Jelen e Tracy Syrstad. Alguém me recomenda outro livro?

Abraços

 
Postado : 12/04/2016 11:51 am