none
Ordenar columna excel desde vb.net RRS feed

  • Pregunta

  • Hola,

    tengo un programa en vb.net que tiene que modificar en tiempo de ejecución el formato de un excel. Solo me queda un paso: ordenar el excel por la primera columna de manera descendente.

    Tenéis idea de cómo debo hacerlo? no he encontrado mucha información al respecto.

    Muchas gracias.

    martes, 16 de octubre de 2012 13:39

Respuestas

  • "Gahad" escribió:

    > si lo pongo como me indicas en Excel.XlSortOn.xlSortOnValues y en
    > Excel.xlTopToBottom me dice que XlSortOn y xlTopBottom no es un
    > miembro de Excel.

    Acepto el "error" sobre la constante xlTopToBottom, no así sobre el valor xlSortOnValues.

    En cuanto a la constante xlTopToBottom en realidad tienes que declarla así:

      .Orientation = Excel.Constants.xlTopToBottom

    Pero si tienes activada en tu proyecto de Visual Basic la instrucción Option Strict, vas a tener que hacer una conversión explícita al tipo de dato Exce.XlSortOrientation, por lo que será mejor que la dejes como la tenías en un principio:

      .Orientation = Excel.XlSortOrientation.xlSortColumns

    Te he indicado anteriormente el valor de la constante xlTopToBottom, porque con ese valor es como yo la he ejectuado en la prueba que he relizado desde una macro de un libro de Excel que tenía abierto. Y como tanto el valor de una y otra es 1, da igual que especifiques un valor u otro, como si quieres especificar directamente el valor 1:

      .Orientation = 1

    Aunque si tienes activada la instrucción Option Strict, tendrías que hacerlo así:

      .Orientation = CType(1, Excel.XlSortOrientation)

    Y en cuanto al valor de xlSortOnValues, ahí ya no sé lo que decirte, porque ahora sí he hecho la prueba directamente en un proyecto de Visual Basic .net, y éste es el código que he ejecutado para ordenar un rango de celdas:

            Dim app As Excel.Application = Nothing
            Dim wb As Excel.Workbook = Nothing
            Dim excelSht As Excel.Worksheet = Nothing
    
            Try
                app = New Excel.Application()
                wb = app.Workbooks.Open("C:\Mis documentos\Libro1.xlsx")
                excelSht = CType(wb.Sheets("Hoja1"), Excel.Worksheet)
    
                ' Referenciamos el objeto Sort
                '
                Dim sort As Excel.Sort = excelSht.Sort
    
                With sort
                    .SortFields.Clear()
                    .SortFields.Add(excelSht.Range("A4"), Excel.XlSortOn.xlSortOnValues, _
                        Excel.XlSortOrder.xlDescending, Excel.XlSortDataOption.xlSortNormal)
    
                    .SetRange(excelSht.Range("A4:F14"))
                    .MatchCase = False
                    .Header = Excel.XlYesNoGuess.xlNo
                    .Orientation = Excel.XlSortOrientation.xlSortColumns
                    .SortMethod = Excel.XlSortMethod.xlPinYin
                    .Apply()
                End With
    
                ' Guardamos los campos
                '
                wb.Save()
    
                ' Cerramos el libro
                wb.Close()
    
            Catch ex As Exception
                ' Se ha producido un error
                MessageBox.Show(ex.Message)
    
            Finally
                If (excelSht IsNot Nothing) Then
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(excelSht)
                End If
                excelSht = Nothing
    
                If (wb IsNot Nothing) Then
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(wb)
                End If
                wb = Nothing
    
                If (app IsNot Nothing) Then
                    ' Cerramos Excel
                    app.Quit()
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(app)
                End If
                app = Nothing
    
            End Try
    

    > Me falta algun tipo de referencia?

    La única referencia que tienes que establecer es al ensamblado Microsoft.Office.Interop.Excel que se corresponda con la versión de Microsoft Excel que tengas instalada en tu equipo, e importar a nivel de la clase o formulario el siguiente espacio de nombres:

        Imports Microsoft.Office.Interop

    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    • Marcado como respuesta Gahad miércoles, 17 de octubre de 2012 10:56
    martes, 16 de octubre de 2012 16:35
    Moderador

