2010-01-04 63 views
0

數據的一個Excel以另一個Excel我有一個包含約1000的數據線的Excel工作表,我有這些數據複製到滿足條件的另一片材。爲了實現這一點,我寫了一個腳本,問題的複製使用VBScript

For m = 1 To x2 'iterate single column 
    For n = 1 To x4 'iterate PM_DUMP 
    If InStr(PMSheet.cells(n,6).value, dupSingle.cells(m,1).value) > 0 Then 
     ' For p = 1 To y4 
     wsc.Activate 
     wsc.Rows.Item(n).Select 
     wsc.Application.Selection.Copy 
     wsb.Activate 
     wsb.Rows(m).Select 
     wsb.paste 
     wsc.Application.CutCopyMode = False 
     On Error Resume Next 
     Exit For 
    End If 
    Next 
Next 
GetExcel2.Save 

腳本的執行進展順利達certian極限說350行的下一行是越來越複製很好,但後幾整行呈紅色亮點分鐘,我得到一個錯誤「的Excel遇到一個錯誤」,那麼它關閉工作簿,並打開沒有任何數據的新表...

任何有助於解決這個問題是非常讚賞。

與問候, Ramesh.T

+1

發生什麼情況如果去掉上的錯誤恢復下一行? – svinto 2010-01-04 15:20:32

+0

如果我刪除「上的錯誤繼續下一步」,我得到「Excel無法粘貼錯誤」 ...... 任何其他方式來解決這個...我 – 2010-01-04 15:29:20

+0

添加了一些更詳細的我的答案 - 這是你可以試試。 – SqlRyan 2010-01-04 17:09:12

回答

1

我有,有時,發現它簡單通過OLEDB接口處理Excel數據。然後,您只需將兩張工作表視爲兩個表格,使用標準的DataTable操作,而不是更加浮躁的自動化操作。我只是有一個現成的例子讀取數據,但希望你能推斷寫操作,以及:

/// <summary> 
    /// Reads an Excel spreadsheet into a new DataTable. 
    /// </summary> 
    /// <param name="xlsFile">The full file path of the Excel workbook to read from.</param> 
    /// <param name="sheetName">The name of the sheet in the workbook to read.</param> 
    /// <param name="tableName">The name to give the new DataTable that the spreadsheet is read into.</param> 
    /// <param name="firstRowIsHeader">Indicates wheather or not the first row of the spreadsheet is a header row.</param> 
    /// <returns></returns> 
    internal static DataTable XlsToDataTable(string xlsFile, string sheetName, string tableName, bool firstRowIsHeader) 
    { 
     var dt = new DataTable(tableName); 
     var yesNo = firstRowIsHeader ? "Yes" : "No"; 
     string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + xlsFile + ";Extended Properties='Excel 8.0;HDR=" + yesNo + ";IMEX=1';"; 
     using (var ocn = new OleDbConnection(connStr)) 
     { 
      var cmd = new OleDbCommand("Select * from [" + sheetName + "$]", ocn); 
      var datadapt = new OleDbDataAdapter {SelectCommand = cmd}; 
      datadapt.Fill(dt); 
     } 
     return dt; 
    } 
0

這是我的經驗是,.Paste不工作那麼好,所以我建議你換

wsb.paste 

wsb.pastespecial 

你仍然有問題,如果你改變這種狀況?

UPDATE:

我不知道這是否會令執行中的任何區別,但我覺得中間部分是複雜得多,它需要 - 沒有如果更換中間它的工作與此代碼迴路的部分:

wsc.Activate 
    wsc.Rows(m).Item.Copy 
    wsb.Activate 
    wsb.Rows(n).PasteSpecial 

這樣,你也不會需要設置CutCopyMode =假,直到你完全符合循環中完成,所以應該會更快。

+0

是的,我有Paste Special,它做同樣的事情.... 任何其他方式! – 2010-01-04 16:24:36

1

嘗試複製和粘貼組合成一個單一的步驟。替換所有這些代碼

wsc.Activate 
wsc.Rows.Item(n).Select 
wsc.Application.Selection.Copy 
wsb.Activate 
wsb.Rows(m).Select 
wsb.paste 
wsc.Application.CutCopyMode = False 
wsc.Application.CutCopyMode = False 
On Error Resume Next 

wsc.Rows(n).Copy wsb.Rows(m)