VBA:.copy之后的编译错误

时间:2017-10-20 11:42:16

标签: vba excel-vba compilation copy excel

如果有一个带有sub的大型工作簿,则会将特定工作表复制到新工作簿,然后将此工作表另存为FileFormat51(不带宏的xlsx)以删除所包含的代码:

Public Sub savefile()
Dim WB As Workbook, WBtemp As Workbook
Dim path As String, antw As String, ext As String
Dim filetobesaved

path = ThisWorkbook.path
With Application.FileDialog(msoFileDialogSaveAs)
    .InitialFileName = path & "\" & "standard name"
    Application.ScreenUpdating = True
    antw = .Show
    Application.ScreenUpdating = False
    If antw = -1 Then
        filetobesaved = .SelectedItems(1)
        ext = Right(filetobesaved, Len(filetobesaved) - InStrRev(filetobesaved, ".")) 'InStrRev() finds the first dot from the right and gives its position to Right() to write the file extension into ext
        If ext <> "xlsx" Then
            MsgBox "You chose ." & ext & " as filename extension. As this might cause problems during the current procedure I will change it to .xlsx."
            filetobesaved = Left(filetobesaved, InStrRev(filetobesaved, ".")) & "xlsx"
        End If    
    Else
        Exit Sub
    End If
End With

Set WB = ActiveWorkbook
TKontur.Copy
Set WBtemp = ActiveWorkbook

WBtemp.SaveAs Filename:=filetobesaved, FileFormat:=51  '51 = .xlsx     without macros
WBtemp.Close

End Sub

这一点很好用,直到Excel开始在复制Worksheet后编译代码。 工作簿的代码在复制任务之前编译好(debug-&gt; Compile VBAProject工作正常)但是在复制语句之后,代码无法编译,原因很多,包括工作表被复制到新工作簿而没有全部它引用的其他工作表和模块。

目前,如果我重新启动PC然后打开工作簿并只执行给定的子程序,那么我会说错误。

奇怪的是,起初我认为这是一个数据损坏错误并重建了整个事情(并且直到现在再次重建它)并且在每次重建之后一切都运行良好至少一次但最终再次出现相同的错误我不知道是什么原因导致它再次出现。

我还发现删除任何模块(无论哪一个),保存工作簿然后重新打开工作簿都会导致错误至少一次不会发生( - >一切正常),无论我删除哪个模块。 所以我认为这可能是内存溢出的问题。 但是当我用最基本的功能重写程序时,只有一半的代码和一半的模块,这两个星期工作正常,然后错误再次出现。 它变得更奇怪了:我写了一个更基本的版本,版本号为2.0 在这两周里,我将一些内容改为2.5版 大多数版本在某个时间使用并且有效。 但是当版本2.5发生错误时,所有版本回到2.0时,如果之前没有它,就立即开始出现相同的错误。

此外,如果错误发生至少一次,那么无论我改变什么,它都会每次都发生,除非我删除了其他模块和工作表中的所有引用中的每一个而不是复制的。

还有一个非常相似的错误,恰好是一种无关的错误(错误可能发生在没有其他错误的情况下,有时它们会发生,有时也不会发生)但具有非常相似的属性: 关闭工作簿时,有时excel首先关闭excel-objects,然后编译模块并失败。 当发生这种情况时,那么

ThisWorkbook.Saved = True
ActiveWorkbook.Close

通常有助于忽略该错误一段时间,但随后(通常在一年左右之后)它会重新出现,即使有这两行。编辑:此解决方案似乎有20%的机会崩溃Excel,包括所有其他打开的工作簿。

最后一件事:一旦错误发生一次 大部分时间它出现在所有PC和笔记本电脑上,包括不同的更新状态,操作系统和Office版本。

1 个答案:

答案 0 :(得分:1)

我在保存工作簿之前禁用了事件(Application.EnableEvents = False)作为解决方法。它对我有用!

另外,因为我更喜欢使用Excel常量名称来获得更好的可读性而不是Excel常量值。例如。下面是主要格式,我使用xlOpenXMLWorkbook for xlsx而不是51.虽然这与你或我得到的错误无关。

51 = xlOpenXMLWorkbook (without macro's in 2007-2016, xlsx)
52 = xlOpenXMLWorkbookMacroEnabled (with or without macro's in 2007-2016, xlsm)
50 = xlExcel12 (Excel Binary Workbook in 2007-2016 with or without macro's, xlsb)
56 = xlExcel8 (97-2003 format in Excel 2007-2016, xls)

以下是修改后的代码供参考:

Public Sub savefile()
Dim WB As Workbook, WBtemp As Workbook
Dim path As String, antw As String, ext As String
Dim filetobesaved

path = ThisWorkbook.path
With Application.FileDialog(msoFileDialogSaveAs)
    .InitialFileName = path & "\" & "standard name"
    Application.ScreenUpdating = True
    antw = .Show
    Application.ScreenUpdating = False
    If antw = -1 Then
        filetobesaved = .SelectedItems(1)
        ext = Right(filetobesaved, Len(filetobesaved) - InStrRev(filetobesaved, ".")) 'InStrRev() finds the first dot from the right and gives its position to Right() to write the file extension into ext
        If ext <> "xlsx" Then
            MsgBox "You chose ." & ext & " as filename extension. As this might cause problems during the current procedure I will change it to .xlsx."
            filetobesaved = Left(filetobesaved, InStrRev(filetobesaved, ".")) & "xlsx"
        End If    
    Else
        Exit Sub
    End If
End With

Set WB = ActiveWorkbook
TKontur.Copy
Set WBtemp = ActiveWorkbook

Application.EnableEvents = False
    WBtemp.SaveAs Filename:=filetobesaved, FileFormat:=xlOpenXMLWorkbook ' = xlsx
    WBtemp.Close
Application.EnableEvents = True    
End Sub