title: This command requires at least two rows of source data
body: <p>I am getting this error:</p>
  
  <pre><code>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
  </code></pre>
  
  <p>intermittently on this line of code:</p>
  
  <pre><code>xlWorkBook.RefreshAll();
  </code></pre>
  
  <p>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 <strong>always works</strong>; however, for only 1 row of data, the code above <strong>sometimes</strong> works, and sometimes I get the error message above.</p>
  
  <p>In addition to this, the worksheet containing the pivot table is <strong>not</strong> refreshed; however, if I re-open the file, it also <strong>does not</strong> refresh, unless I explicitly refresh it manually.</p>
  
  <p>What is going on here? Why am I getting this error only <em>sometimes?</em></p>
  
  <p>Thank you so much for your guidance.</p>
  
  <p>if at all helpful, i am including the entire method:</p>
  
  <pre><code>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 &lt;= 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 &gt; 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 &gt; 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 &lt;= 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);
      }
  }
  </code></pre>