Macro, obtener dato según su valor de lista de datos

Hola prozac te quería pedir ayuda con un problema que tengo en excel, mira te cuento como se aprecia en la imagen, cuando una central tiene la column.QUEDA en 0, el valor de la column. COSTO, se encuentra vacía y lo que necesito es que cuando la column. COSTO esté vacía, buscar en la lista una central que se encuentre mas arriba y que no tenga su column.COSTO vacía.El problema es que la lista tiene los valores de las centrales cada cierto tiempo por lo que una central puede salir por ejemplo en la fila 4 con 400, pero al cabo de minutos u horas puede quedar mas abajo en la fila 10 con valor 0, lo q implica que el valor de la column. COSTO estará vacío, por lo que se repiten nombres de las centrales. Así necesito una formula que busque en la lista la central mas próxima (hacia arriba) que no tenga su column. COSTO vacía,pero que tampoco se haya ido a 0 su potencia entregada. Ojalas se entienda, sino, me preguntan que cosa no quedo clara.
LINK IMAGEN: http://www.subirimagenes.com/privadas-d-1818774.html


Me despido atento a tu ayuda y de antemano muchas gracias por la voluntad.


Saludos.

1 Respuesta

Respuesta
1

No estoy seguro de entender bien lo que necesitas. Cuando dices buscar una central que no tenga a 0 su potencia entregada ¿te refieres a valores anteriores? En los valores actuales siempre que Costo esté vacío, su potencia está a cero.

Reformulando la cuestión. Si buscas una central hacia arriba que tenga costo no vacío a partir de una central con costo vacío, simplemente buscas la central más próxima en el tiempo que ha entregado potencia. Basta con buscar un valor no 0 encima de un 0 o un no vacío sobre un vacío. Sin embargo intuyo por tu explicación que además hay otra condición y es que no haya tenido un cero en la lista anteriormente. ¿Es asi?

La solución pasaría por mantener de alguna manera la lista de centrales y marcar las que han ido a cero y a la hora de buscar, escoger una que no esté en la lista. ¿Es posible usar VBA o tiene que ser con fórmulas?

Exactamente eso es lo que necesito. En cuanto a la ayuda, puede ser como a ti te acomode más (lo mas simple), si al final de cuentas me estas haciendo un favor :D.

Saludos y gracias de antemano.

Bueno yo lo he hecho con VBA porque me apaño mejor, aunque casi seguro que se puede hacer con formulas array. Ve al editor de VBA (Alt+F11) inserta un módulo (Insert/Module) y copia el siguiente código.

Option Explicit
Sub CalculaCentrales()
Dim r As Range
Dim s As Range
'Borro el rango k excepto cabecera (aunque luego se machaca con el filtro)
Range("k5", Range("k5").End(xlDown)).Clear
'Copia las centrales únicas a K
'Empieza en D4, porque este filtro usa la fila de cabecera y si D4 está repetida no la
'consideraría
'en D4 debe haber texto de cabecera que se copia además en K4
Set r = Range("D4", Range("D4").End(xlDown))
r.AdvancedFilter Action:=xlFilterCopy, _
 CopyToRange:=Range("K4"), Unique:=True
Set s = Range("K5", Range("K5").End(xlDown))
'Recorre la lista de D y marca en rojo en K las que tienen 0
Call ColoreaK(r, s)
'Marca en D los que estan en rojo en K
Call MarcaRojos(s, r)
'Marca los verdes según los ceros y los que están en rojo
Call ColoreaD(s)
End Sub
Sub ColoreaK(r As Range, s As Range)
'Colorea en rojo las centrales del rango r(K) que tienen 0 en s(D)
Dim c As Range
Dim d As Range
For Each c In r 'como r tiene cabecera se da una vuelta inutil
 If Cells(c.Row, 7).Value = 0 Then 'tiene un cero
 For Each d In s
 If c.Value = d.Value Then 'es la que busco
 d.Font.ColorIndex = 3
 Exit For 'y salgo ya que no hay mas
 End If
 Next d
 End If
Next c
End Sub
Sub MarcaRojos(s As Range, r As Range)
'Colorea en s los rojos de r
Dim c As Range
Dim d As Range
For Each c In r
 For Each d In s
 If (d.Font.ColorIndex = 3) And (c.Value = d.Value) Then 'es la misma y la coloreo
 c.Font.ColorIndex = 3
 End If
 Next d
Next c
End Sub
Sub ColoreaD(r As Range)
'Colorea en verde las siguientes que no estan a 0 ni en rojo
Dim i As Integer
Dim j As Integer
Dim max As Integer
max = r.End(xlDown).Row + 4
For i = max To 5 Step -1
 If Cells(i, 7).Value = 0 Then 'esta a cero
 For j = i To 5 Step -1
 If (Cells(j, 4).Font.ColorIndex <> 3) And _
 (Cells(j, 4).Value <> 0) Then 'me vale y la pongo verde
 Cells(j, 4).Font.ColorIndex = 4
 Exit For
 End If
 Next j
 End If
Next i
End Sub

La macro a ejecutar es CalculaCentrales y puedes ejecutarla manualmente, asociándola a una tecla o cuando haya un cambio en los datos de la columna D de la hoja actual. Esto último, quizá algo más complejo se hace introduciendo en la hoja, no en el módulo antes creado el código a continuación. Para introducir código en la hoja, seleccionala en el panel izquierdo del editor de VBA, pulsa el botón derecho y escoge View Code. En la parte derecha la ventana en blanco es para copiar lo siguiente:

Private Sub Worksheet_Change(ByVal target As Range)
Application.EnableEvents = False
If Not Intersect(target, Range("D:D")) Is Nothing Then
 ' si ha cambiado D calculo las centrales
 Call CalculaCentrales
End If
Application.EnableEvents = True
End Sub

Es posible que tengas que adaptar algo tu código.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas