Usuário com melhor resposta
Inerpolação

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
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
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
-
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
-
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
-
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