Удалить макросы из нового файла xlsx

ФУНКЦИОНАЛЬНАЯ ЧАСТЬ: приведенный ниже код сохраняет 2 вкладки из файла xlsm в новый файл xlsx. файл остается открытым для редактирования.

ОШИБКА: на вкладке xlsm есть триггер в коде листа. Этот триггер недействителен и вызывает ошибку, как только что-либо вводится в лист xlsx.

ЖЕЛАЕМЫЙ ВЫВОД: при редактировании нового файла не возникает ошибка

НЕУДАЧНАЯ ПОПЫТКА ИСПРАВИТЬ: я пытался использовать сценарии для удаления макросов, но новый лист не дает доступа к его коду. может я что не так сделал...

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. Сохранено во вкладке Pro Focus

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

2
114
2

Ответы:

Вы можете удалить сценарий события sheetChange с исходного листа и вместо этого установить его в рабочей книге, чтобы лист был чистым, и вы могли легко его скопировать. Поместите это на страницу сценариев 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$2" And Not Sh.target.Value = "Company" Then
        newProspect "focus" ' causes error because this is not found in the xlsx
    End If
End Sub

Решено

файл остается открытым для редактирования.

Есть два способа, которые я могу сразу придумать, чтобы справиться с этой ситуацией.

Способ 1

Вам нужно закрыть и снова открыть только что созданный файл.

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

Способ 2

Удалите код VBA из вновь созданного файла. Для этого вам необходимо убедиться, что проверен доверительный доступ к объектной модели проекта VBA, выполнив следующие действия.

  1. Щелкните Файл --> Параметры.
  2. В области навигации выберите Центр управления безопасностью.
  3. Щелкните Параметры центра управления безопасностью....
  4. В области навигации выберите Параметры макроса.
  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, но это только мои личные предпочтения.