排序功能 Excel VB.Net

Posted

技术标签:

【中文标题】排序功能 Excel VB.Net【英文标题】:Sort function Excel VB.Net 【发布时间】:2021-12-23 23:36:33 【问题描述】:

我使用 Microsoft.Office.Interop.Excel 库。我所做的是在 excel 中输入警报 我不知道该怎么做是通过 vb.net 我按日期和时间订购了警报,这样它就可以向我显示第一次输入的最后一个警报。我不能使用宏,因为我已经尝试过使用模板,但它给了我错误,因为在另一台 PC 上他们使用 Open Office。有没有出现什么解决办法。非常感谢你的一切。一切顺利。

我附上插入警报的代码。

Public Sub GuardarAlarmas()
    Dim fileTest As String = "C:\Users\DT SCADA\Desktop\Historicos\Alarmas\Año 2021\Alarmas 2021_11_noviembre.xlsm"
    Dim oExcel As Object
    Dim oBook As Workbook
    Dim oSheet As Worksheet
    oExcel = CreateObject("Excel.Application")
    If File.Exists(fileTest) Then
        oBook = oExcel.Workbooks.Open(Filename:="C:\Users\DT SCADA\Desktop\Historicos\Alarmas\Año 2021\Alarmas 2021_11_noviembre.xlsm", ReadOnly:=False)
    End If
    oSheet = oExcel.Worksheets(1)
    'Cuento las líneas escritas en cada fila y le pongo un +6 porque empiezo en B6 y si quiero escribir en B7,B8 y viceversa necesito ponerle el +6
    Dim paco = oSheet.Range("A6").CurrentRegion.Rows.Count + 6
    Console.WriteLine(paco.ToString)
    'Aquí recojo el texto de estado, descripción, hora y día
    oSheet.Range("A" + paco.ToString).Value = Date.Today
    oSheet.Range("B" + paco.ToString).Value = TimeOfDay
    oSheet.Range("C" + paco.ToString).Value = "ACTIVA"
    oSheet.Range("D" + paco.ToString).Value = "DESCRIPCIÓN"
    'Aquí pongo un borde negro en el Excel
    Dim Range = oSheet.Range("A" + paco.ToString + ":D" + paco.ToString)
    Range.Borders.Color = Color.Black
    oSheet.UsedRange.Select()
    oSheet.Sort.SortFields.Clear()
    oSheet.Sort.SortFields.Add(oSheet.UsedRange.Columns("A"), Excel.XlSortOn.xlSortOnValues, Excel.XlSortOrder.xlDescending, System.Type.Missing, Excel.XlSortDataOption.xlSortNormal)
    Dim sort = oSheet.Sort
    sort.SetRange(oSheet.Range("A6:D1200"))
    sort.Header = Excel.XlYesNoGuess.xlYes
    sort.MatchCase = False
    sort.Orientation = Microsoft.Office.Interop.Excel.XlSortOrientation.xlSortColumns
    sort.SortMethod = Microsoft.Office.Interop.Excel.XlSortMethod.xlPinYin
    sort.Apply()
    Try
        'Aquí uso el DisplayAlerts, para que directamente me confirme que deseo guardar el archivo.
        oExcel.DisplayAlerts = False
        'Aquí guardo todos los datos introducidos
        oBook.SaveAs(Filename:="C:\Users\DT SCADA\Desktop\Historicos\Alarmas\Año 2021\Alarmas 2021_11_noviembre.xlsm", AccessMode:=3, ConflictResolution:=2, Local:=True)
        'Aquí pongo el DisplayAlerts a true, por si acaso este queda invalidado en toda la aplicación.
        oExcel.DisplayAlerts = True
        oBook.Close()
        oExcel.Quit()
    Catch
        'Si hubiese algún error en excel, mataría todos los procesos.
        Dim pListOfProcesses() As Process
        Dim pExcelProcess As System.Diagnostics.Process
        pListOfProcesses = pExcelProcess.GetProcesses
        For Each pExcelProcess In pListOfProcesses
            If pExcelProcess.ProcessName.ToUpper = "EXCEL" Then
                pExcelProcess.Kill()
            End If
        Next
    End Try
