Realizó un usuario una consulta curiosa, y tras algunas investigaciones por la red encontré una respuesta adecuada.
El lector quería realizar un gráfico de barras, condicionando el color de las barras al valor asociado, mediante un código de VBA:
Partiremos de una Tabla de datos, y un gráfico ya construido; se trata entonces de que cada vez que cambiemos los valores en nuestra tabla de datos, el color de las barras cambie de un color (rojo) a otro (azul) según sea mayor o menor a 2,4.
El gráfico se ha llamado '1 Gráfico', además incorporaremos la programación adecuada para que el gráfico se actualice cada vez que la Tabla de datos se modifica, mediante la instrucción worksheet_change(ByVal target As Range) incluida en la 'Hoja1' desde la que trabajaremos (es muy importante editar nuestro código dentro de la 'Hoja1', no dentro de un Módulo del Editor de VBA !!!).
Nuestro código será entonces:
... y listo, cada vez que cambiemos un valor en la Hoja, y en concreto dentro de la Tabla de datos, se asignará el color rojo o azul si es mayor o menor que 2.4.
El lector quería realizar un gráfico de barras, condicionando el color de las barras al valor asociado, mediante un código de VBA:
...referente a la posibilidad de realizar un gráfico condicional utilizando VBA. Necesito los gáficos de barras en los que las barras sean de un color si su valor es mayor a un valor (2,4) y de otro color si su valor es menor a 2,4... |
Partiremos de una Tabla de datos, y un gráfico ya construido; se trata entonces de que cada vez que cambiemos los valores en nuestra tabla de datos, el color de las barras cambie de un color (rojo) a otro (azul) según sea mayor o menor a 2,4.
El gráfico se ha llamado '1 Gráfico', además incorporaremos la programación adecuada para que el gráfico se actualice cada vez que la Tabla de datos se modifica, mediante la instrucción worksheet_change(ByVal target As Range) incluida en la 'Hoja1' desde la que trabajaremos (es muy importante editar nuestro código dentro de la 'Hoja1', no dentro de un Módulo del Editor de VBA !!!).
Nuestro código será entonces:
'ejecuta macro al modificar alguna celda en la Hoja1 Sub worksheet_change(ByVal target As Range) 'definimos las variables que emplearemos en el desarrollo de la macro Dim Pto As Long Dim Val As Variant Dim nombrehoja, rangocelda As String 'asignamos a las variables nombrehoja y rangocelda un valor nombrehoja = ActiveSheet.Name rangocelda = ActiveCell.Address 'el siguiente código controla el valor de cada barra de nuestro gráfico 'y le asigna un color (rojo o azul) ActiveSheet.ChartObjects("1 Gráfico").Activate With ActiveChart.SeriesCollection(1) Val = .Values For Pto = 1 To UBound(Val) If Val(Pto) <= 2.4 Then .Points(Pto).Interior.Color = RGB(255, 0, 0) Else: .Points(Pto).Interior.Color = RGB(0, 0, 255) End If Next Pto End With 'termina la macro devolviéndonos a una celda activa de la Hoja de cálculo activa Sheets(nombrehoja).Range(rangocelda).Select End Sub |
... y listo, cada vez que cambiemos un valor en la Hoja, y en concreto dentro de la Tabla de datos, se asignará el color rojo o azul si es mayor o menor que 2.4.
Eres un fenomeno!!!!!!!!!!!!!
ResponderEliminarNo esperaba tan pronto la solucion
La probaré y os comento a todos
Gracias por el aporte
"El Novato"
Hola yo necesito ayuda con algo parecido. Quien me puede ayudar? por favorrrr
EliminarHola,
Eliminarsi planteas tu pregunta, y cuánto de parecido es a lo explicado, quizá pueda darte una respuesta.
Slds
Una muy buena solución para esta cuestión
ResponderEliminarGracias por el aporte
funciona a las milmaravillas
Una excelente solución doctor
ResponderEliminarEl trabajo y por tanto la enhorabuena es para ExcelForo que como dije antes ¡Es un fenomeno!
ResponderEliminarTe garantizo funciona a la perfección.
Busqué opciones por la web y encontré alguna pero ninguna como esta.
En realidad es una gran ayuda Excelforo muchas muchas gracias,
ResponderEliminarHola, Hola quisiera saber si me puedes ayudar a crear una macro que me ayude a realizar bases de datos como para poder buscar Nombres dentro de ella.. si Por favor Gracias
ResponderEliminarJanina,
ResponderEliminarLamento responderte tan tarde... pero me ha sido imposible por motivos personales hacerlo hasta hoy.
Realmente no necesitas una macro para esto, existe una herramienta estandar en Excel, llamada formulario (ver ejemplo), que te permitirá no solo crear tu base de datos, si no también a realizar búsquedas o filtros sobre los diferentes campos que tenga tu base de datos.
Un saludo y disculpa de nuevo mi tardanza.
Me dice que no encuentra "ChartObjects" :S ¿Qué puede ser eso?
ResponderEliminarHola Exar-Kun,
ResponderEliminardebes asegurarte que el gráfico que exista en tu hoja de cálculo se llame igual que en código VBA, en mi caso '1 Gráfico'.
Slds
Gracis por el aporte, funciona perfecto aunque en mi caso mi gráfica tiene 3 series y no se como indicar que las barras que cambiarán de color son las de la tercera serie pues siempre colorea las de la primera.
ResponderEliminarGracias de nuevo. Ya solucioné mi problema.
ResponderEliminarPerfecto!!
Eliminartambién puedes revisar esta otra forma
http://excelforo.blogspot.com.es/2010/11/grafico-de-barras-en-excel-condicionado.html
Un saludo
Hola
EliminarAl igual que Gonzalo, tengo varias series y no se cómo indicarlas, me ayudarías? Parece que ya le respondiste pero no encuentro el comentario con la respuesta. Muchas gracias!
Att: Laura Barajas
Hola Laura,
Eliminarla clave es variar en esta intrucción
ActiveChart.SeriesCollection(1)
el 1 por cada una de las tres series.
Podrías incluir un FOR..NEXT por encima del de los Points para que recorra cada Serie y cada punto de la serie.
For serie=1 to 3
With ActiveChart.SeriesCollection(serie)
Val = .Values
For Pto = 1 To UBound(Val)
If Val(Pto) <= 2.4 Then
.Points(Pto).Interior.Color = RGB(255, 0, 0)
Else: .Points(Pto).Interior.Color = RGB(0, 0, 255)
End If
Next Pto
End With
Next serie
Te debería funcionar.
Slds
Mil gracias!! Funcionó perfecto y se simplifica más el código porque son varias series.
EliminarSaludos,
Laura
;-)
EliminarSlds
Hola, me resultò muy ùtil tu aporte para una gràfica que debo hacer, pero querìa saber como cambiar el còdigo para ponre màs colores,
ResponderEliminardigamos:
entre 0 y 1 azul
entre 1.1 y 2 naranja
y asì
y si se puede que los datos a checar en el VBA sean otros y no los que se usan en la gràfica
Hola David,
Eliminarsi, claro, es posible definir más posibilidades para los rangos de cantidades.
Tendrías que añadir más condiciones IF para cubrir todas las opciones, algo del estilo
IF Val(Pto) > 0 AND Val(Pto) <=1 then .Points(Pto).Interior.Color = RGB(255, 0, 0)
else if Val(Pto) >1 AND Val(Pto)<=2 then .Points(Pto).Interior.Color = RGB(0, 255, 0)
Else: .Points(Pto).Interior.Color = RGB(0, 0, 255)
end if
sólo cambia los valores de la función RGB(rojo, verde, azul).
Esa misma estructura serviría para otros casos en los que los valores sean diferentes a los de la gráfica.
Slds
Quise realizar este ejemplo sin embargo no me funcionó por mas que intente, solo me sirvió el ejemplo inicial. Lo que quiero es que la barras cambien en 3 condicionante: color rojo si tiene valores entre 0-79, amarillo si tiene valores entre 80-89 y verde si tiene valores entre 90-100 o mas. te adjunto el archivo a tu correo para que me lo modifique, lo tengo hasta el primer ejemplo que nos pusiste al inicio. de ante mano te agradezco la ayuda
EliminarHola Randall,
Eliminarte he contestado a través del correo que me has mandado, adjuntado la solución (una mendiante SELECT CASE y otra añadiendo más condiciones IF THEN)
Slds
GRACIAS ME FUNCIONO DE LAS 2 MANERA AL 100%
EliminarDEJO EL CODIGO PARA LOS QUE ANDAN BUSCANDO LO MISMO QUE YO:
CON LA OPCION IF THEN:
'ejecuta macro al modificar alguna celda en la Hoja1
Sub worksheet_change(ByVal target As Range)
'definimos las variables que emplearemos en el desarrollo de la macro
Dim Pto As Long
Dim Val As Variant
Dim nombrehoja, rangocelda As String
'asignamos a las variables nombrehoja y rangocelda un valor
nombrehoja = ActiveSheet.Name
rangocelda = ActiveCell.Address
'el siguiente código controla el valor de cada barra de nuestro gráfico
'y le asigna un color (rojo o azul)
ActiveSheet.ChartObjects("1 Gráfico").Activate
With ActiveChart.SeriesCollection(1)
Val = .Values
For Pto = 1 To UBound(Val)
If Val(Pto) <= 79 Then .Points(Pto).Interior.Color = vbRed
If Val(Pto) > 79 And Val(Pto) <= 89 Then .Points(Pto).Interior.Color = vbYellow
If Val(Pto) > 89 Then .Points(Pto).Interior.Color = vbGreen
Next Pto
End With
'termina la macro devolviéndonos a una celda activa de la Hoja de cálculo activa
Sheets(nombrehoja).Range(rangocelda).Select
End Sub
CON LA OPCION SELECT:
'ejecuta macro al modificar alguna celda en la Hoja1
Sub worksheet_change(ByVal target As Range)
'definimos las variables que emplearemos en el desarrollo de la macro
Dim Pto As Long
Dim Val As Variant
Dim nombrehoja, rangocelda As String
'asignamos a las variables nombrehoja y rangocelda un valor
nombrehoja = ActiveSheet.Name
rangocelda = ActiveCell.Address
'el siguiente código controla el valor de cada barra de nuestro gráfico
'y le asigna un color (rojo o azul)
ActiveSheet.ChartObjects("1 Gráfico").Activate
With ActiveChart.SeriesCollection(1)
Val = .Values
For Pto = 1 To UBound(Val)
Select Case Val(Pto)
Case Is <= 79: .Points(Pto).Interior.Color = vbRed
Case 79 To 89: .Points(Pto).Interior.Color = vbYellow
Case Else: .Points(Pto).Interior.Color = vbGreen
End Select
Next Pto
End With
'termina la macro devolviéndonos a una celda activa de la Hoja de cálculo activa
Sheets(nombrehoja).Range(rangocelda).Select
End Sub
Muchas gracias Randall...
Eliminarla verdad, tendría que haberlo subido yo mismo ;-)
Deben ser los años je, je..
Un cordial saludo
Este comentario ha sido eliminado por el autor.
Eliminarok, muchas gracias
ResponderEliminarpero a lo otro que me referìa era que tengo ventas diarias en una gràfica y una tabla; y en otra tabla en la misma hoja tengo causas posibles por las cuales las ventas fueron bajas ese dìa:
por ejemplo
1.-no vino (azul)
2.- mal clima (rojo)
etc
querìa saber si es posible que los colores de la gràfica de ventas diaria esten condicionados por los datos que aparecen en la otra tabla
Hola David,
Eliminaren principio parece posible.
Habría que definir una variable de color en función a los valores de la otra tabla:
if valor tabla = xxx then variable1=RGB(0;0;255)
if valor tabla = yyy then variable1=RGB(0;255;255)
etc
para luego usar esas variables condicionadas de color para los valores del gráfico,
IF Val(Pto) > 0 AND Val(Pto) <=1 then .Points(Pto).Interior.Color = variable1
Slds
Ok, muchas gracias
ResponderEliminarpero entonces el rango de celdas donde viene que color poner le asigno un nombre, digamos condicion, y en VBA pongo:
if condicion = xxx then variable1=RGB(0;0;255)
no se mucho de macros, por eso te pregunto, aparte estoy usando otro macro con el cual la gràfica muestra solo las ventas del vendedor actualmente seleccionado
¿Los dos còdigos se pueden poner en el mismo Private Sub Worksheet_SelectionChange(ByVal Target As Range)?
muchas rgacias y disculpa las molestias
ya probe los dos programas juntos y si funcionan
ResponderEliminarPerfecto David,
Eliminarme alegro te haya funcionado.
disculpa tú, pero a veces las preguntas que realizáis son demasiado generales, sobre todo cuando delante no tienes el código ni la plantilla de la hoja para poder comprender exactamente las cuestiones planteadas.
Un cordial saludo
enterado, querìa poner el archivo, pero no veo el botòn para adjuntar archivos, o te lo mando a tù correo?
ResponderEliminarHola David,
Eliminarno es posible adjuntar ficheros en los comentarios de Blogger.
Si necesitas algo más concreto y prefieres adjuntar un fichero excel con un ejemplo, puedes enviarlo a
excelforo@gmail.com
Slds
Este comentario ha sido eliminado por el autor.
ResponderEliminarAL momento de poner en rango de celda pongo asi BO17: BR17 as string, pero me marca error de statement invalid outside type block, de que otra manera puedo declarar el rango
ResponderEliminarSaludos y gracias
Hola Rossy,
Eliminarlos rangos es mejor definirlos como variable tipo Range.
Por ejemplo,
Dim rng as Range
rng=range("BO17:BR17")
Slds
Hola queria saber si es posible adaptar la macro para cuando encuentre dos datos de texto iguales les pnga el mismo color si no, de diferentes colores. Gracias
ResponderEliminarHola,
Eliminarsi no son muchos los puntos de la Serie de datos, se podría hacer con un doble FOR.
For Pto = 1 To UBound(Val)
For Pto2=1 to UBound(Val)
If Val(Pto) = Val(Pto2) Then
.Points(Pto).Interior.Color = RGB(255, 0, 0)
Else: .Points(Pto).Interior.Color = RGB(0, 0, 255)
End If
Next Pto2
Next Pto
Slds
Estimado
ResponderEliminarMi consulta es la siguiente ¿Cómo puedo programar en una hoja de excel que dadas ciertas condiciones aparezca o no un gráfico? Trabajo en una base de datos que genera gráficos automáticamente con la que confecciono un informe modelo pero no en todas las hojas necesito todos los gráficos.
Hola,
Eliminartendrías que verificar la condición que sea con:
IF condición THEN
'dependiendo de lo que quieras
'hace visible el gráfico 1
ActiveSheet.ChartObjects("1 Gráfico").Visible = True
'oculta el gráfico 1
ActiveSheet.ChartObjects("1 Gráfico").Visible = False
END IF
Slds
Hola:
ResponderEliminartengo una tabla con tres columnas(nombre, f, acum), lo he graficado como barras (nombre en "x" y f en "y"), sin embargo quiero lograr colorear deacuerdo a un criterio de la columna "acum", como lo hago?
Hola Arturo,
Eliminarpuedes optar por emplear una macro como la que explico en este mismo post, o bien hacerlo sin macros como comento en
http://excelforo.blogspot.com.es/2010/11/grafico-de-barras-en-excel-condicionado.html
Sólo tienes que modificar mínimamente la condición...
lo más sencillo sería la segunda opción, haciendo las fórmulas condicionales según el criterio de la columna 'acum'.
Slds
Buenas tardes si deseo que tenga efecto sobre mas de una serie como debo hacer,son 5 series
ResponderEliminarHola,
Eliminarsi son sólo 5 seríes, podrías hacer en la misma macro esta pequeña adaptación:
for i=1 to 5
With ActiveChart.SeriesCollection(i)
Val = .Values
For Pto = 1 To UBound(Val)
If Val(Pto) <= 2.4 Then
.Points(Pto).Interior.Color = RGB(255, 0, 0)
Else: .Points(Pto).Interior.Color = RGB(0, 0, 255)
End If
Next Pto
End With
Next i
Te debería funcionar sin problemas...
Espero te sirva
Slds
Me ha servido perfecto,si quisiera rizar el rizo y que en la tabla cambiara el color en funcion de un punto tipo (x,y)es decir cin dos coordenadas?
Eliminarmuchas gracias
Hola,
Eliminarsupongo hablamos de un gráfico de dispersión...
en ese caso te recomendaría emplearas inicialmente el asistente para ver qué código genera para este tipo de gráfico, y así poder actuar sobre él.
El problema de los gráficos es que cada tipo tiene sus particularidades, y al final para modificarlo desde VBA o te dedicas en exclusiva a programar o no te queda más remedio que probar...
Si quieres, tras probar, puedes enviarme un ejemplo a
excelforo@gmail.com
y le echo un vistazo, e intento darte una solución.
Slds cordiales
me referia a un grafico de bolas en el qeu cuando una valor este por debajo de una zona del eje x,y la bola cambie de color
EliminarLo dicho...
Eliminarpero en esencia sería lo mismo que la entrada...
buenas tardes, estoy creando dos diagramas de barras desde vb, pero me los dibuja en la misma area,
ResponderEliminarnecesito las dos gráficas en la misma hoja, el codigo es este
Set chartsTemp = ActiveSheet.ChartObjects
If chartsTemp.Count > 0 Then
chartsTemp(chartsTemp.Count).Delete
End If
Set D3 = Range(Cells(15, 169), Cells(15, 181))
Set D6 = Range(Cells(celda + 1, 169), Cells(celda + 1, 181))
Set D7 = Range(Cells(15, 169), Cells(15, 181))
Set D8 = Range(Cells(celda + 1, 169), Cells(celda + 1, 181))
'ActiveSheet.ChartObjects(1).Activate
'ActiveSheet.ChartObjects("Grap").Activate
ActiveSheet.Shapes.AddChart2(201, xlColumnClustered).Select
'ActiveSheet.ChartObjects("Gráfico 55").Activate
ActiveChart.SetSourceData Source:=D3
ActiveChart.SetSourceData Source:=D6
ActiveChart.FullSeriesCollection(1).XValues = D3
ActiveChart.ChartGroups(1).GapWidth = 0
'**********MODIFICO CARACTERISTICAS DE LA GRAFICA
ActiveChart.HasTitle = True
ActiveChart.ChartTitle.Characters.Text = "PREGUNTAS X ESTUDIANTES"
ActiveChart.Axes(xlCategory, xlPrimary).HasTitle = True
ActiveChart.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "RANGOS"
ActiveChart.Axes(xlValue, xlPrimary).HasTitle = True
ActiveChart.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "NÚMERO DE ESTUDIANTES"
ActiveChart.SetElement (msoElementDataLabelOutSideEnd)
ActiveChart.SetElement (msoElementDataLabelInsideBase)
ActiveChart.SetElement (msoElementDataLabelCenter)
'************AREA DE IMPRESIÓN***********
Set zona = Range("FA60:FB72")
With ActiveSheet.ChartObjects
.Top = zona.Top
.Left = zona.Left
.Width = zona.Width
.Height = zona.Height
End With
'End If
'******** aqui creo la otra grafica
ActiveSheet.Shapes.AddChart2(301, xlColumnClustered).Select
'ActiveSheet.ChartObjects("Gráfico 56").Activate
ActiveChart.SetSourceData Source:=D7
ActiveChart.SetSourceData Source:=D8
ActiveChart.FullSeriesCollection(1).XValues = D7
ActiveChart.ChartGroups(1).GapWidth = 0
Set zona = Range("FC60:FG72")
With ActiveSheet.ChartObjects
.Top = zona.Top
.Left = zona.Left
.Width = zona.Width
.Height = zona.Height
End With
Hola Caterine,
Eliminarhe probado tu código y si que crea dos gráficos de columnas... el posible problema es que te los superpone, uno encima de otro, ya que trabajas siempre con ActiveChart, y con ActiveSheet.ChartObjects lo que hace que que ambos gráficos los situe en la misma zona.
Intenta identificar cada gráfico antes de realziar cambios sobre él. Emplea sus Índices:
With ActiveSheet.ChartObjects(1)
....
With ActiveSheet.ChartObjects(2)
....
Espero te oriente
Slds
Buenos días, tengo una situación similar a la que plantearon con Randal en agosto 30 de 2012. Necesito que los colores de las barras estén sujetos al resultado de 3 rangos 0-100, 100 y mayor a 100. Me puedes ayudar enviandome el archivo de Excel para aplicarlo en mi caso. Correo lbernalv@live.com.co
ResponderEliminarGracias,
Luis Bernal
Hola Luís,
Eliminarno tengo tal fichero.. simplemente copia el código expuesto en tal comentario y aplícalo.
Si tuvieras algún problema coméntamelo,.
Slds cordiales
Ismael, definitivamente no pude ingresar esa programación. Pero tengo otra inquietud. Grabé una macro para borrar las etiquetas de datos que no necesito en gráficos de columnas apiladas. Necesito que la macro lo repita con todas las gráficas y que solo lo haga con las que sean igual a "0". Este es el código básico. Tu me ayudas a definir donde iría la condición y qué tipo de condición debo ponerle:
ResponderEliminarSub Ceros()
'
' Ceros Macro
'
' Acceso directo: Ctrl+Mayús+C
'
ActiveWindow.SmallScroll Down:=9
ActiveSheet.ChartObjects("1 Gráfico").Activate
ActiveChart.SeriesCollection(4).DataLabels.Select
ActiveChart.SeriesCollection(4).Points(2).DataLabel.Select
Selection.Delete
ActiveSheet.ChartObjects("1 Gráfico").Activate
ActiveChart.SeriesCollection(3).DataLabels.Select
ActiveChart.SeriesCollection(3).Points(2).DataLabel.Select
Selection.Delete
ActiveWindow.SmallScroll Down:=-27
End Sub
Mil gracias,
Luis
Hola Luís,
Eliminarel código sería casi idéntico al mostrado en el post:
Sub worksheet_change(ByVal target As Range)
Dim Pto As Long
Dim Val As Variant
Dim nombrehoja, rangocelda As String
nombrehoja = ActiveSheet.Name
rangocelda = ActiveCell.Address
ActiveSheet.ChartObjects("1 Gráfico").Activate
With ActiveChart.SeriesCollection(1)
Val = .Values
For Pto = 1 To UBound(Val)
If Val(Pto) = 0 Then
.Points(Pto).HasDataLabel = False
Else
.Points(Pto).HasDataLabel = True
End If
Next Pto
End With
Sheets(nombrehoja).Range(rangocelda).Select
End Sub
Como ves la propiedad es .HasDataLabel =True o =False empleando el condicional IF THEN.
Slds
Genial!! Me funcionó, pero te molesto con otro detallito.... La gráfica tiene 4 series de datos compilados y necesito que replique borrar los "0" en las otras series. Cuando duplico la parte del proceso (cambiándole el número de la serie de datos) me dice que la variable de control For ya está en uso. Me apena molestarte tanto porque soy muy novato en esto, pero estoy a un tantito de lograrlo.
ResponderEliminarTe aradezco mucho...
Hola,
EliminarPrueba con
....
For serie=1 to 4
With ActiveChart.SeriesCollection(serie)
Val = .Values
For Pto = 1 To UBound(Val)
If Val(Pto) = 0 Then
.Points(Pto).HasDataLabel = False
Else
.Points(Pto).HasDataLabel = True
End If
Next Pto
End With
Next serie
....
Debería resultar sin problemas
Slds
Ismael: sos grande!!! funcionó perfecto. Mil y mil gracias!!!
Eliminar;-)
Eliminarme alegra funcionara como esperabas.
Slds cordiales
Estimado, tu aporte me interesa bastante, quiero probar pero no entiendo cuando te refieres a tener que programar en la hoja ? ..
ResponderEliminarLo que hago es ir a la hoja 1 y darle la opción ver código ingreso los datos que se muestran en tu aporte pero no logro realizar el evento, me podrías ayudar?
Hola Giancarlo,
Eliminares correcto lo que dices.
Si no te funciona podría ser que tu gráfico no se llame '1 Gráfico'... asegúrate de esto y comentas.
Slds cordiales
Es muy cierto, gracias por la ayuda.
ResponderEliminarAhora tengo otro inconveniente, estuve investigando pero por el momento no encuentro la solución, quizás tu podrías ayudarme.
Si bien el código pinta según valores solo para gráficos de Barras y Pie, a mi me interesa que estos cambios se realicen en una gráfico de Lineas.
Sabes como puedo hacerlo ?
Hola Giancarlo,
Eliminaren principio un gráfico de línea pinta de un mismo color toda la línea.. no veo posible poner cada tramo de línea de diferentes colores...
Ten en cuenta que cada tipo de gráfico tiene sus particularidades, y que el tratamiento por tanto no puede ser equiparable.
De todas formas investigaré...
Slds
Ismael.
ResponderEliminarDe no ser posible el pintado de las lineas, puede ser que las intersecciones del eje X con el Y, que juntas forman un punto, ese punto puede ser pintado'?
Hola Giancarlo,
Eliminarlos ejes pueden ser formateados con un color (a elegir), pero para 'pintar' la intersección de un color, tendrías que engañar a Excel, generando un punto ficticio, un par ordenado 0,0, para luego seleccionarlo y desde formato de Serie de puntos cambiarle el color...
Quizá te sirva la idea
Saludos
Estimado estuve investigando y encontré algo parecido a lo que estoy buscando, pero resulta que este ejercicio te muestra un color o colores degradados que lo que no estoy buscando.
EliminarComo sabrás me encuentro buscando un código que me ayude a pintar una gráfica de líneas, haber si me puede ayudar.
Sub formSeriesPoint()
Dim lP As Long
Dim lNrofPoints As Long
Dim dStep As Double
Dim rgbRedStartValue, rgbGreenStartValue, rgbBlueStartValue
Dim dRedStep As Double, dGreenStep As Double, dBlueStep As Double
If ActiveChart Is Nothing Then
MsgBox "Seleccione el grafico a modificar", vbCritical, "Grafico activo"
Exit Sub
End If
lNrofPoints = ActiveChart.SeriesCollection(1).Points.Count
dStep = 256 / lNrofPoints
With ufRGB
.Show
'establecer valor del color y del step para cada color
Select Case .cbxRojo
Case Is = 255
rgbRedStartValue = .cbxRojo.Value
dRedStep = dStep * -1
Case Is = 0
rgbRedStartValue = .cbxRojo.Value
dRedStep = dStep
Case Is = "255-K"
rgbRedStartValue = 255
dRedStep = 0
Case Is = "0-K"
rgbRedStartValue = 0
dRedStep = 0
End Select
Select Case .cbxVerde
Case Is = 255
rgbGreenStartValue = .cbxVerde.Value
dGreenStep = dStep * -1
Case Is = 0
rgbGreenStartValue = .cbxVerde.Value
dGreenStep = dStep
Case Is = "255-K"
rgbGreenStartValue = 255
dGreenStep = 0
Case Is = "0-K"
rgbGreenStartValue = 0
dGreenStep = 0
End Select
Select Case .cbxAzul
Case Is = 255
rgbBlueStartValue = .cbxAzul.Value
dBlueStep = dStep * -1
Case Is = 0
rgbBlueStartValue = .cbxAzul.Value
dBlueStep = dStep
Case Is = "255-K"
rgbBlueStartValue = 255
dBlueStep = 0
Case Is = "0-K"
rgbBlueStartValue = 0
dBlueStep = 0
End Select
End With
Unload ufRGB
For lP = 1 To lNrofPoints
ActiveChart.SeriesCollection(1).Points(lP).Format.Fill. _
ForeColor.RGB = RGB(rgbRedStartValue + (dRedStep * (lP - 1)), _
rgbGreenStartValue + (dGreenStep * (lP - 1)), _
rgbBlueStartValue + (dBlueStep * (lP - 1)))
Next lP
End Sub
Hola Giancarlo,
Eliminarpor que no purebas simplemente la funcionalidad de Variar colores entre puntos??
echa un vistazo a
http://excelforo.blogspot.com.es/2013/06/variar-colores-entre-puntos-de-una.html
y sin macros...
Saludos
Hola Ismael, he utilizado tu código y modificado un par de cosas para aplicarlo a varios gráficos en la misma hoja. El conflicto que presento es que mis valores se actualizan por fórmula y el cambio de color sólo se aplica si hago modificaciones a la celda origen. Podrías ayudarme para corregir y que considere los cambios de valor sin la necesidad de entrar a la celda? Adjunto código completo:
ResponderEliminar'ejecuta macro al modificar alguna celda en la Hoja1
Sub worksheet_change(ByVal target As Range)
'definimos las variables que emplearemos en el desarrollo de la macro
Dim Pto As Double
Dim Val As Variant
Dim nombrehoja, rangocelda As String
Dim hojagraficos As Worksheet
'asignamos a las variables nombrehoja y rangocelda un valor
nombrehoja = ActiveSheet.Previous.Name
rangocelda = ActiveCell.Address
Set hojagraficos = Sheets(nombrehoja)
'el siguiente código controla el valor de cada barra de nuestro gráfico
'y le asigna un color (rojo o azul)
hojagraficos.Activate
hojagraficos.ChartObjects("CONG_LD").Activate
With ActiveChart.SeriesCollection(1)
Val = .Values
For Pto = 1 To UBound(Val)
If Val(Pto) <= 0.79 Then .Points(Pto).Interior.Color = vbRed
If Val(Pto) > 0.79 And Val(Pto) <= 0.89 Then .Points(Pto).Interior.Color = vbYellow
If Val(Pto) > 0.89 Then .Points(Pto).Interior.Color = vbGreen
Next Pto
End With
hojagraficos.ChartObjects("CONG_MT").Activate
With ActiveChart.SeriesCollection(1)
Val = .Values
For Pto = 1 To UBound(Val)
If Val(Pto) <= 0.79 Then .Points(Pto).Interior.Color = vbRed
If Val(Pto) > 0.79 And Val(Pto) <= 0.89 Then .Points(Pto).Interior.Color = vbYellow
If Val(Pto) > 0.89 Then .Points(Pto).Interior.Color = vbGreen
Next Pto
End With
hojagraficos.ChartObjects("REF_LD").Activate
With ActiveChart.SeriesCollection(1)
Val = .Values
For Pto = 1 To UBound(Val)
If Val(Pto) <= 0.79 Then .Points(Pto).Interior.Color = vbRed
If Val(Pto) > 0.79 And Val(Pto) <= 0.89 Then .Points(Pto).Interior.Color = vbYellow
If Val(Pto) > 0.89 Then .Points(Pto).Interior.Color = vbGreen
Next Pto
End With
hojagraficos.ChartObjects("REF_MT").Activate
With ActiveChart.SeriesCollection(1)
Val = .Values
For Pto = 1 To UBound(Val)
If Val(Pto) <= 0.79 Then .Points(Pto).Interior.Color = vbRed
If Val(Pto) > 0.79 And Val(Pto) <= 0.89 Then .Points(Pto).Interior.Color = vbYellow
If Val(Pto) > 0.89 Then .Points(Pto).Interior.Color = vbGreen
Next Pto
End With
'termina la macro devolviéndonos a una celda activa de la Hoja de cálculo activa
Sheets(nombrehoja).Range(rangocelda).Select
Set hojagraficos = Nothing
End Sub
Hola,
Eliminarel problema de esto es que al lanzar una macro con un evento Change (como tu has hecho).. estás supeditado a que se cambie o modifique una celda de tu hoja...
podrías probar con un evento
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
....
así cada vez que hagas una selección de una celda se reproduciría el procedimiento.. aunque quizá esto no sea lo más práctico, ya que se lanzaría constantemente en cada selección.
Espero orientarte.
Saludos
Hola! he modificado un poco el código y he asignado la macro a un cuadro de lista (que es el que genera el cambio de datos en el rango de datos para el gráfico) y con cada cambio se ejecuta de manera adecuada. Con ello los colores cambian con cada selección nueva en el cuadro:
ResponderEliminar'ejecuta macro al modificar alguna celda en la Hoja1
Sub Actualizar_graficos()
'definimos las variables que emplearemos en el desarrollo de la macro
Dim Pto As Double
Dim Val As Variant
Dim nombrehoja, rangocelda As String
Dim hojagraficos As Worksheet
Application.Calculation = xlCalculationAutomatic
'asignamos a las variables nombrehoja y rangocelda un valor
nombrehoja = "Dashboard"
Set hojagraficos = Sheets(nombrehoja)
'el siguiente código controla el valor de cada barra de nuestro gráfico
'y le asigna un color (rojo, amarillo o verde)
hojagraficos.Activate
hojagraficos.ChartObjects("CONG_LD").Activate
With ActiveChart.SeriesCollection(1)
Val = .Values
For Pto = 1 To UBound(Val)
If Val(Pto) <= 0.79 Then .Points(Pto).Interior.Color = vbRed
If Val(Pto) > 0.79 And Val(Pto) <= 0.89 Then .Points(Pto).Interior.Color = vbYellow
If Val(Pto) > 0.89 Then .Points(Pto).Interior.Color = vbGreen
Next Pto
End With
hojagraficos.ChartObjects("CONG_MT").Activate
With ActiveChart.SeriesCollection(1)
Val = .Values
For Pto = 1 To UBound(Val)
If Val(Pto) <= 0.79 Then .Points(Pto).Interior.Color = vbRed
If Val(Pto) > 0.79 And Val(Pto) <= 0.89 Then .Points(Pto).Interior.Color = vbYellow
If Val(Pto) > 0.89 Then .Points(Pto).Interior.Color = vbGreen
Next Pto
End With
hojagraficos.ChartObjects("REF_LD").Activate
With ActiveChart.SeriesCollection(1)
Val = .Values
For Pto = 1 To UBound(Val)
If Val(Pto) <= 0.79 Then .Points(Pto).Interior.Color = vbRed
If Val(Pto) > 0.79 And Val(Pto) <= 0.89 Then .Points(Pto).Interior.Color = vbYellow
If Val(Pto) > 0.89 Then .Points(Pto).Interior.Color = vbGreen
Next Pto
End With
hojagraficos.ChartObjects("REF_MT").Activate
With ActiveChart.SeriesCollection(1)
Val = .Values
For Pto = 1 To UBound(Val)
If Val(Pto) <= 0.79 Then .Points(Pto).Interior.Color = vbRed
If Val(Pto) > 0.79 And Val(Pto) <= 0.89 Then .Points(Pto).Interior.Color = vbYellow
If Val(Pto) > 0.89 Then .Points(Pto).Interior.Color = vbGreen
Next Pto
End With
hojagraficos.Calculate
Set hojagraficos = Nothing
End Sub
Gracias por tu ayuda,
Saludos.
hola, disculpen la molestia pero agradeceria su apoyo para realizar una macro que me dibuje (ubique, coloque) varios puntos (x,y,z) en una de las caras superiores de un cubo 3d, es decir, la idea es tomar un vértice de una de las caras de un cubo y seleccionar los ejes, x, y, y z, y de ellos poder hacer la ubicación de los diferentes puntos (x,y,z) que queramos.
ResponderEliminarHola Aureo
Eliminartrataré de subir una explicación al blog en cuanto me sea posible...
Un saludo
hola, disculpe la molestia, cual seria el procedimiento para al hacer clic en un punto cualquiera del grafico, la información de este se muestre en una celda, como por ejemplo la fecha.
ResponderEliminarHola,
Eliminarno existe, que yo conozca, un evento similar a lo que planteas sobre los gráficos...
imagino habría que generarlo en un modulo de clase y luego emplearlo en uno estándar. Sería bastante complejo...
Saludos