Hola, estoy intentando actualizar desde VB.Net una hoja excel con un BackGroundWorker con una barra de progreso que indique en qué momento está dicho proceso y no hay manera de que me funcione.
¿Puede alguien pasarme un código de ejemplo para orientarme o decirme que es lo que tengo mal? Gracias.
Código:Public Sub New() InitializeComponent() BackgroundWorker1.WorkerReportsProgress = True BackgroundWorker1.WorkerSupportsCancellation = False End Sub Sub worker_Dowork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) 'REALIZAMOS EL PROCESO EN SEGUNDO PLANO. ACTUALIZANDO LA HOJA EXCEL pbCalculationProgress.Visible = True Dim anio As String = CStr(Now.Year) 'EXTRAEMOS EL AÑO DE LA FECHA ACTUAL Dim comienzo As DateTime = DateTime.Now e.Result = "" 'OPERACIÓN EN SEGUNDO PLANO Dim worker As BackgroundWorker = TryCast(sender, BackgroundWorker) For i As Integer = 1 To 10 If worker.CancellationPending = True Then e.Cancel = True Exit For Else 'System.Threading.Thread.Sleep(250) worker.ReportProgress(i * 10) End If Next BackgroundWorker1.ReportProgress(2) 'exApp = New Excel.Application 'exLibro = exApp.Workbooks.Open("D:\Documentos\Escaneados\Informe_medico_infarto_2019\Tensión\Historico tension.xlsx") 'exHoja = DirectCast(exLibro.Sheets("Histórico tensión " & anio), Excel.Worksheet) Dim ultimaFila As Int16 = exHoja.Range("A1").End(Excel.XlDirection.xlDown).Row 'VALOR DE LA ÚLTIMA FILA CON DATOS Dim menorFecha As String = Format(exHoja.Range("$A$" & ultimaFila).Value, "dd/MM/yyyy") 'VALOR DE LA ÚLTIMA FECHA INSERTADA EN LA HOJA Dim rowIndex As Int16 = 0 Dim primeraVacia As String = ("A" & ultimaFila + 1) 'PRIMERA FILA VACÍA 'SELECCIONO LA PRIMERA CELDA VACÍA DESPUÉS DE LA ÚLTIMA FILA ESCRITA exHoja.Select() exHoja.Range(primeraVacia).Select() Dim actualizaSQL As String = "SELECT * FROM valores WHERE fecha > '" & CDate(menorFecha) & "';" 'ESTABLECEMOS CONEXIÓN CON POSTGRES If conexion.State = ConnectionState.Open Then conexion.Close() Else conexion.Open() End If Dim SQLadapter As New NpgsqlDataAdapter(actualizaSQL, conexion) Dim ds As New DataSet Dim totallineas = ds.Tables(0).Select(actualizaSQL).Length 'RELLENAMOS EL DATASET Y AÑADIMOS REGISTROS AL EXCEL SQLadapter.Fill(ds) For i = 0 To ds.Tables(0).Rows.Count - 1 'RECORREMOS LAS FILAS DEL DATASET For j = 0 To ds.Tables(0).Columns.Count - 1 'RECORREMOS LAS COLUMNAS DEL DATASET exHoja.Cells(ultimaFila + 1, j + 1) = ds.Tables(0).Rows(i).Item(j) 'RELLENAMOS LAS CELDAS EXCEL CON LOS NUEVOS VALORES Next ultimaFila += 1 Next 'FORMATEAMOS, GUARDAMOS Y CERRAMOS EL EXCEL Dim M_Izq As Short = 63 Dim M_Der As Short = 43 Dim M_Sup As Short = 35 Dim M_Inf As Short = 40 'ORIENTACIÓN DE LA HOJA With exHoja.PageSetup .Orientation = Excel.XlPageOrientation.xlPortrait 'CONFIGURACIÓN DE MÁRGENES .LeftMargin = M_Izq .RightMargin = M_Der .TopMargin = M_Sup .BottomMargin = M_Inf End With 'TÍTULO EN NEGRITA, ALINEADO AL CENTRO DE LAS CELDAS Y COLOR Dim objRango As Excel.Range = exHoja.Range(exHoja.Cells(1, 1), exHoja.Cells(exHoja.UsedRange.Rows.Count, exHoja.UsedRange.Columns.Count)) Dim contador As Integer = exHoja.Rows.Count exHoja.PageSetup.PrintTitleRows = exHoja.Rows(1).Address 'PONEMOS LA FILA DE ENCABEZADO EN TODAS LAS HOJAS IMPRESAS exHoja.PageSetup.PaperSize = Excel.XlPaperSize.xlPaperA4 'TAMAÑO DE PAPEL A4 exHoja.Rows.Item(1).Font.Bold = 1 'NEGRITA exHoja.Rows.Item(1).Font.ColorIndex = 49 'COLOR DEL ENCABEZADO exHoja.Rows.Item(1).HorizontalAlignment = 3 'ALINEADO DEL ENCABEZADO objRango.Borders.LineStyle = 1 'BORDES DE LA HOJA objRango.HorizontalAlignment = 3 'ALINEADO DE LAS COLUMNAS exHoja.Rows.Font.Size = 12 ' TAMAÑO DE LA FUENTE exHoja.Rows.Font.Name = "Adobe Garamond Pro Bold" 'TIPO DE FUENTE exHoja.Columns.AutoFit() 'AJUSTE DE LAS COLUMNAS exHoja.Range("A2:A367").Font.ColorIndex = 5 'COLOR DE LA FUENTE DE LA COLUMNA DE FECHAS exHoja.Range("A2:A367").Interior.Color = Color.White 'COLOR DEL FONDO DE LA COLUMNA FECHAS exHoja.Range("A2:A367").NumberFormat = "dd/mm/yyyy" 'DAMOS FORMATO CONDICIONAL A LAS CELDAS 'FORMATO A COLUMNA DE FECHA Dim NCol As Short = DataGridView1.ColumnCount Dim NRow As Short = DataGridView1.RowCount For Fila As Short = 2 To NRow + 1 For Col As Short = 2 To NCol Dim FC As String = Chr(64 + Col) & Fila exHoja.Range(FC).Select() exHoja.Range(FC).Font.ColorIndex = 1 exHoja.Range(FC).Font.Bold = True Next Next 'FORMATO A COLUMNA SISTÓLICA For Fila As Short = 2 To NRow + 1 For Col As Short = 2 To NCol - 3 Dim FC As String = Chr(64 + Col) & Fila exHoja.Range(FC).Select() If exHoja.Range(FC).Value >= 15 Or exHoja.Range(FC).Value <= 11 Then exHoja.Range(FC).Font.ColorIndex = 3 exHoja.Range(FC).Font.Bold = True End If Next Next 'FORMATO A COLUMNA DIASTÓLICA For Fila As Short = 2 To NRow + 1 For Col As Short = 3 To NCol - 2 Dim FC As String = Chr(64 + Col) & Fila exHoja.Range(FC).Select() If exHoja.Range(FC).Value <= 5 Or exHoja.Range(FC).Value >= 8 Then exHoja.Range(FC).Font.ColorIndex = 3 exHoja.Range(FC).Font.Bold = True End If Next Next 'FORMATO A COLUMNA PULSACIONES For Fila As Short = 2 To NRow + 1 For Col As Short = 4 To NCol - 1 Dim FC As String = Chr(64 + Col) & Fila exHoja.Range(FC).Select() If exHoja.Range(FC).Value <= 50 Or exHoja.Range(FC).Value > 75 Then exHoja.Range(FC).Font.ColorIndex = 3 exHoja.Range(FC).Font.Bold = True End If Next Next 'FORMATO A COLUMNA SATURACIÓN For Fila As Short = 2 To NRow + 1 For Col As Short = 5 To NCol Dim FC As String = Chr(64 + Col) & Fila exHoja.Range(FC).Select() If exHoja.Range(FC).Value <= 96 Then exHoja.Range(FC).Font.ColorIndex = 3 exHoja.Range(FC).Font.Bold = True End If Next Next 'ELIMINAMOS RESIDUOS DE VERSIONES ANTERIORES Dim lastRow As Integer = exHoja.Range("A370").End(Excel.XlDirection.xlUp).Row exHoja.Range("A" & lastRow & ":E" & lastRow).Select() exHoja.Range("A" & lastRow & ":E367").Clear() exHoja.Range("F1:N367").Select() exHoja.Range("F1:N367").Clear() 'ESCRIBIMOS LAS MEDIAS DE CADA COLUMNA lastRow += 1 exHoja.Cells(lastRow, 1).Select() exHoja.Cells(lastRow, 1).Value = "MEDIAS: " exHoja.Cells(lastRow, 1).Font.Color = Color.DarkGreen exHoja.Cells(lastRow, 1).Font.Size = 12 exHoja.Cells(lastRow, 1).Font.Name = "Adobe Garamond Pro Bold" exHoja.Cells(lastRow, 1).Interior.Color = Color.Chartreuse exHoja.Cells(lastRow, 1).HorizontalAlignment = 3 exHoja.Cells(lastRow, 2).FormulaLocal = "=REDONDEAR(PROMEDIO(B2:B" & lastRow - 2 & ");2)" exHoja.Cells(lastRow, 2).HorizontalAlignment = 3 exHoja.Cells(lastRow, 3).FormulaLocal = "=REDONDEAR(PROMEDIO(C2:C" & lastRow - 2 & ");2)" exHoja.Cells(lastRow, 3).HorizontalAlignment = 3 exHoja.Cells(lastRow, 4).FormulaLocal = "=REDONDEAR(PROMEDIO(D2:D" & lastRow - 2 & ");0)" exHoja.Cells(lastRow, 4).HorizontalAlignment = 3 exHoja.Cells(lastRow, 5).FormulaLocal = "=REDONDEAR(PROMEDIO(E2:E" & lastRow - 2 & ");0)" exHoja.Cells(lastRow, 5).HorizontalAlignment = 3 exHoja.Range("A" & lastRow & ":E" & lastRow).Borders.LineStyle = 1 'BORDES DE LA HOJA exHoja.Range("E1").End(Excel.XlDirection.xlDown).Select() 'SELECCIONAMOS LA ÚLTIMA CELDA DE LA COLUMNA E CON DATOS exLibro.Save() exLibro.Close() exApp.Quit() conexion.Close() ' LIMPIAMOS TODOS LOS PROCESOS DE EXCEL ABIERTOS DE LA MEMORIA Dim P As System.Diagnostics.Process Try For Each P In System.Diagnostics.Process.GetProcesses If P.ProcessName.ToUpper Like "*EXCEL*" Then P.Kill() End If Next Catch End Try GC.WaitForPendingFinalizers() GC.Collect() conexion.Close() Dim duracion As TimeSpan = DateTime.Now - comienzo e.Result = "DURACIÓN: " & duracion.TotalSeconds.ToString() & " SEGUNDOS." End Sub Sub worker_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) 'AQUÍ ACTUALIZAMOS LA BARRA DE PROGRESODE LA OPERACIÓN pbCalculationProgress.Value = e.ProgressPercentage percent_lbl.Text = (e.ProgressPercentage.ToString() & "%") End Sub Sub worker_RunWorkerCompleted(sender As System.Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) 'AQUÍ MOSTRAMOS QUE EL PROCESO ESTÁ ACABADO Dim Message As String = "OK, HOJA EXCEL ACTUALIZADA CON ÉXITO." Dim Caption As String = " ACTUALIZACIÓN " Dim Icono As MessageBoxIcon = MessageBoxIcon.Information Dim Buttons As MessageBoxButtons = MessageBoxButtons.OK Dim Resultado As DialogResult 'MOSTRAMOS EL MESSAGEBOX Resultado = MessageBox.Show(Message, Caption, Buttons, Icono) pbCalculationProgress.Value = 0 End Sub