End Sub

Download Excel Alarmas

【问题讨论】:

目前还不清楚您在这里尝试做什么。这张包含警报的数据表是用您的 vb.net 项目生成的,然后写入 excel 吗?也许您需要用迄今为止的最佳尝试来更新您的问题。 您好,我附上了一段代码,说明如何使用 vb.net 中的 Microsoft Excel 库进行插入。那么它会解决这个问题吗?虽然我真正想要的是按日期和时间排序。所以我写了一篇文章来解释这个问题。 这个链接 - social.msdn.microsoft.com/Forums/lync/en-US/… 对这个问题有帮助吗? 是的,帮帮我。但是排序失败了,你可以证明我的代码。我上传代码 + 链接 Excel ;) 有人可以测试我的代码吗?添加了排序功能以对 B 列和 C 列进行排序,但我无法对其进行排序。 B 列和 C 列用于按日期和时间排序。理论上最早的日期和最高的时间 【参考方案1】:

我把解决方案留给你,最终我可以按照自己的意愿制造计算机。非常感谢大家的帮助。一切顺利。

  Public Sub GuardarAlarmas()
        'Creo la carpeta donde almacenare las alarmas de origen y la ruta del archivo del origen
        Dim MES = DateTime.Now.ToString("MM")
        Dim rutaDirectorioOrigen = FormMain.rutaHistoricoAlarmasOrigen + "Año " + DateTime.Now.Year.ToString
        My.Computer.FileSystem.CreateDirectory(rutaDirectorioOrigen)
        Dim rutaArchivoOrigen As String = rutaDirectorioOrigen + "\Alarmas " + DateTime.Now.Year.ToString + "_" + DateTime.Now.Month.ToString + "_" + MonthName(MES.ToUpper) + ".xlsm"
        'Creo la carpeta donde almacenaré las alarmas de destino y la ruta del archivo del destino
        Dim rutaDirectorioDestino = FormMain.rutaHistoricoAlarmasDestino + "Año " + DateTime.Now.Year.ToString
        My.Computer.FileSystem.CreateDirectory(rutaDirectorioDestino)
        Dim rutaArchivoDestino As String = rutaDirectorioDestino + "\Alarmas " + DateTime.Now.Year.ToString + "_" + DateTime.Now.Month.ToString + "_" + MonthName(MES.ToUpper) + ".xlsm"
        'Aqui declaro el objeto Aplicación excel, su libro y su hoja
        Dim oExcel As Object
        Dim oBook As Excel.Workbook
        Dim oSheet As Excel.Worksheet
        'Inicializo la aplicacion Excel
        oExcel = CreateObject("Excel.Application")
        'Si no existe el archivo de origen en excel, cojo la plantilla creada en excel y luego creo el Archivo de Ruta de Origen
        If Not File.Exists(rutaArchivoOrigen) Then
            oBook = oExcel.Workbooks.Open(Filename:=FormMain.rutaHistoricoAlarmasOrigen + "PlantillaExcel.xlsm", ReadOnly:=False)
            oBook.SaveAs(Filename:=rutaArchivoOrigen, AccessMode:=3, ConflictResolution:=2, Local:=True)
            oBook.Close()
        End If
        'Si no existe el archivo de origen abro ese archivo
        If File.Exists(rutaArchivoOrigen) Then
            oBook = oExcel.Workbooks.Open(Filename:=rutaArchivoOrigen, ReadOnly:=False)
        End If
        'Elijo la primera hoja del excel
        oSheet = oExcel.Worksheets(1)
        'Cuento las líneas escritas en cada fila y le pongo un +6 porque empiezo en B6 y si quiero escribir en B7,B8 y viceversa necesito ponerle el +6
        Dim paco = oSheet.Range("B6").CurrentRegion.Rows.Count + 1
        'Aquí recojo el texto de estado, descripción, hora y día
        Me.Label_Texto_Alarma.Text = arrayTexto(Me.Label_Numero_Alarma.Text)
        Dim estado = Me.Label_Estado_Alarma.Text
        Dim descrip = Me.Label_Texto_Alarma.Text
        Dim hora = TimeOfDay
        Dim dia = Date.Today.Day.ToString
        'Introduzco los datos de la alarma
        oSheet.Range("B" + paco.ToString).Value = dia
        oSheet.Range("C" + paco.ToString).Value = hora
        oSheet.Range("D" + paco.ToString).Value = estado
        oSheet.Range("E" + paco.ToString).Value = descrip
        'Si el estado es ACTIVA, el color será rojo. Si es inactiva será Verde y si es acusada será NARANJA
        If (estado.Equals("ACTIVA")) Then
            oSheet.Range("B" + paco.ToString + ":E" + paco.ToString).Font.Color = Color.Red
        End If
        If (estado.Equals("INACTIVA")) Then
            oSheet.Range("B" + paco.ToString + ":E" + paco.ToString).Font.Color = Color.Green
        End If
        If (estado.Equals("ACUSADA")) Then
            oSheet.Range("B" + paco.ToString + ":E" + paco.ToString).Font.Color = Color.Orange
        End If
        'Aquí pongo un borde negro en el Excel
        Dim rangos = oSheet.Range("B" + paco.ToString + ":E" + paco.ToString)
        rangos.Borders.Color = Color.Black
        oSheet.Sort.SortFields.Clear()
        oSheet.UsedRange.Select()
        oSheet.Sort.SortFields.Add(oSheet.Range("B6:B1200"), Excel.XlSortOn.xlSortOnValues, Excel.XlSortOrder.xlDescending, System.Type.Missing, Excel.XlSortDataOption.xlSortNormal)
        oSheet.Sort.SortFields.Add(oSheet.Range("C6:C1200"), Excel.XlSortOn.xlSortOnValues, Excel.XlSortOrder.xlDescending, System.Type.Missing, Excel.XlSortDataOption.xlSortNormal)
        Dim sort = oSheet.Sort
        sort.SetRange(oSheet.Range("B6:E1200"))
        sort.Header = Excel.XlYesNoGuess.xlYes
        sort.MatchCase = False
        sort.Orientation = Microsoft.Office.Interop.Excel.XlSortOrientation.xlSortColumns
        sort.SortMethod = Microsoft.Office.Interop.Excel.XlSortMethod.xlPinYin
        sort.Apply()
        Try
            'Aquí uso el DisplayAlerts, para que directamente me confirme que deseo guardar el archivo.
            oExcel.DisplayAlerts = False
            'Aquí guardo todos los datos introducidos
            oBook.SaveAs(Filename:=rutaArchivoOrigen, AccessMode:=3, ConflictResolution:=2, Local:=True)
            oBook.SaveAs(Filename:=rutaArchivoDestino, AccessMode:=3, ConflictResolution:=2, Local:=True)
            'Aquí pongo el DisplayAlerts a true, por si acaso este queda invalidado en toda la aplicación.
            oExcel.DisplayAlerts = True
            oBook.Close()
            oExcel.Quit()
        Catch
            'Si hubiese algún error en excel, mataría todos los procesos.
            Dim pListOfProcesses() As Process
            Dim pExcelProcess As System.Diagnostics.Process
            pListOfProcesses = pExcelProcess.GetProcesses
            For Each pExcelProcess In pListOfProcesses
                If pExcelProcess.ProcessName.ToUpper = "EXCEL" Then
                    pExcelProcess.Kill()
                End If
            Next
        End Try
    End Sub
    Public WithEvents Label_Hora_Alarma As System.Windows.Forms.Label
End Class

【讨论】:

既然您的问题已经解决,请考虑accepting your answer。

以上是关于排序功能 Excel VB.Net的主要内容,如果未能解决你的问题,请参考以下文章

poi导出excel有没有设置排序功能

按 Excel 数据透视表中的“总计”列排序?

Excel怎么根据出生日期按年龄大小进行排序

JS实现首字母排序

怎样在EXCEL中给年龄进行排序?

vector的排序功能