Todas las respuestas

  • Lo que he hecho es lo siguiente pero no me funciona, no da error, pero no funciona:

             With ExcelSht
                    .Activate()
                    .Sort.SortFields.Clear()
                    .Sort.SortFields.Add(Key:=.Range("A4"), SortOn:=Excel.XlSortType.xlSortValues, _
                             Order:=Excel.XlSortOrder.xlAscending, DataOption:=Excel.XlSortDataOption.xlSortNormal)
                    With .Sort
                        .SetRange(ExcelSht.Range("A4:F14"))
                        .SortFields.Add(Key:=.Range("A4"), SortOn:=Excel.XlSortType.xlSortValues, _
                             Order:=Excel.XlSortOrder.xlAscending, DataOption:=Excel.XlSortDataOption.xlSortNormal)
                        .MatchCase = False
                        .Header = Excel.XlYesNoGuess.xlNo
                        .Orientation = Excel.XlSortOrientation.xlSortColumns
                        .SortMethod = Excel.XlSortMethod.xlPinYin
                        .Apply()
                    End With
                End With

    martes, 16 de octubre de 2012 13:45
  • "Gahad" escribió:

    > Lo que he hecho es lo siguiente pero no me funciona, 
    > no da error, pero no funciona:
    >
    > .Sort.SortFields.Add(Key:=.Range("A4"), _
    >   SortOn:=Excel.XlSortType.xlSortValues, _
    >   Order:=Excel.XlSortOrder.xlAscending, _
    >   DataOption:=Excel.XlSortDataOption.xlSortNormal)
    >
    >  .Orientation = Excel.XlSortOrientation.xlSortColumns

    Hola:

    Si te fijas bien en los valores que aparecen en negrita, no son los valores adecuados para ordenar un rango de celdas.

      Excel.XlSortType.xlSortValues --> Excel.XlSortOn.xlSortOnValues

      Excel.XlSortOrientation.xlSortColumns --> Excel.xlTopToBottom

    Aparte, que si deseas ordenar de manera descendente, el valor del parámetro SortOn deberá ser XlDescending.

    Suponiendo que la variable ExcelSht referencia a un objeto Excel.Worksheet, para ordenar un rango de mayor a menor (descendente) lo harías de la siguiente manera:

        ' Referenciamos el objeto Sort
        '
        Dim sort As Excel.sort = ExcelSht.sort
    
        With sort
            .SortFields.Clear()
            .SortFields.Add(ExcelSht.range("A4"), Excel.XlSortOn.xlSortOnValues, _
                Excel.XlSortOrder.xlDescending, Excel.XlSortDataOption.xlSortNormal)
            .SetRange ExcelSht.range("A4:F14")
            .MatchCase = False
            .Header = Excel.XlYesNoGuess.xlNo
            .Orientation = Excel.xlTopToBottom
            .SortMethod = Excel.XlSortMethod.xlPinYin
            .Apply
        End With

    Se comprende que deseas ordenar el rango A4:F14, de manera descendente (de mayor a menor), por la cuarta celda de la primera columna (A4).

    Un saludo



    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.


    martes, 16 de octubre de 2012 15:16
    Moderador
  • Hola Enrique,

    si lo pongo como me indicas en Excel.XlSortOn.xlSortOnValues y en Excel.xlTopToBottom me dice que XlSortOn y xlTopBottom no es un miembro de Excel.

    Me falta algun tipo de referencia?

    Gracias por tu ayuda.

    martes, 16 de octubre de 2012 15:28
  • "Gahad" escribió:

    > si lo pongo como me indicas en Excel.XlSortOn.xlSortOnValues y en
    > Excel.xlTopToBottom me dice que XlSortOn y xlTopBottom no es un
    > miembro de Excel.

    Acepto el "error" sobre la constante xlTopToBottom, no así sobre el valor xlSortOnValues.

    En cuanto a la constante xlTopToBottom en realidad tienes que declarla así:

      .Orientation = Excel.Constants.xlTopToBottom

    Pero si tienes activada en tu proyecto de Visual Basic la instrucción Option Strict, vas a tener que hacer una conversión explícita al tipo de dato Exce.XlSortOrientation, por lo que será mejor que la dejes como la tenías en un principio:

      .Orientation = Excel.XlSortOrientation.xlSortColumns

    Te he indicado anteriormente el valor de la constante xlTopToBottom, porque con ese valor es como yo la he ejectuado en la prueba que he relizado desde una macro de un libro de Excel que tenía abierto. Y como tanto el valor de una y otra es 1, da igual que especifiques un valor u otro, como si quieres especificar directamente el valor 1:

      .Orientation = 1

    Aunque si tienes activada la instrucción Option Strict, tendrías que hacerlo así:

      .Orientation = CType(1, Excel.XlSortOrientation)

    Y en cuanto al valor de xlSortOnValues, ahí ya no sé lo que decirte, porque ahora sí he hecho la prueba directamente en un proyecto de Visual Basic .net, y éste es el código que he ejecutado para ordenar un rango de celdas:

            Dim app As Excel.Application = Nothing
            Dim wb As Excel.Workbook = Nothing
            Dim excelSht As Excel.Worksheet = Nothing
    
            Try
                app = New Excel.Application()
                wb = app.Workbooks.Open("C:\Mis documentos\Libro1.xlsx")
                excelSht = CType(wb.Sheets("Hoja1"), Excel.Worksheet)
    
                ' Referenciamos el objeto Sort
                '
                Dim sort As Excel.Sort = excelSht.Sort
    
                With sort
                    .SortFields.Clear()
                    .SortFields.Add(excelSht.Range("A4"), Excel.XlSortOn.xlSortOnValues, _
                        Excel.XlSortOrder.xlDescending, Excel.XlSortDataOption.xlSortNormal)
    
                    .SetRange(excelSht.Range("A4:F14"))
                    .MatchCase = False
                    .Header = Excel.XlYesNoGuess.xlNo
                    .Orientation = Excel.XlSortOrientation.xlSortColumns
                    .SortMethod = Excel.XlSortMethod.xlPinYin
                    .Apply()
                End With
    
                ' Guardamos los campos
                '
                wb.Save()
    
                ' Cerramos el libro
                wb.Close()
    
            Catch ex As Exception
                ' Se ha producido un error
                MessageBox.Show(ex.Message)
    
            Finally
                If (excelSht IsNot Nothing) Then
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(excelSht)
                End If
                excelSht = Nothing
    
                If (wb IsNot Nothing) Then
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(wb)
                End If
                wb = Nothing
    
                If (app IsNot Nothing) Then
                    ' Cerramos Excel
                    app.Quit()
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(app)
                End If
                app = Nothing
    
            End Try
    

    > Me falta algun tipo de referencia?

    La única referencia que tienes que establecer es al ensamblado Microsoft.Office.Interop.Excel que se corresponda con la versión de Microsoft Excel que tengas instalada en tu equipo, e importar a nivel de la clase o formulario el siguiente espacio de nombres:

        Imports Microsoft.Office.Interop

    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    • Marcado como respuesta Gahad miércoles, 17 de octubre de 2012 10:56
    martes, 16 de octubre de 2012 16:35
    Moderador
  • Gracias por tu ayuda pero sigo teniendo el mismo error con Excel.XlSortOn que no me lo reconoce.

    He abierto un proyecto  nuevo, para hacer sólo esta función y tengo el mismo problema. No se si será por las versiones de Office o de alguna .dll que tu tengas y yo no. No se me ocurre nada más.

    Marta.

    miércoles, 17 de octubre de 2012 8:31
  • "Gahad" escribió:

    >  pero sigo teniendo el mismo error con
    > Excel.XlSortOn que no me lo reconoce.
    >
    > He abierto un proyecto  nuevo, para hacer sólo esta
    > función y tengo el mismo problema. No se si será por
    > las versiones de Office o de alguna .dll que tu
    > tengas y yo no. No se me ocurre nada más.

    Y digo yo, ¿por qué no has indicado desde el primer momento la versión de la biblioteca de Excel que tienes referenciada en tu proyecto? Nos hubiéramos ahorrado mensajes.

    En el ejemplo que te indiqué lo probé con la referencia a la biblioteca de objetos de Excel 2010, pero entiendo que la enumeración XlSortOn al menos existe en la versión 2007; en estos momentos ignoro si existe en versiones anteriores a Excel 2007.


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    miércoles, 17 de octubre de 2012 10:54
    Moderador
  • Hola,

    al final lo que he hecho es quitar a mano todas las referencias a Excel que existian en el fichero .vbproj y he añadido solo una, la más actual. Así parece que no se hace lío y que lo coge.

    He adaptado tu código y al mío y me ha funcionado.

    Muchas gracias por tu ayuda.

    Marta
    miércoles, 17 de octubre de 2012 10:55
  • Pues porque no lo sabía, sino evidentemente que lo hubiera dicho.

    Saludos,

    miércoles, 17 de octubre de 2012 14:15