从新的 xlsx 文件中去除宏

strip macros from new xlsx file

功能部分:下面的代码将 2 个选项卡从 xlsm 文件保存到新的 xlsx 文件。文件保持打开状态以供编辑。

错误:xlsm 选项卡在 sheet 代码中有一个触发器。该触发器无效,一旦在 xlsx sheet.

中输入任何内容,就会导致错误

期望的输出:编辑新文件时没有产生错误

修复尝试失败:我尝试使用脚本来删除宏,但全新的 sheet 无法访问其代码。我可能做错了...

Sub seedPro()
    
    Dim wb As Workbook
    Set wb = ActiveWorkbook
    
    Dim wb2 As Workbook ' for new workbook
    
    ' make new sheet/names
    Worksheets(Array("Pro Focus", "AF-LU")).Copy
    
    Set wb2 = ActiveWorkbook
    wb2.SaveAs Filename:="New Form.xlsx", FileFormat:=xlOpenXMLWorkbook
        
End Sub

下面是在编辑新 xlsx 时触发的 sheet 宏 保存在 Pro Focus 选项卡中

Private Sub Worksheet_Change(ByVal target As Range)
    If target.Address = "$C" And Not target.Value = "Company" Then
        newProspect "focus" ' causes error because this is not found in the xlsx
    End If
End Sub

您可以从原始 sheet 中删除 sheetChange 事件脚本并将其设置在工作簿上,这样 sheet 就干净了,您可以轻松复制它。将其放入您的 ThisWorkbook 脚本页面:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    set Sh = worksheets(1) 'HERE you choose the worksheet where you want to run this code
    If Sh.target.Address = "$C" And Not Sh.target.Value = "Company" Then
        newProspect "focus" ' causes error because this is not found in the xlsx
    End If
End Sub

the file stays open for editing.

我可以立即想到两种方法来处理这种情况。

方式一

您需要关闭并重新打开新创建的文件。

Option Explicit

Sub WayOne()
    Dim wb As Workbook
    Set wb = ThisWorkbook
    
    wb.Worksheets(Array("Pro Focus", "AF-LU")).Copy
    
    Dim wb2 As Workbook
    Set wb2 = Application.Workbooks.Item(Application.Workbooks.Count)
    
    Dim FilePath As String
    FilePath = "C:\SampleFolder\New Form.xlsx"
    
    Application.DisplayAlerts = False
    wb2.SaveAs Filename:=FilePath, FileFormat:=xlOpenXMLWorkbook
    Application.DisplayAlerts = True
    
    wb2.Close (False)
    
    Set wb2 = Workbooks.Open(FilePath)
End Sub

方式二

从新创建的文件中删除 VBA 代码。为此,您需要确保通过执行以下操作

检查对 VBA 项目对象模型的信任访问
  1. 单击文件 --> 选项。
  2. 在导航窗格中,select 信任中心。
  3. 单击信任中心设置....
  4. 在导航窗格中,select 宏设置。
  5. 确保选中对 VBA 项目对象模型的信任访问。
  6. 单击“确定”。

代码:

Option Explicit

Sub WayTwo()
    Dim wb As Workbook
    Set wb = ThisWorkbook
    
    wb.Worksheets(Array("Pro Focus", "AF-LU")).Copy
    
    Dim wb2 As Workbook
    Set wb2 = Application.Workbooks.Item(Application.Workbooks.Count)
    
    Dim FilePath As String
    FilePath = "C:\SampleFolder\New Form.xlsx"
        
    Application.DisplayAlerts = False
    wb2.SaveAs Filename:=FilePath, FileFormat:=xlOpenXMLWorkbook
    Application.DisplayAlerts = True
    
    Dim i As Long

    On Error Resume Next
    With wb2.VBProject
        For i = .VBComponents.Count To 1 Step -1
            .VBComponents.Remove .VBComponents(i)
            .VBComponents(i).CodeModule.DeleteLines _
            1, .VBComponents(i).CodeModule.CountOfLines
        Next i
    End With
    On Error GoTo 0
End Sub

注意:我更喜欢方式1,但这只是我个人的喜好。