VB操作Excel 2016无法将带格式工作表复制到新工作簿报错求助
核心错误原因
你遇到的报错90%以上来源于源工作簿和目标工作簿分属两个不同的Excel.Application实例,Excel原生不支持跨实例复制带格式/合并单元格的工作表,直接调用Copy方法必然触发报错。
其余可能的诱因包括:模板工作表被保护、保存时使用的xlExcel5(Excel 97-2003)格式不兼容模板里的新格式特性、COM对象释放异常导致的Excel进程残留锁文件。
修复后可运行代码
' 注意:xlApp要使用你打开源工作簿xlWorkBook的同一个Excel.Application实例,不要新建实例 xlWorkBook1 = xlApp.Workbooks.Add ' 用同一个实例创建目标工作簿 Dim sourceWorkSheet As Excel.Worksheet = CType(xlWorkBook.Sheets("TempPage"), Excel.Worksheet) ' 直接把源工作表复制到目标工作簿的最后一个工作表之后 sourceWorkSheet.Copy(After:=xlWorkBook1.Sheets(xlWorkBook1.Sheets.Count)) ' 删除目标工作簿默认生成的Sheet1,避免冗余 Dim defaultSheet As Excel.Worksheet = CType(xlWorkBook1.Sheets("Sheet1"), Excel.Worksheet) defaultSheet.Delete() ' 保存逻辑保持不变,建议优先用xlsx格式如果不需要兼容极老版本Excel,格式兼容性更好 Dim fileName As String = sourceWorkSheet.Range("B3").Value.ToString() & ".xls" xlWorkBook1.SaveAs(System.IO.Path.Combine(BTPath, fileName), Excel.XlFileFormat.xlExcel5) If RadioButton3.Checked Then xlWorkBook1.SaveAs(System.IO.Path.Combine(UnpaidPath, fileName), Excel.XlFileFormat.xlExcel5) End If ' 操作完成后务必释放COM对象,避免Excel残留进程锁文件 System.Runtime.InteropServices.Marshal.ReleaseComObject(defaultSheet) System.Runtime.InteropServices.Marshal.ReleaseComObject(sourceWorkSheet) xlWorkBook1.Close() System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkBook1)
额外注意事项
- 如果模板工作表设置了保护,需要先调用
sourceWorkSheet.Unprotect(密码)再执行复制操作 - 如果不需要兼容Excel 2003及更早版本,建议将保存格式替换为
Excel.XlFileFormat.xlOpenXMLWorkbook,后缀改为.xlsx,可避免格式兼容导致的复制失败 - 如果只需要复制指定范围的内容和格式,用以下代码替代工作表复制即可:
Dim sourceRange As Excel.Range = sourceWorkSheet.UsedRange Dim targetSheet As Excel.Worksheet = CType(xlWorkBook1.Sheets(1), Excel.Worksheet) sourceRange.Copy(targetSheet.Range(sourceRange.Address))
内容的提问来源于stack exchange,提问作者Anthony Cox
相关产品推荐
相关产品推荐

