I am getting this error:
This command requires at least two rows of source data. You cannot use the command on a selection in only one row. Try the following: - If you're using an advanced filter, select a range of cells that contains at least two rows of data. Then click the Advanced Filter command again. - I you're creating a PivotTable, type a cell reference or select a range that includes at least two rows of data
intermittently on this line of code:
xlWorkBook.RefreshAll();
There are two worksheets. One has a pivot table and one has raw data. Sometimes there is only one row of data. For multiple rows of data the line of code above always works; however, for only 1 row of data, the code above sometimes works, and sometimes I get the error message above.
In addition to this, the worksheet containing the pivot table is not refreshed; however, if I re-open the file, it also does not refresh, unless I explicitly refresh it manually.
What is going on here? Why am I getting this error only sometimes?
Thank you so much for your guidance.
if at all helpful, i am including the entire method:
private void SortandCreateFile(string column, string email, string emailStartPos) { string replacetext = ""; try { var valueRange = xlWorkSheet.get_Range(column + emailStartPos, column + range.Rows.Count.ToString()); var deleteRange = valueRange; xlApp.Visible = false; int startpos = 0; int endPos=0; bool foundStart = false; Excel.Range rng = xlWorkSheet.get_Range(column + "1", column + range.Rows.Count.ToString()); string tempstring = "d"; int INTemailStartPos = Convert.ToInt16(emailStartPos); for (int rCnt = INTemailStartPos; rCnt <= rng.Count; rCnt++) { Excel.Range cell = (Excel.Range)rng[rCnt, 1]; try { if (cell.Value2 != null) tempstring = cell.Value2.ToString(); else { startpos = rCnt; releaseObject(cell); ///////// break; } } catch (Exception ee) { MessageBox.Show(ee.ToString()); } //grab the text from column link texdtbox Excel.Range rngLinkColumn; Excel.Range replacetextcell=null; if (FormControls.ColumnLink.Length > 0) { rngLinkColumn = xlWorkSheet.get_Range(FormControls.ColumnLink + "1", FormControls.ColumnLink + range.Rows.Count.ToString()); replacetextcell = (Excel.Range)rngLinkColumn[rCnt, 1]; } //locate email if (cell.Value2.ToString() == email ) { //we found the starting position of the email we want! //this will tell us which row of data to start from startpos = rCnt; if (FormControls.ColumnLink.Length > 0) replacetext = replacetextcell.Value2.ToString(); releaseObject(cell); ///////// break; } releaseObject(cell); } int foundstartminusONE = startpos - 1; int rngcount = rng.Count + INTemailStartPos; //delete everything from the top UNTIL the row of the email address that we need if (startpos != INTemailStartPos) { deleteRange = xlWorkSheet.get_Range(column + INTemailStartPos.ToString() + ":" + "CF" + foundstartminusONE.ToString(), Type.Missing); deleteRange = deleteRange.EntireRow; deleteRange.Delete(Excel.XlDeleteShiftDirection.xlShiftUp); } for (int rCnt = INTemailStartPos; rCnt <= rng.Count; rCnt++) { Excel.Range cell = (Excel.Range)rng[rCnt, 1]; try { if (cell.Value2 != null ) tempstring = cell.Value2.ToString(); else { endPos = rCnt - 1; releaseObject(cell);//////// break; } } catch (Exception ee) { //MessageBox.Show(ee.ToString()); } //locate email if (cell.Value2.ToString() != email ) { //we found where the last email address is that we need //this is where the issue is occurring i think with the deleting the last row endPos = rCnt; releaseObject(cell);//////// break; } releaseObject(cell); } //delete all the stuff AFTER the email address that we need if (endPos != 0) { deleteRange = xlWorkSheet.get_Range(column + endPos + ":" + "CF" + rngcount.ToString(), Type.Missing); deleteRange = deleteRange.EntireRow; deleteRange.Delete(Excel.XlDeleteShiftDirection.xlShiftUp); } //when the user opens the excel file, we want the focus to be here var rangehome = xlWorkSheet.get_Range(FormControls.FocusOn, FormControls.FocusOn); xlWorkSheet.Activate(); rangehome.Select(); string filename = xlWorkBook.Path + @"\" + email + ".xlsx"; string fileSubstring = filename.Substring(0, filename.IndexOf(".xlsx")); string randomfileString = Guid.NewGuid().ToString("N").Substring(0, 10) + ".xlsx"; string targetfilenameRename = fileSubstring + randomfileString; //((Excel.Worksheet)this.Application.ActiveWorkbook.Sheets[FormControls.WorksheetFocus]).Activate(); //((Excel.Worksheet)Excel.Application.ActiveWorkbook.Sheets[1]).Activate(); Excel.Worksheet xlWorkSheetFocus = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(FormControls.WorksheetFocus); xlWorkSheetFocus.Activate(); xlWorkBook.SaveAs(targetfilenameRename, Excel.XlFileFormat.xlWorkbookDefault, Type.Missing, Type.Missing, false, false, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Excel.XlSaveConflictResolution.xlLocalSessionChanges, Type.Missing, Type.Missing); try { xlWorkBook.RefreshAll(); } catch { } xlWorkBook.Save(); string targetfile = xlWorkBook.Path + @"\" + FormControls.FileName + " - " + email.Substring(0, email.IndexOf("@")) + ".xlsx"; System.IO.File.Copy(targetfilenameRename, targetfile, true); string body = FormControls.eMailBody; body = body.Replace("%replacetext%", replacetext); //replace %replacetext% in body string targetfileSubstring = targetfile.Substring(0, targetfile.IndexOf(".xlsx")); string randomString = Guid.NewGuid().ToString("N").Substring(0, 10)+".xlsx"; string targetfileRename = targetfileSubstring+randomString; while (true) { try { SendEmail(targetfile, email, FormControls.eMailSubject, body,FormControls.eMailFrom); } catch (Exception ee) { MessageBox.Show(ee.ToString()); continue; } // all is good break; } releaseObject(valueRange); releaseObject(deleteRange); File.Copy(targetfile, targetfileRename, true); } catch (Exception e) { MessageBox.Show(e.ToString()); } finally { //DisposeMe(); // Release all COM RCWs. // The "releaseObject" will just "do nothing" if null is passed, // so no need to check to find out which need to be released. // The "finally" is run in all cases, even if there was an exception // in the "try". // Note: passing "by ref" so afterwords "xlWorkSheet" will // evaluate to null. See "releaseObject". releaseObject(range); releaseObject(xlWorkSheet); releaseObject(xlWorkBook); // The Quit is done in the finally because we always // want to quit. It is no different than releasing RCWs. if (xlApp != null) { xlApp.Quit(); } releaseObject(xlApp); } }