none
Desde Access cómo usar .seriescollection para crear gráfico de barra apilada en Excel RRS feed

  • Pregunta

  • Hola

    Dede una Consulta de MS Access 2016, busco crear desde "Scratch" una Gráfica de Barra Apilada en una Hoja Excel.

    La consulta muestra en la Hoja Excel 5 columnas.

    La barra apilada de la gráfica debe formarse con datos de las columnas 1 y 3 

    El Campo de la Columna 1 es Fecha y el Campo de la Columna 3 es double

    Las etiquetas del Eje Horizontal deben editarse con Registros de la Columna 5 (String)

    He buscado por dos semanas en Internet y no he podio hallar para Access ejemplos y/o literatura que me ayude a escribir el código completo.

    A la fecha tengo solo una línea de código que funciona bien para la primera linea de Código:

    .SeriesCollection.NewSeries

    SeriesCollection(1).Values == "=" & ws.Name & "!" & ws.Range(Cells(2, 1), Cells(ws.Range("A2").End(xlDown).Row, 1)).Address(True, True, xlA1, False)

    Pero, al escribir la siguiente Línea de Código, VBA me da Error 91 Variable o Boque With no establecido.

    .SeriesCollection.NewSeries

    .SeriesCollection(1).Values = "=" & ws.Name & "!" & ws.Range(Cells(2, 3), Cells(ws.Range("C2").End(xlDown).Row, 1)).Address(True, True, xlC1, False).

    Agradezco la ayuda que me puedan dar (enlaces/literatura) código para terminar mi Tarea.

    Saludos


    martes, 30 de octubre de 2018 2:22

Todas las respuestas

  • Hola

    ¿Probaste a grabar una macro en Excel con los pasos necesarios para crear ese gráfico, y ver el código que genera?

    Salu2,


    José Mª Fueyo

    martes, 30 de octubre de 2018 10:41
  • Hola.

    Aprecio tu respuesta.

    Si, primero grabé la Macro en Excel.

    Este es el Código que grafica la columna 3 sobre la 1 :

    ActiveChart.FullSeriesCollection(2).Values = "=qry_123!$C$2:$C$15"

    ActiveChart.FullSeriesCollection(2).XValues = "=qry_123!$E$2:$E$15"

    Y este Código revierte el Orden de los datos del Eje X:

    ActiveSheet.ChartObjects("Gráfico 1").Activate
     ActiveChart.Axes(xlCategory).Select
     ActiveChart.Axes(xlCategory).ReversePlotOrder = True

    Desde MS Access este Código grafica la Columna 1:

    .SeriesCollection.NewSeries

    .SeriesCollection(1).Values = "=" & ws.Name & "!" & ws.Range(Cells(2, 1), Cells(ws.Range("A2").End(xlDown).Row, 1)).Address(True, True, xlA1, False)

    Siguiendo esa lógica, escribí las siguientes instrucciones:

    .SeriesCollection(2).Values = "=" & ws.Name & "!" & ws.Range(Cells(2, 3), Cells(ws.Range("C2").End(xlDown).Row, 1)).Address(True, True, xlC1, False)

    Aquí VBA pinta de amarillo toda la instrucción y muestra el Error 91 'Variable de Objeto o bloque With no establecido.'

    Por lo anterior, no puedo ver el efecto del siguiente código:

    .SeriesCollection(2).XValues = "=" & ws.Name & "!" & ws.Range(Cells(2, 5), Cells(ws.Range("E2").End(xlDown).Row, 1)).Address(True, True, xlE1, False).

    Para buscar la solución a este Error, investigué en todos los sitios de VBA para Access y para  Excel y no he hallado siquiera literatura y/o un código de ejemplo que me ayude a terminar de escribir correctamente, desde MS Access, el bloque de código completo que indica la Macro que grabé en Excel. 

    También, he revisado Tutoriales escritos y en video y tampoco he tenido éxito.

    Agradezco tu ayuda.

    martes, 30 de octubre de 2018 12:27
  • Hola

    Si estás automatizando desde Access, tienes que crearte un objeto Excel.Application, un objeto Excel.Workbook y seguramente un chart (no se muy bien como se llama el tipo).

    Instancia el objeto excel, desde él crea el workbook mediante un método Open del objeto excel.application (sí el libro existe, si no crea uno nuevo), y luego refiere al seriescollection como un elemento del workbook.

    Esto es lo que encontré en Google

    Suerte...


    José Mª Fueyo


    martes, 30 de octubre de 2018 14:08
  • Hola. Eso que indicas ya lo tengo con las siguientes instrucciones:

    Dim xl As Excel.Application, wb As Excel.Workbook, ws As Excel.Worksheet, xlChart As Excel.ChartObject

    Dim sExcelWB As String

    Set xl = CreateObject("excel.application")

    sExcelWB = CurrentProject.Path & "\qry_123.xlsx"

    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "qry_123", sExcelWB

    Set wb = xl.Workbooks.Open(sExcelWB)
    Set ws = wb.Sheets("qry_123")ws.Shapes.AddChart.Select
    ws.ChartObjects(1).Chart.ChartType = xlBarStackedSet xlChart = ws.ChartObjects(1)
    With .Chart

    .ChartType = xlBarStacked

    .SeriesCollection.NewSeries

    .....

    .....

    .....

    End WIth

    Lo anterior, me permite exportar y abrir la consulta a Excel y crear la grafica. Mi problema es que no puedo escribir correctamenteel código de las siguientes líneas:

    .SeriesCollection.NewSeries

    .SeriesCollection(2).Values = "=" & ws.Name & "!" & ws.Range(Cells(2, 3), Cells(ws.Range("C2").End(xlDown).Row, 1)).Address(True, True, xlC1, False)

    .SeriesCollection(2).XValues = "=" & ws.Name & "!" & ws.Range(Cells(2, 5), Cells(ws.Range("E2").End(xlDown).Row, 1)).Address(True, True, xlE1, False)

    Si lo anterior es lo que indicas y, si tienes sugerencias, por favor indicarlo.

    Todos los consejos son bien recibidos.

    Voy a estudiar el contenido del enlace que incluyes.

    Muchas gracias

    martes, 30 de octubre de 2018 14:45
  • Hola. 

    A la fecha no he podido escribir las dos líneas de código correctamente indicadas en en mi reciente mensaje. 

    Enfoqué mi atención en el uso de SeriesCollection para entender la sintaxis, pero, no hallé lo buscado.

    Esta linea de codigo corre bien:

    .SeriesCollection.NewSeries

    .SeriesCollection(1).Values = "=" & ws.Name & "!" & ws.Range(Cells(2, 1), Cells(ws.Range("A2").End(xlDown).Row, 1)).Address(True, True, xlA1, False)

    Pero, la siguiente da error 91 Variable de objeto o bloque With no establecido.

    .SeriesCollection.NewSeries

    .SeriesCollection(2).Values = "=" & ws.Name & "!" & ws.Range(Cells(2, 3), Cells(ws.Range("C2").End(xlDown).Row, 1)).Address(True, True, xlC1, False)

    .SeriesCollection(2).XValues = "=" & ws.Name & "!" & ws.Range(Cells(2, 5), Cells(ws.Range("E2").End(xlDown).Row, 1)).Address(True, True, xlE1, False)

    Estoy sin avanzar.

    No he podido referir al seriescollection como un elemento del Workbook.
    Tampoco, he logrado escribir esas instrucciones en un bloque With.

    Agradezco la ayuda a tu alcance para poder escribir correctamente mi código.

    Saludos

    miércoles, 31 de octubre de 2018 10:57