1

我试图强制用户保存新填充的模板(使用 VBA 和其中的宏创建)以避免重新打开时数据丢失(因此用户不必在每次创建执行程序后删除数据) ,我了一些关于启用和禁用事件的内容,我试过了,但没有运气。它保存了同一本书,但如果我打开它,它似乎仍然在执行。无论如何要从该副本中删除宏吗?

我唯一有兴趣禁用和/或删除的宏将是 Workbook_Open 中的代码,因为那是调用模块代码的那个......我只对从我的副本中删除它感兴趣m 用另一个名字保存。不是用户首先打开的文件。

进一步说明:

我需要 Workbook_Open 上的代码。让我试着更好地解释一下,我有一张包含所有代码的表格,当它打开时,它会要求您选择一些输入文件以填充工作簿,完成后,它会要求用户保存填充工作簿作为副本,但是当我打开保存的副本时,就像我打开第一张工作表一样。而且我只想显示填充的模板,而不是像一个精确的副本一样。这就是为什么我想删除工作簿

代码:

Application.ScreenUpdating = True
ThisWorkbook.Activate
MsgBox "Site Configuration List" & vbNewLine & "Generated Sucessfully", vbOKOnly, "SCL Generated Sucessfully"
MsgBox "Remember to save the file with a different filename" & vbNewLine & "The next time the program executes it'll erase all information contained in it", vbInformation
SaveWorkbookAsNewFile (Project & "_" & ProjectName)

Private Sub SaveWorkbookAsNewFile(NewFileName As String)
Dim ActSheet As Worksheet
Dim ActBook As Workbook
Dim CurrentFile As String
Dim NewFileType As String
Dim NewFile As String

Application.ScreenUpdating = False ' Prevents screen refreshing.
Application.EnableEvents = False
CurrentFile = ThisWorkbook.FullName

NewFileType = "Excel Files 1997-2003 (*.xls), *.xls"

NewFile = Application.GetSaveAsFilename( _
InitialFileName:=NewFileName, _
fileFilter:=NewFileType)

If NewFile <> "" And NewFile <> "False" Then
ActiveWorkbook.SaveCopyAs Filename:=NewFile, _
FileFormat:=xlNormal, _
Password:="", _
WriteResPassword:="", _
ReadOnlyRecommended:=True, _
CreateBackup:=False
End If

Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub

我之前在这里找到了类似的东西,但这对我没有帮助。

4

3 回答 3

2

我正在使用 excel 2007。在新文件(填充表)中,我不需要任何代码。我只想显示信息,仅此而已——Splendonia 刚刚

在这种情况下,您需要做的就是将文件另存为.xlsx文件。您不必做删除代码的繁琐工作。该文件将自动剥离所有代码。

换行

ActiveWorkbook.SaveCopyAs Filename:=NewFile, _
FileFormat:=xlNormal, _
Password:="", _
WriteResPassword:="", _
ReadOnlyRecommended:=True, _
CreateBackup:=False

ActiveWorkbook.SaveAs Filename:=NewFile, _
FileFormat:= xlOpenXMLWorkbook , _
Password:="", _
WriteResPassword:="", _
ReadOnlyRecommended:=True, _
CreateBackup:=False

还记得相应地更改NewFileType

编辑

糟糕,我忘了说我可能需要将其保存为 .xls 文件,用户稍后需要上传的程序不支持 >excel2007 文件 – Splendonia 5 分钟前

要删除Workbook_Open,请使用此代码(TRIED AND TESTED)。礼貌芯片皮尔逊Introduction在尝试此代码之前,请不要忘记阅读链接中提到的内容。

Option Explicit

Sub DeleteProcedureFromModule()
    Dim VBProj As VBIDE.VBProject
    Dim VBComp As VBIDE.VBComponent
    Dim CodeMod As VBIDE.CodeModule

    Dim StartLine As Long
    Dim NumLines As Long
    Dim ProcName As String

    Set VBProj = ActiveWorkbook.VBProject
    Set VBComp = VBProj.VBComponents("ThisWorkbook")
    Set CodeMod = VBComp.CodeModule

    ProcName = "Workbook_Open"
    With CodeMod
        StartLine = .ProcStartLine(ProcName, vbext_pk_Proc)
        NumLines = .ProcCountLines(ProcName, vbext_pk_Proc)
        .DeleteLines StartLine:=StartLine, Count:=NumLines
    End With
End Sub
于 2013-11-07T20:34:54.930 回答
1

我不确定这在代码中是否可行......(观看 Siddharth 证明我错了)..

我能想到的一种方法是在运行代码之前检查专用单元格中是否存在值。

Private Sub Workbook_Open()

   Dim rng As Range

   Set rng = Sheet1.Range("A1")

    If rng.Value = "run" Then

    'put code in here

    rng.Value = ""

    End If

End Sub
于 2013-11-07T20:28:35.253 回答
0

你能解释为什么你提供的链接不适合你吗?我打算提出类似的建议......似乎他们正在保存一个新副本,那么您可以在 BeforeSave 事件中拦截它,并使用标准 API 从模块中删除代码。看看这个:

http://msdn.microsoft.com/en-us/library/aa443970(v=vs.60).aspx

这个对象在 VBA 中可供您使用,类似这样的东西应该适用于您正在解释的内容......但如果不是,那么如果您能解释在哪里以及为什么这不是做什么,我们会为您提供更好的帮助你期待它做。

于 2013-11-07T20:26:12.443 回答