Está en la página 1de 5

ernes, 18 de noviembre de 2011

VBA: Asociar los elementos de un ComboBox a un campo de


tabla dinmica en Excel.
Hace algn tiempo me lleg un mail solicitando ayuda sobre un tema que ya entonces llevaba tiempo
pensando en subir al blog. Se trata de asociar los elementos de un ComboBox a un campo de tabla
dinmica en Excel. Concretamente lo explicar basndome en la peticin del lector.:
...Tengo 15 graficas (pivot charts) que he conseguido con una macro se actualicen al mismo tiempo cuando cambio el filtro en una de
ellas. Ahora le jefe quiere que en cada una de esas graficas distinga con un color or etiqueta una sola de las series. Me explico:
Los graficos son serie de barras, cada serie es un cliente y cada grafico es un producto diferente. Nuestro departamento quiere enviar
cada mes esos graficos a cada cliente para informarle como esta su consumo en relacion al resto, pero sin que conozca quienes son el
resto de clientes. Neceisto identificar ese cliente al que le enviare los graficos, con un color de barra diferente o con una etiqueta en
la serie
Es posible construir una macro para hacer esto o hay alguna otra manera?...

Lo que pide nuestro amigo es que , basndonos en los elementos de un campo de una Tabla dinmica,
poder seleccionar fuera de la tabla dinmica, por ejemplo, con un ComboBox uno de los elementos, y
que ese elemento aparezca en el Grfico dinmico con una columna de color distinto a los dems
elementos.
Veamos cul es nuestro origen de datos y como queda tanto nuestra Tabla dinmica como
nuestroGrfico dinmico:

Simplemente hemos generado una Tabla (Ctrl+q) sobre nuestro origen de datos, y la hemos resumido
con una Tabla dinmica, de la cual hemos generado un Grfico dinmico tal cual muestra la
imagen.
Nuestro objetivo ahora es conseguir que a nuestra eleccin, sobre un Concepto cambie nuestro
grfico, mostrando la columna del 'Concepto' seleccionado de otro color.
Para ello, en primer lugar, insertaremos un Combobox(cuadro combinado) desde la Ficha
Programador > Grupo opciones Controles > Insertar > Controles ActiveX > Cuadro Combinado

Una vez 'incrustado' en la hoja de clculo, desde el mismo gupo de opciones, seleccionaremos y
mostraremos la ventana de Propiedades:

dentro de estas Propiedades buscaremos 'LinkedCell' y escribiremos la referencia de una celda de


nestra hoja de clculo, en mi caso la celda H1. Con esto hemos conseguido que cuando seleccionemos
y empleemos el desplegable del ComboBox(Cuadro combinado) ese valor aparezca en la celda H1...
valor que usaremos, en un paso siguiente para conseguir que el grfico cambie.
Aadiremos el siguiente cdigo VBA a este ComboBox, para ello, haremos doble click sobre el objeto
recin incrustado y llegaremos a la ventana de cdigo de la hoja activa; en ella escribiremos:
view plainprint?

1.

Private Sub ComboBox1_GotFocus()

2.

Dim eltos As Long

3.
4.

'Refrescamos la tabla dinmica

5.

'de la que mostraremos los elementos en el Combobox

6.

' y los ordenamos...

7.

With Sheets("Datos").PivotTables("Tabla dinmica1")

8.

.PivotCache.MissingItemsLimit = _

9.

xlMissingItemsNone

10. .RefreshTable
11. .PivotFields("Concepto").AutoSort _
12. xlAscending, "Concepto"
13. End With
14.
15. 'limpiamos el ComboBox
16. ComboBox1.Clear
17.
18. 'Vamos a llenar dinmicamente el combobox
19. 'con los ELEMENTOS del campo de TD
20. With ActiveSheet.PivotTables("Tabla dinmica1")
21. eltos = .PivotFields("Concepto").PivotItems.Count
22.
23. For i = 1 To eltos
24. 'Aadimos los ELEMENTOS de la Tabla dinmica al combobox
25. ComboBox1.AddItem ActiveSheet.PivotTables("Tabla dinmica1").PivotFields("Concepto").PivotI
tems(i)
26. Next
27. End With

28.
29. End Sub

Con este cdigo hemos conseguido que el desplegable del ComboBox muestre slo los valores del
campo 'Concepto' de la tabla dinmica sobre la que trabajamos.
Nos queda ahora generar el cdigo que cambie el color de la columna del grfico dinmico en funcin
al valor desplegado con nuestro ComboBox. Para ello insertaremos un Mdulo en el Explorador de
Proyectos del Editor de VBA:

view plainprint?

1.

Sub ColumnaDiferente()

2.

Dim x As Variant, n As String

3.

Dim Val As Variant

4.

Dim nombrehoja As Variant, rangocelda As Variant

5.
6.

nombrehoja = ActiveSheet.Name

7.

rangocelda = ActiveCell.Address

8.
9.

x = Sheets("Datos").Range("H1").Value

10. n = Sheets("Datos").PivotTables("Tabla dinmica1").PivotFields("Concepto").PivotItems.Count


11.
12. Sheets("Datos").ChartObjects("1 Grfico").Activate
13. With ActiveChart.SeriesCollection(1)
14. For i = 1 To n
15. If Sheets("Datos").PivotTables("Tabla dinmica1").PivotFields("Concepto").PivotItems(i) = x T
hen
16. .Points(i).Interior.Color = RGB(255, 0, 0)
17. .Points(i).HasDataLabel = True
18. .Points(i).ApplyDataLabels Type:=xlValue

19. Else
20. On Error Resume Next
21. .Points(i).Interior.Color = RGB(0, 0, 255)
22. .Points(i).HasDataLabel = False
23. End If
24. Next i
25. End With
26.
27. Sheets(nombrehoja).Range(rangocelda).Select
28.
29. End Sub

También podría gustarte