none
Inerpolação RRS feed

  • Pergunta

  • Pessoal, preciso dos colegas.

    Não estou conseguindo postar nem um tipo de imagem por isso vou tentar fazer-me entedido.

    Tenho uma sequência de valores (na coluna "A"), mais precisamente, um número a cada seis células, sendo que a frequência (quantidade) desses números podem variar. Imaginem que esses valores pertencem sempre ao dia de domingo  e os outros dias estão vazios.

    Hoje eu consigo isto com uma fórmula de interpolação linear, só que, como a rotina se dá de forma bastante rotineira, pensei num código que viabilizasse este trabalho.

    Até achei alguns códigos na net, mas confeço que não consegui assimilá-los.

    Caso possão me ajudar eu agradeço.


    oreste.jr@gmail.com

    quarta-feira, 17 de outubro de 2012 19:12

Respostas

  • Adaptando para seu caso:

    Sub Exemplo()
        Dim ws As Worksheet
        Dim lRow As Long
        Dim lLast As Long
        Dim lFirst As Long
        Dim lInício As Long
        
        Set ws = ActiveSheet
        With ws
            lRow = 1
            Do
                lRow = lRow + 1
            Loop While .Cells(lRow, "A") = ""
            lFirst = lRow
            lLast = RowLast(.Columns("A"))
            For lRow = lFirst + 1 To lLast
                If .Cells(lRow, "A") = "" Then
                    lInício = lRow
                    Do
                        lRow = lRow + 1
                    Loop While .Cells(lRow, "A") = "" And lRow <= lLast
                    .Cells(lInício, "A").Offset(-1).Resize(lRow - lInício + 2).DataSeries Rowcol:=xlColumns _
                    , Type:=xlLinear _
                    , Trend:=True
                End If
            Next lRow
        End With
    End Sub
    
    Function RowLast(rng As Range) As Long
        'Retorna o número da última linha povoada do intervalo rng
        With rng
            On Error Resume Next
            RowLast = .Find(What:="*" _
              , After:=.Cells(1) _
              , SearchDirection:=xlPrevious _
              , SearchOrder:=xlByColumns _
              , LookIn:=xlValues).Row
            If RowLast = 0 Then RowLast = rng.Cells(1).Row
        End With
    End Function


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    • Marcado como Resposta orestejunior sexta-feira, 19 de outubro de 2012 01:50
    sexta-feira, 19 de outubro de 2012 01:15
    Moderador

Todas as Respostas

  • Sub Exemplo()
        Dim ws As Worksheet
        Dim lRow As Long
        Dim lLast As Long
        Dim lInício As Long
        
        Set ws = ActiveSheet
        With ws
            'Apenas para não permitir que a primeira célula esteja em branco e não gere um erro
            If .Range("A1") = "" Then .Range("A1") = 0
            
            lLast = .Cells(.Rows.Count, "A").End(xlUp).Row
            For lRow = 1 To lLast
                If .Cells(lRow, "A") = "" Then
                    lInício = lRow
                    Do
                        lRow = lRow + 1
                    Loop While .Cells(lRow, "A") = ""
                    .Cells(lInício, "A").Offset(-1).Resize(lRow - lInício + 2).DataSeries Rowcol:=xlColumns _
                    , Type:=xlLinear _
                    , Trend:=True
                End If
            Next lRow
        End With
    End Sub


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    quarta-feira, 17 de outubro de 2012 21:44
    Moderador
  • Felipe, mais uma vêz obrigado.

    Eu enviei o arquivo para você ter uma idéia melhor da bagunça que estou arrumando.

    Estou gostando muito, pois sinto que estou me familiarizando mais com o VBA. Sei também que falta muito.

    Só está dando um probleminha no "

    Loop While .Cells(lRow, "A") = ""

    Se você puder dar uma modificada no código para ele interpolar apartir do primeiro valor encontrado eu agradeço.

    Valeu.

    http://www.sendspace.com/file/ethdvw


    oreste.jr@gmail.com

    quinta-feira, 18 de outubro de 2012 16:09
  • Adaptando para seu caso:

    Sub Exemplo()
        Dim ws As Worksheet
        Dim lRow As Long
        Dim lLast As Long
        Dim lFirst As Long
        Dim lInício As Long
        
        Set ws = ActiveSheet
        With ws
            lRow = 1
            Do
                lRow = lRow + 1
            Loop While .Cells(lRow, "A") = ""
            lFirst = lRow
            lLast = RowLast(.Columns("A"))
            For lRow = lFirst + 1 To lLast
                If .Cells(lRow, "A") = "" Then
                    lInício = lRow
                    Do
                        lRow = lRow + 1
                    Loop While .Cells(lRow, "A") = "" And lRow <= lLast
                    .Cells(lInício, "A").Offset(-1).Resize(lRow - lInício + 2).DataSeries Rowcol:=xlColumns _
                    , Type:=xlLinear _
                    , Trend:=True
                End If
            Next lRow
        End With
    End Sub
    
    Function RowLast(rng As Range) As Long
        'Retorna o número da última linha povoada do intervalo rng
        With rng
            On Error Resume Next
            RowLast = .Find(What:="*" _
              , After:=.Cells(1) _
              , SearchDirection:=xlPrevious _
              , SearchOrder:=xlByColumns _
              , LookIn:=xlValues).Row
            If RowLast = 0 Then RowLast = rng.Cells(1).Row
        End With
    End Function


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    • Marcado como Resposta orestejunior sexta-feira, 19 de outubro de 2012 01:50
    sexta-feira, 19 de outubro de 2012 01:15
    Moderador
  • Muito bom.

    Isto me faz lembrar uma frase que dizia mais ou menos  assim:

    "Se não sabes VBA, você sabe no máximo 5% de Excel."

    Acho que é por aí.

    Vou estudar o código que me enviaste e continuar incrementando-o. A ideia é unificar tudo, inclusive o procv.

    Mas isto é assunto para estudo. 

    Muitíssimo obrigado.


    oreste.jr@gmail.com

    sexta-feira, 19 de outubro de 2012 01:58