none
Realizar tabla dinámica desde visual studio 2015 RRS feed

  • Pregunta

  • Estimados, 

    Necesito de su ayuda, resulta que estoy creando un programa desde Visual Studio 2015, el cual al apretar un botón, me pide seleccionar un archivo excel en particular y desde este archivo se realizan modificaciones. Esta primera parte ya la tengo bien definida, el problema radica que al final de la modificación de los datos del Excel, requiero que se genere una tabla dinámica en una hoja nueva y este pasó no he logrado hacerlo. Por favor, ayudenme

    Les copio código ejemplo para que se entienda mejor la idea:

    Imports Microsoft.Office.Interop.Excel
    Imports System.Data

    Public Class Form4

        Dim saveFileDialog1 As New SaveFileDialog()
        Dim openfiledialog1 As New OpenFileDialog()
        Dim xlApp As New Microsoft.Office.Interop.Excel.Application
        Dim xlWorkBook As Microsoft.Office.Interop.Excel.Workbook
        Dim xlWorkSheet As Microsoft.Office.Interop.Excel.Worksheet
        Dim strRutaExcel As String
        Dim workbooks As String
        Dim s As String = Environment.GetFolderPath(Environment.SpecialFolder.Desktop)

            

      Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
            openfiledialog1.Filter = "Excel Files| *.xlsx;*.xls;*.xlsm;*.XML"
            If openfiledialog1.ShowDialog = DialogResult.OK Then

            With xlApp
                strRutaExcel = openfiledialog1.FileName
                xlApp = CreateObject("excel.application")
                .Workbooks.Open(strRutaExcel)
                .ActiveSheet.select

    Hasta aquí se abre el archivo. La idea es que se seleccione un rango:   .Range("A1", "S100").Select()

    y se genere la tabla dinámica.

              

                Dim str As String
                Dim retString As String
                str = "This is substring test"
                retString = str.Substring(8, 9)
                MsgBox(retString)


                .Visible = True
            End With

    End If

        End Sub
    End Class

    Muchas gracias de ante mano!!!

    • Cambiado Enrique M. Montejo miércoles, 2 de noviembre de 2016 15:51 Programación con Microsoft Excel.
    viernes, 28 de octubre de 2016 18:23

Todas las respuestas

  • Hola:
    ¿Que entientes por tabla dinamica?
    Puedes explicar mas cual es el proceso que quieres

    Un saludo desde Bilbo
    Carlos
    viernes, 28 de octubre de 2016 21:03
  • Estimado,

    Un gusto. 

    Tabla dinámica es aquella tabla que me permite modificar las filas, columnas, filtros y funciones dependiendo de mis necesidades. La principal característica de esta tabla sería su versatilidad para la presentación de los datos.

    En términos de Códigos, se llama Pivottable o Pivottablewizard.

    Te dejo el siguiente link donde se muestra una tabla dinámica.

    https://www.youtube.com/watch?v=838f_eZq_BE

    Saludos!

    viernes, 28 de octubre de 2016 21:21
  • Hola:
    Aunque con un "POCO" de retraso, "enredando" te he conseguido un ejemplo.
    Este ejemplo usa una libreria llamada ClosedXML.dll, asi que la tendras que descargar desde http://closedxml.codeplex.com/SourceControl/latest.
    Tambien tendras que ejecutar el fichero OpenXMLSDKV25.msi.
    El codigo es el siguiente

        Private Sub lP_Dinamica()
            Try
                Dim ListaPastel As New List(Of Pastel)
                ListaPastel.Add(New Pastel("Croissant", "Abril", 125))
                ListaPastel.Add(New Pastel("Croissant", "Mayo", 250))
                ListaPastel.Add(New Pastel("Croissant", "Junio", 134))
                ListaPastel.Add(New Pastel("buñuelo", "Abril", 250))
                ListaPastel.Add(New Pastel("buñuelo", "Mayo", 225))
                ListaPastel.Add(New Pastel("buñuelo", "Junio", 210))
                ListaPastel.Add(New Pastel("Bearclaw", "Abril", 134))
                ListaPastel.Add(New Pastel("Bearclaw", "Mayo", 184))
                ListaPastel.Add(New Pastel("Bearclaw", "Junio", 124))
                ListaPastel.Add(New Pastel("Dinamarca", "Abril", 394))
                ListaPastel.Add(New Pastel("Dinamarca", "Mayo", 190))
                ListaPastel.Add(New Pastel("Dinamarca", "Junio", 221))
                ListaPastel.Add(New Pastel("bollo", "Abril", 135))
                ListaPastel.Add(New Pastel("bollo", "Mayo", 122))
                ListaPastel.Add(New Pastel("bollo", "Junio", 243))
                '
                Dim wb As XLWorkbook = New XLWorkbook()
                Dim Hoja As IXLWorksheet = wb.Worksheets.Add("Datos")
                ' Inserta nuestra lista de datos de pasteles en la hoja "Datos" en la celda 1,1
                Dim fuente As IXLTable = Hoja.Cell(1, 1).InsertTable(ListaPastel, "Datos", True)
                ' Crear un rango que incluya nuestra tabla, incluyendo la fila de encabezado
                Dim Rango As IXLTableRange = fuente.DataRange
                Dim cabecera As IXLRange = Hoja.Range(1, 1, 1, 3)
                Dim RangoDatos As IXLRange = Hoja.Range(cabecera.FirstCell(), Rango.LastCell())
                'Añadir una nueva hoja para nuestra tabla dinámica
                Dim HojaPivot As IXLWorksheet = wb.Worksheets.Add("Pivot Table")
                'Crear la tabla dinámica, utilizando los datos de la tabla ListaPastel
                Dim pt As IXLPivotTable = HojaPivot.PivotTables.AddNew("tabla dinámica", HojaPivot.Cell(1, 1), RangoDatos)
                ' Las filas de nuestra tabla dinámica serán los nombres de los pasteles
                pt.RowLabels.Add("Nombre")
                ' Las columnas serán los meses
                pt.ColumnLabels.Add("Mes")
                '/ Los valores de nuestra tabla provendrán del campo Cantidad
                ' La configuración de cálculo predeterminada es un total de cada fila / columna
                pt.Values.Add("Cantidad")
                '
                wb.SaveAs("D:\Carpeta\Dinamica.xlsx")
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
    La clase Pastel tiene el siguiente codigo
    Public Class Pastel
        Public Property Nombre As String
        Public Property Mes As String
        Public Property Cantidad As Integer

        Public Sub New(ByVal vsNombre As String, vsMes As String, viCantidad As Integer)
            Nombre = vsNombre
            Mes = vsMes
            Cantidad = viCantidad
        End Sub
    End Class

    Un saludo desde Bilbo
    Carlos

    viernes, 18 de noviembre de 2016 23:55