c# - verde - quitar flechas en excel
¿Cómo puedo evitar que se muestre el triángulo de advertencia verde en una celda vinculada a la fórmula(C#Interoperación de Excel)? (3)
Este triángulo verde indica que la fórmula en la celda dada contiene un error de acuerdo con ciertas reglas ( más información sobre esto ).
Puede habilitar / deshabilitar este comportamiento en el nivel de aplicación de Excel, cambiando el valor de la propiedad ErrorCheckingOptions.BackgroundChecking
. Código de muestra:
Excel.Application excelApp = new Excel.Application();
excelApp.ErrorCheckingOptions.BackgroundChecking = false;
Tengo esta fórmula que genera los datos correctos:
var avgWeeklyDeliveriesCell = (Range)_xlSheetDelPerf.Cells[curDelPerfRow, AVG_WEEKLY_DELIVERIES_COLUMN];
avgWeeklyDeliveriesCell.Value2 = string.Format("=ROUND(AVERAGE(C{0}:I{0}), 2)", curDelPerfRow);
El problema es que sobredimensiona / microgestiona asuntos, y se pregunta si una celda adyacente (la de la izquierda, supongo, "Órdenes totales") debería incluirse en la fórmula.
Específicamente, si hago clic en el triángulo verde, un "!" el glifo aparece; haciendo clic que tiene un mensaje, "La fórmula omite las células adyacentes "
Y entonces, etiqueta todas las celdas unidas a la fórmula con un triángulo verde.
Así es como se ve:
Como puede ver, la columna con la fórmula siempre luce el pequeño triángulo verde en la esquina noroeste. Y la fórmula es correcta (promediando los valores de "Sun Orders" a "Sat Orders" inclusive).
¿Qué puedo hacer para decirle a Excel que lo "refresque" y evite que se muestren los triángulos verdes?
ACTUALIZAR
Ambas respuestas hasta ahora parecen razonables, pero tampoco funcionan.
Debo admitir, sin embargo, que mi principal objeto de Excel es un poco diferente de lo que tiene Varocarbas. Mi código es:
using Microsoft.Office.Interop.Excel;
using Application = System.Windows.Forms.Application;
. . .
private ApplicationClass _xlApp;
. . .
_xlApp = new ApplicationClass { UserControl = true };
_xlApp.ErrorCheckingOptions.BackgroundChecking = false;
IOW, estoy usando ApplicationClass en lugar de Excel.Application.
ACTUALIZACIÓN 2
Cambié mi código a esto (ya no uso ApplicationClass):
using Excel = Microsoft.Office.Interop.Excel;
. . .
//private Excel.ApplicationClass _xlApp;
private Excel.Application _xlApp = new Excel.Application();
. . .
//_xlApp = new Excel.ApplicationClass { UserControl = true };
_xlApp = new Excel.Application();
_xlApp.ErrorCheckingOptions.BackgroundChecking = false;
... pero todavía tengo los pequeños triángulos verdes. Peor aún, estoy empezando a escuchar a Bobby Goldsboro cantando "Dios no hizo pequeños triángulos verdes" en el oído de mi mente.
ACTUALIZACIÓN 3
Creo que el problema probablemente no sea "cerrar correctamente los procesos de Excel". En el Administrador de tareas, veo bastantes instancias "EXCEL.EXE * 32". Debo estar fallando en los procesos de Excel; aquí está mi código que pensé que debería hacer eso:
foreach (DataRowView drv in selectedUnits)
{
Application.DoEvents();
_xlApp = new Excel.Application();
_xlApp.ErrorCheckingOptions.BackgroundChecking = false;
_xlBook = _xlApp.Workbooks.Add(Type.Missing);
_xlBook.Worksheets.Add(Type.Missing, Type.Missing, Type.Missing, Type.Missing);
_xlApp.ActiveWindow.DisplayGridlines = false;
_xlApp.SheetsInNewWorkbook = 1; // prevent the empty "sheet 2" etc.
_xlSheets = _xlBook.Worksheets;
_xlSheet = (Excel.Worksheet)_xlSheets.Item[1];
if (_xlSheet != null)
{
_xlSheet.Name = ProduceUsageByMonthSheetName;
. . .
var filename = Properties.Settings.Default.OutputDirectory + shortUnitName + ".xlsx";
if (File.Exists(filename))
{
File.Delete(filename);
}
_xlBook.SaveAs(Properties.Settings.Default.OutputDirectory + shortUnitName + ".xlsx", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
Marshal.ReleaseComObject(_xlSheet);
_xlBook.Close(false, null, null);
Marshal.ReleaseComObject(_xlBook);
_xlApp.DisplayAlerts = false;
_xlApp.Quit();
_xlSheets = null;
}
_xlSheet = null;
_xlBook = null;
_xlApp = null;
OnChanged(EventArgs.Empty);
} // foreach (DataRowView drv in selectedUnits)
ACTUALIZACIÓN 4
No estoy del todo seguro de que esta es la mejor manera de hacerlo, pero el orden de liberación tiene sentido para mí (hoja, hojas, libro, aplicación), y empíricamente hablando, ya no solo no estoy viendo los pequeños meñiques verdes, pero no tengo más ejemplos extraños / superfluos de Excel al acecho de las entrañas de la devbox.
Esto es lo que cambié el lanzamiento anterior y el lío nulo a:
. . .
}
Marshal.ReleaseComObject(_xlSheet);
Marshal.ReleaseComObject(_xlSheets);
_xlBook.Close(false, null, null);
Marshal.ReleaseComObject(_xlBook);
_xlApp.DisplayAlerts = false;
_xlApp.Quit();
} // foreach (DataRowView drv in selectedUnits)
Marshal.ReleaseComObject(_xlApp);
Puede que no lo necesite todo (como _xlBook.Close () y _xlApp.Quit), pero al menos funciona de esta manera.
Intenta agregar la siguiente línea
avgWeeklyDeliveriesCell.Errors[XlErrorChecks.xlInconsistentFormula].Ignore = true;
Mi respuesta es bastante cercana a la respuesta de Ivan. Otros tipos de error para celdas se pueden encontrar aquí en msdn .
avgWeeklyDeliveriesCell.Errors[XlErrorChecks.xlOmittedCells].Ignore = true;