从新的 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 项目对象模型的信任访问
- 单击文件 --> 选项。
- 在导航窗格中,select 信任中心。
- 单击信任中心设置....
- 在导航窗格中,select 宏设置。
- 确保选中对 VBA 项目对象模型的信任访问。
- 单击“确定”。
代码:
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,但这只是我个人的喜好。
功能部分:下面的代码将 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 项目对象模型的信任访问- 单击文件 --> 选项。
- 在导航窗格中,select 信任中心。
- 单击信任中心设置....
- 在导航窗格中,select 宏设置。
- 确保选中对 VBA 项目对象模型的信任访问。
- 单击“确定”。
代码:
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,但这只是我个人的喜好。