gpt4 book ai didi

excel - 将嵌入的 OLE 对象(Excel 工作簿)保存到 Excel 2010 中的文件

转载 作者:行者123 更新时间:2023-12-03 01:51:47 25 4
gpt4 key购买 nike

我正在尝试将嵌入的 OLE 对象(Excel 工作簿)从当前/打开的工作簿保存到用户 PC 上的某个位置。此 OLE 对象是在宏执行期间填充的模板/仪表板。

宏首先测试用户的 C 盘上是否存在该文件。

如果确实存在,它将打开该文件并将工作簿变量设置为此新打开的工作簿。这适用于 Excel 2010 和 Excel 2013。

如果用户没有将文件保存到 C 驱动器,则宏将打开 OLE 对象以将其保存到驱动器。然后宏指向该位置并打开文件。该代码在 Excel 2013 中有效,但在 Excel 2010 中,当我尝试将文件保存到驱动器时​​,宏使 Excel 崩溃。如果我在中断模式下运行宏,则保存有效,只有在运行时才会发生崩溃。

这里可以使用 DoEvents 或 Application.Wait 吗?

我注意到的一些事情:

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

代码:

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

最佳答案

使用实际嵌入的 COM 对象,而不是 .Verb 0 为您提供的默认操作。

如果 OLEObject 由 COM 服务器管理(即 .Object 属性),则它们会公开对基础对象的引用。就您而言,由于您有一个嵌入式工作簿,因此它只是一个 Workbook 对象,就像您在 VBA 中遇到的任何其他 Workbook 对象一样。您需要做的就是调用 .SaveAs 即可:

oEmbFile.Object.SaveAs fName

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

关于excel - 将嵌入的 OLE 对象(Excel 工作簿)保存到 Excel 2010 中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39457262/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com