使用VBSCript将数据一个Excel复制到另一个Excel中的问题

我有一个包含大约1000行数据的excel表单,我将这些数据复制到另一个表单满足条件。 为了实现这个我写了一个脚本,

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遇到一个错误”然后它closures工作簿并打开一个没有任何数据的新工作表…

任何帮助解决这个问题,非常感谢。

关心,Ramesh.T

尝试将复制和粘贴合并为一个步骤。 replace所有这些代码

 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) 

我偶尔发现通过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; } 

这是我的经验,粘贴不能很好地工作,所以我build议你改变

 wsb.paste 

 wsb.pastespecial 

如果你改变了,你还有问题吗?

更新:

我不确定这是否会在执行上有所作为,但我认为中间部分比需要的更复杂 – 如果用这段代码replace循环的中间部分,它是否工作正常:

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

这样,你也不需要设置CutCopyMode = False,直到你完成了循环,所以它应该更快。