2017-06-07 9 views
0

asp.net Webアプリケーションのドロップダウンメニューを使用して、ユーザーが選択したシートを除いてforループを使用してExcelシートを削除しようとしています。だから、私はC#でコードを書いています。c#delete forループを使用してシートをExcel

int index = DropDownList1.SelectedIndex; 
int max = DropDownList1.Items.Count; 
int i=3; 
for (i=1; i <= max; i++) 
{ 
    if (i != index+1) 
    { 
     Excel.Worksheet worksheets = (Excel.Worksheet)xlWorkBook.Sheets[i]; 
     worksheets.Delete(); 
    } 

} 

そして、私はこのようなエラーになっています -

System.Runtime.InteropServices.COMException:「無効なインデックスを。 (HRESULTからの例外:0x8002000B(DISP_E_BADINDEX))あなたはこのようなあなたのループを変更する必要があるので、」

+0

インデックス作成がゼロから始まると思います!あなたは1から始まっています。本の中に2つのワークシートがありますか? [0]&[1] – Wheels73

+0

Excelファイルにはいくつのワークシートがありますか? –

+0

ワークブックには3つのワークシートがあります。そして私はシートのインデックスは1から始まっていることを研究しました – Karan

答えて

2

両方xlWorkBook.SheetsDropDownList1.SelectedIndexインデックスは、ない10開始時刻:

int index = DropDownList1.SelectedIndex; 
int max = DropDownList1.Items.Count; 

for (int i = 0; i < max; i++) 
{ 
    if (i != index) 
    { 
     Excel.Worksheet worksheets = (Excel.Worksheet)xlWorkBook.Sheets[i]; 
     worksheets.Delete(); 
    } 
} 
+0

申し訳ありません、働いていません。同じエラーが発生しています。 – Karan

+0

@カランでは '私はあなたがエラーを取得していますか? –

0

を覚えておいてくださいワークシートを削除している間にインデックス位置が変更される可能性があるので、正しいインデックスを取得するためにint値を減らす必要があります。そうでなければ、後でシートを削除するときに同じ例外が発生します。削除するには

int index = DropDownList1.SelectedIndex; 
int max = DropDownList1.Items.Count; 

for (int i = 0; i < max; i++) 
{ 
    if (i != index) 
    { 
     Excel.Worksheet worksheet = (Excel.Worksheet)xlWorkBook.Sheets[i]; 
     worksheet.Delete(); 

     //decrease the value 
     --i; 
    } 
} 
0

私はループを逆転させても何のこともわかりませんが、動作し始めました。

for (i=max; i > 0; i--) 
{ 
    if (i != index+1) 
    { 
     Excel.Worksheet worksheets = (Excel.Worksheet)xlWorkBook.Sheets[i]; 
     worksheets.Delete(); 
    } 

} 
+0

シート2を削除するとシート3 *はシート2になります(2つ上のすべてのインデックスが1つ下に降ります)。 – mjwills

+0

このように、最高から最低に進むことでこの問題は回避されます。影響を受けるのは、既に参照したインデックスのみです。 – mjwills

0

Lets index = 5;
エラーは、インデックス5のシートが利用できないことを意味します。
ワークシートのインデックスが0ではなく1で始まることが間違いありません。

私はあなたのコードでいくつかの変更を行っています。 Bad Index Errorをスキップするためにブック内のSheets数を使って現在のインデックス(i)の追加チェックを行っています。これがうまくいくと思っています。

using System; 
using Excel = Microsoft.Office.Interop.Excel; 
public partial class WebForm1 : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    {  
     int i = 3, max = 5, index = 1; 
     string filePath = @"C:\Users\anandra\Desktop\Book1.xlsx"; 
     Excel.Application excelApp = new Excel.Application(); 
     Excel.Workbook workBook = excelApp.Workbooks.Open(filePath); 
     for (i = 1; i <= max; i++) 
     { 
      //Adding an extra check here to skip your error 
      if (i != index + 1 && workBook.Sheets.Count>i) 
      { 
       Excel.Worksheet worksheets = (Excel.Worksheet)workBook.Sheets[i]; 
       excelApp.DisplayAlerts = false; 
       worksheets.Delete(); 
       excelApp.DisplayAlerts = true; 
       //Decreasing the value of index and i as after deleting the sheet the index will start agarin from 1. 
       i--; 
       index--; 
      } 
     } 
    } 
} 
関連する問題