在Excel 2010 vs 2013中保存embedded的OLE对象(Excel文档)

我试图从当前/打开工作簿保存一个embedded的OLE对象(excel文档)到用户PC上的位置。 这个OLE对象是在macros执行过程中被填充的模板/仪表板。 这部分macros的目标是首先testing文件是否存在于用户C盘上。 如果它确实存在,它将打开该文件并将工作簿variables设置为新打开的文档。 据我所知,这可以在Excel 2010和Excel 2013之间完美地工作。在用户没有将文件保存到C驱动器的情况下,macros需要打开OLE对象,然后将其保存到驱动器中。 一旦完成,macros指向该位置并打开文件。

下面的代码在Excel 2013中可以工作100%,但是在Excel 2010中,只要我尝试将文件保存到驱动器,macros就会崩溃。 如果我以break模式运行macros,保存工作正常,只是在运行时导致崩溃。 有没有可能使用DoEvents或Application.Wait在这里? 我对保存文档和计算机资源的技术有点不熟悉。

我注意到的一些事情:

  1. 崩溃不会生成任何错误代码。 它只是给“已停止响应”
  2. 我已经尝试了多个版本的.SaveAs文件格式:= 52 vs .SaveCopyAs。 这两种方法在2010年都会产生相同的崩溃。
  3. OLE对象总是以“Worksheet in”的forms打开,如果我能以某种方式在全新的工作簿中打开这个对象,那将会很好。 我认为这个崩溃可能与如何将对象打开为“工作表”而不是其自己的工作簿相关。

码:

Dim uName As String Dim fName As String Dim wbk As Workbook Dim sumWB as Workbook Dim cbrWB as Workbook Set cbrWB = Workbooks("PreviouslySet") uName = Left(Environ("AppData"), Len(Environ("AppData")) - 16) fName = uName & "\OTPReport" & ".xlsm" If Dir(fName) = "" Then Set oEmbFile = cbrWB.Worksheets("CBRDATA").OLEObjects("OTPReport") oEmbFile.Verb 0 For Each wbk In Workbooks If InStr(1, wbk.Name, "Worksheet in", vbTextCompare) > 0 And InStr(1, wbk.Name, Left(cbrWB.Name, Round(Len(cbrWB.Name) / 2)), vbTextCompare) > 0 Then Set sumWB = Workbooks(wbk.Name) End If Next wbk With sumWB .Activate .Application.DisplayAlerts = False '==ISSUE EXISTS HERE== .SaveCopyAs (fName) .Close End With Set sumWB = Nothing Set sumWB = Workbooks.Open(fName) Else: Set sumWB = Workbooks.Open(fName) End If 

使用实际的embedded式COM对象,而不是使用.Verb 0给出的默认操作。

如果OLEObjects正由COM服务器pipe理(它是.Object属性),则它将公开对基础对象的引用。 在你的情况下,因为你有一个embedded式的工作簿,它只是一个Workbook对象,就像你在VBA中遇到的其他Workbook Workbook对象一样。 所有你需要做的就是打电话。保存在上面:

oEmbFile.Object.SaveAs fName

然后,您可以简单地跳过与尝试在当前Excel服务器中查找相关的体操的其余部分。

在这里发布我的解决scheme,以显示2010年和2013年似乎正在工作。该解决scheme是在用户COMIntern的帮助下开发的。 我将把这个解决scheme归功于他的回答。

更新的代码w /说明:

 Dim uName As String Dim fName As String uName = Left(Environ("AppData"), Len(Environ("AppData")) - 16) fName = uName & "\OTPReport" & ".xlsm" If Dir(fName) = "" Then Set oEmbFile = cbrWB.Worksheets("CBRDATA").OLEObjects("OTPReport") oEmbFile.Object.SaveAs fName 'For some reason a new workbook named "BookN" (n = to some integer) is created when 'saving our embedded file to C. To counter this, I close the most recently opened workbook. Workbooks(Workbooks.Count).Close 'When opening this workbook, the file shows that it is opened, but the window is not activated. 'We must use the name of the file and call activate to get it to show up in our active windows. Set sumWB = Workbooks.Open(fName) Windows("OTPReport.xlsm").Activate Else: 'same explanation as above Set sumWB = Workbooks.Open(fName) Windows("OTPReport.xlsm").Activate End If