2010-01-04 65 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)