Retomando la entrada anterior del blog (ver, en la que se explicaba cuál era la regla aritmética que emplea Excel para calcular el factor de crecimiento/disminución al emplear la herramienta Series, veremos como realizar esta operación para un número indeterminado de rangos...
Esta explicación da respuesta a la cuestión planteada por un lector:
Veamos en la siguiente imagen el planteamiento:
Podemos ver en el rango C3:C25 una disposición de valores y celdas vacías a completar con valores secuenciales determinados por el valor de la última y siguiente celda con dato.
Al lado, en el rango E3:E25 vemos el resultado de ir ejecutando la herramienta Series, manualmente, rango a rango (rangos C5:C7, C7:C9, C11:C14, C15:C20 y C21:C25.
Así añadiremos nuestro código en un módulo de nuestro proyecto VBA:
Tras ejecutar nuestra macro podemos ver el resultado...
Esta explicación da respuesta a la cuestión planteada por un lector:
| Como podría hacer si mis valores no son correlativos, subieran y/o bajaran casi de forma aleatoria y el espacio entre ellos también es variable y tuviera que interpolar cogiendo el último valor (orden descendente) y el siguiente. Ejemplo 1 97 2 97 3 4 5 96 6 96 7 8 9 98 10 98 11 12 13 14 98 15 98 El tipo de interpolación es gradual, es decir, debería calcular la diferencia y dividir por el número de celdas, de tal modo que en el ejmplo anterior, de 97 pase a 96.6777, 96.333 y finalmente 96, que es el valor que ya disponemos. Cuando lo hago manual lo hace automáticamente si cojo la ultima celda con valores y la primera de la siguiente tanda...pero claro estamos hablando de miles de datos para cada archivo. |
Veamos en la siguiente imagen el planteamiento:
Podemos ver en el rango C3:C25 una disposición de valores y celdas vacías a completar con valores secuenciales determinados por el valor de la última y siguiente celda con dato.
Al lado, en el rango E3:E25 vemos el resultado de ir ejecutando la herramienta Series, manualmente, rango a rango (rangos C5:C7, C7:C9, C11:C14, C15:C20 y C21:C25.
Así añadiremos nuestro código en un módulo de nuestro proyecto VBA:
Sub CompletaSerieGradual()
Dim celda As Object
Dim paso As Double, Inicial As Double, Final As Double
Dim blancos As Long
'generamos una colección
Set unicos = New Collection
Set Rng = Range("C3:C25")
For Each celda In Rng
'determinamos las celdas en las que hay una ruptura
'es decir, cuando hay un salto
If (celda.Value <> "" And celda.Value <> celda.Offset(-1, 0).Value) _
Or (celda.Value <> "" And celda.Value <> celda.Offset(1, 0).Value) Then
'cuando encuentre un item repetido, daría un error
'que salvamos con la instrucción On Error Resume Next
On Error Resume Next
'por tanto, nuestra coleccion solo agrega elementos no repetidos
'y en concreto en qué celda se encuentra el nuevo elemento
unicos.Add celda.Address, CStr(celda.Address)
On Error GoTo 0
End If
Next celda
'Recorremos las celdas que determinan los rangos a analizar
For j = 1 To unicos.Count - 1
'damos valor de cálculo a nuestras variables
blancos = Application.WorksheetFunction.CountBlank(Range(unicos(j), Range(unicos(j + 1))))
Final = Range(unicos(j + 1)).Value
Inicial = Range(unicos(j)).Value
'trabajaremos sólo cuando el rango definido tenga celdas vacías intermedias
If blancos > 0 Then
paso = (Final - Inicial) / (blancos + 1)
'aplicamos la herramienta Series con un Step personalizado
Range(unicos(j), Range(unicos(j + 1))).DataSeries Rowcol:=xlColumns, _
Type:=xlLinear, Date:=xlDay, Step:=paso, Trend:=False
End If
Next j
End SubTras ejecutar nuestra macro podemos ver el resultado...




No hay comentarios:
Publicar un comentario
Nota: solo los miembros de este blog pueden publicar comentarios.