Sviluppare funzionalita su Microsoft Office con VBA Creare copia file excel escludendo alcune macro…è possibile???

Login Registrati
Stai vedendo 12 articoli - dal 1 a 12 (di 12 totali)
  • Autore
    Articoli
  • #44811 Score: 0 | Risposta

    FROST220684
    Partecipante

      Ciao a tutti,

      Ho un file che tramite macro mi salva una copia in xlsm con la copia integrale di tutto il codice vba dell'originale. Mi chiedo è possibile escludere in questa copia alcune macro? ad esempio il file originale alla sua apertura prevede un reset completo del foglio + un Array che copia e salva le formule per poi essere ripristinate all'evenienza. Ecco io vorrei che il file originale facesse tutto questo, ma il file copiato non abbia questa funzione (perchè nel file copiato ci devono essere alcune informazioni salvate) in quanto appena apro il file copiato chiaramente mi resetta tutto anche le informazioni che io ho salvato appositamente.

      Grazie a tutti per l'aiuto

      Lascio codice all'apertura foglio che è quello che dovrebbe essere escluso:

      `Private Sub Workbook_Open()
      Dim ii As Byte
      Dim jj As Byte
      Dim tt As Byte
      Dim xx As Variant
      Dim uu As Variant
      Dim ss As Variant
      
      
      'con x dichiaro un array (cioè un insieme di elementi) che in questo caso sono _
      i riferimenti alle celle che contengono le formule e che saranno interessate _
      all'inserimento di dati tramite le textbox
      xx = Array("B7", "b13", "B14", "B15", "B16", "B17", "B18", "B19", "B22", "B23", "B24", "B25", "B26", "B27", "D22", "D23", "D24", "D25", _
                "D26", "D27", "D28", "D29", "D30", "D31", "D32", "D33", "D34", "D35", "D36", "D37", "D38", "D39", "D40", "D41", "D42", "D43", _
                "D44", "D45", "D46", "D47", "D48", "D49", "D50", "D51", "D52", "D53", "D54", "D55", "A59", "A60", "A61", "A62", "C60", "C61", "D43", _
                "C62", "D59", "D60", "D61", "D62", "D63", "D65", "D66", "D67", "D68", "a71", "m2", "j3")
            
      uu = Array("D5", "D6", "D7", "D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "D16", "D17", "D18", "D19", "D20", "D21", "D22", "D23", "D24", "B5", _
      "B6", "B7", "B8", "B9", "B10", "B11", "C12", "C13", "C14", "C15", "B16", "C17", "C18", "C19", "C20", "C21", "C22", "A23", "A24", "C23", "C24", _
      "A39", "D39", "A40", "D40", "A41", "D41", "A42", "D42", "A43", "D43", "A44", "A45", "A46", "A47", "A48", "A49", "A50", "A51", "A52", "A53", "A54", _
      "A55", "A56", "D44", "D45", "D46", "D47", "D48", "D49", "D50", "D51", "D52", "D53", "D54", "D55", "D56", "A25", "C25", "D25", "A26", "C26", "D26", _
      "A27", "C27", "D27", "A28", "C28", "D28", "A29", "D29", "A30", "D30", "A31", "D31", "A32", "D32", "A33", "D33", "A34", "D34", "A35", "D35", "A36", "D36", _
      "A37", "D37", "A38", "D38")
      
      ss = Array("A37", "A38", "A39", "A40", "D5", "D6", "D7", "D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "C12", "C13", "C14", "C15", _
      "D16", "C17", "C18", "C19", "C20", "C21", "C22", "D17", "D18", "D19", "D20", "D21", "D22", _
            "C23", "C24", "C25", "C26", "C27", "C28", "D23", "D24", "D25", "D26", "D27", "D28", "D29", "D30", "D31", "D32", "D33", "D34", "D35", _
            "D36", "D37", "D38", "D39", "D40", "B5", "B6", "B7", "B8", "B9", "B10", "B11", "B12", "B13", "B14", "B15", "B17", "B16", "B18", _
            "B19", "B20", "B21", "B22", "A23", "A24", "A25", "A26", "A27", "A28", "A29", "A30", "A31", "A32", "A33", "A34", "A35", "A36", _
            "A41", "A42", "A43", "A44", "A45", "A46", "A47", "A48", "A49", "A50", "A51", "A52", "A53", "A54", "A55", "A56", "A57", "A58", "A59", "A60", "A61", "A62", "A63", "A64", _
            "B66", "B67", "C67", "C63", "C62", "C61", "C60", "C59", "C58", "C57", "C56", "C55", "C54", "C53", "C52", "C51", "C50", "C48", "C49", "C47", "C46", "C45", "C44", "A69", "C69", _
            "A65", "A66", "D41", "D42", "D43", "D44", "D45", "D46", "D47", "D48", "D49", "D50", "D51", "D52", "D53", "D54", "D55", "D56", "D57", "D58", "D59", _
            "D60", "D61", "D62", "D63", "D64", "D65", "D66", "D67", "D68", "A68", "B65")
            
      
      With ThisWorkbook
          For ii = 1 To 68
              Formule_in_Celle4(ii) = .Worksheets("Input Backup").Range(xx(ii - 1)).FormulaLocal
              NumberFormat_in_Celle4(ii) = .Worksheets("Input Backup").Range(xx(ii - 1)).NumberFormat
          Next ii
          For jj = 1 To 110
              Formule_in_Celle5(jj) = .Worksheets("Output Backup").Range(uu(jj - 1)).FormulaLocal
              NumberFormat_in_Celle5(jj) = .Worksheets("Output Backup").Range(uu(jj - 1)).NumberFormat
          Next jj
          
          For tt = 1 To 169
              Formule_in_Celle6(tt) = .Worksheets("Output Weekend Backup").Range(ss(tt - 1)).FormulaLocal
              NumberFormat_in_Celle6(tt) = .Worksheets("Output Weekend Backup").Range(ss(tt - 1)).NumberFormat
          Next tt
          
      End With
      Call BackupFoglio
      Call BackupFoglioOutput
      Call BackupFoglioOutputWeekend
      Call ResetFoglio
      End Sub</code></pre><p>ed il codice che lancia le varie copie a cui gli si dovrebbe dire, quando salvi il file xlsm escludi queste 4 macro:</p><p>Call BackupFoglio<br />Call BackupFoglioOutput<br />Call BackupFoglioOutputWeekend<br />Call ResetFoglio</p><p>Codice:</p><pre class="language-c"><code>Option Explicit
      
      Sub save_as()
      Dim p As String
      Dim s As String
      Dim V As Variant
      Dim i As Integer, uRiga As Integer
      Dim wb1 As Workbook
      Dim wb2 As Workbook
      
          'inizio istruzioni cursore mouse
          With Application
              .ScreenUpdating = False
              .Cursor = xlWait
          End With
          
          Set wb1 = ThisWorkbook      'in wb1 imposto riferimento a questo foglio di lavoro
          Set wb2 = Workbooks.Add     'in wb2 imposto riferimento a nuovo foglio di lavoro
          p = "Z:\Altri computer\Il mio computer\Archivio\UFFICO BOOKING\PROVA FILE UNICO" 'inserire percorso cartelle preventivi
         ' p = "C:\Users\alebo\Downloads\Lavori in Excel\Preventivi"
          
          'variabile per salvataggio con nome
          s = "@A - @B - @C - @D"
          For i = 1 To 4
              V = Choose(i, "B3", "B1", "B6", "B7")
              s = Replace(s, "@" & Chr$(64 + i), wb1.Worksheets("Input").Range(V))
          Next
          ' inserire il nome della cartella preventivi excel al posto di Preventivi Excel
          wb1.Worksheets.Copy before:=wb2.Worksheets(1)
          'in cella N46 del foglio originale salvo data e ora di creazione del foglio copiato
          
          wb2.Worksheets("Input").Range("N46") = "Preventivo creato il " & Date
          wb2.SaveAs p & "\EXCEL\" & Replace(s, "/", "-") & ".xlsx", FileFormat:=xlWorkbookDefault
          For Each V In wb2.LinkSources(Type:=xlLinkTypeExcelLinks)
              wb2.BreakLink Name:=V, Type:=xlLinkTypeExcelLinks
          Next
              
          wb1.SaveCopyAs p & "\VBA\" & Replace(s, "/", "-") & ".xlsm"
          wb1.Worksheets("Input").Range("N45").Value = p & "\PDF\" & Replace(s, "/", "-") & ".pdf"
              With Worksheets("Input")
              
              If .Range("E7") > 3 Then
          With wb2.Worksheets("Output")
              ' inserire il nome della cartella preventivi PDF al posto di Preventivi Excel
              .Select
              uRiga = .Cells(Rows.Count, "B").End(xlUp).Row
          
              .Range("$A$5:$D$65").AutoFilter Field:=4, Criteria1:="<>"
              With .PageSetup
                  .PrintArea = "A1:D" & uRiga
                  .Orientation = xlPortrait
                  .Zoom = False
                  .FitToPagesWide = 1
                  .FitToPagesTall = False
              End With
      
              .ExportAsFixedFormat Type:=xlTypePDF, _
                  Filename:=p & "\PDF\" & Replace(s, "/", "-") & ".pdf", _
                  Quality:=xlQualityStandard, IncludeDocProperties:=True, _
                  IgnorePrintAreas:=False, OpenAfterPublish:=False
          End With
      
          wb2.Worksheets("Input").Select
          wb2.Close True  'salva e chiude il nuovo foglio creato
          
          With wb1.Worksheets("Input")
              ' inizio istruzioni di resettaggio celle
              .Range("B1,B2,B4,B5,B12:D12,B6:D6,E7,B8:D12,B20:D20,j2,J4:J6,J9,J11,M3,N45,D56,D57,D58,M7:M9,D64").ClearContents
              .Range("B6:D6") = "8/11/2024"
              .Range("E7") = "7"
              .Range("B8:D8") = "2"
              .Range("B9:D9") = "1"
              .Range("A56:C56") = "Rigo personalizzabile"
              .Range("A57:C57") = "Rigo personalizzabile"
              .Range("A58:C58") = "Rigo personalizzabile"
              
              ' istruzione di aggiunta +1 al preventivo
              .Range("B3").Value = .Range("B3").Value + 1
          End With
          With UserForm1      'qui ovviamente ci vuole il nome dell'userform reale
          .CheckBox1 = False
          .CheckBox2 = False
          .TextBox1.Value = ""
          Call UserForm1.btnConferma_Click
          End With
          Call RipristinaFoglio
          End If
          'fine istruzioni cursore mouse
          With Application
              .ScreenUpdating = True
              .Cursor = xlDefault
          End With
         With Worksheets("Input")
              
              If .Range("E7") < 3 Then
              With wb2.Worksheets("Output Weekend")
              ' inserire il nome della cartella preventivi PDF al posto di Preventivi Excel
              .Select
              uRiga = .Cells(Rows.Count, "B").End(xlUp).Row
          
              .Range("$A$5:$D$65").AutoFilter Field:=4, Criteria1:="<>"
              With .PageSetup
                  .PrintArea = "A1:D" & uRiga
                  .Orientation = xlPortrait
                  .Zoom = False
                  .FitToPagesWide = 1
                  .FitToPagesTall = False
              End With
      
              .ExportAsFixedFormat Type:=xlTypePDF, _
                  Filename:=p & "\PDF\" & Replace(s, "/", "-") & ".pdf", _
                  Quality:=xlQualityStandard, IncludeDocProperties:=True, _
                  IgnorePrintAreas:=False, OpenAfterPublish:=False
          End With
      
          wb2.Worksheets("Input").Select
          wb2.Close True  'salva e chiude il nuovo foglio creato
          
          With wb1.Worksheets("Input")
              ' inizio istruzioni di resettaggio celle
              .Range("B1,B2,B4,B5,B12:D12,B6:D6,E7,B8:D12,B20:D20,j2,J4:J6,J9,J11,M3,N45,D56,D57,D58,M7:M9,D64").ClearContents
              .Range("B6:D6") = "8/11/2024"
              .Range("E7") = "7"
              .Range("B8:D8") = "2"
              .Range("B9:D9") = "1"
              .Range("A56:C56") = "Rigo personalizzabile"
              .Range("A57:C57") = "Rigo personalizzabile"
              .Range("A58:C58") = "Rigo personalizzabile"
              
              ' istruzione di aggiunta +1 al preventivo
              .Range("B3").Value = .Range("B3").Value + 1
          End With
          With UserForm1      'qui ovviamente ci vuole il nome dell'userform reale
          .CheckBox1 = False
          .CheckBox2 = False
          .TextBox1.Value = ""
          Call UserForm1.btnConferma_Click
          End With
          Call RipristinaFoglio
          Call BackupFoglio
      Call BackupFoglioOutput
      Call BackupFoglioOutputWeekend
      Call ResetFoglio
          End If
          
          With Application
              .ScreenUpdating = True
              .Cursor = xlDefault
          End With
          
      Set wb1 = Nothing: Set wb2 = Nothing
      End With
      End With
      End Sub
      `

       

      #44823 Score: 0 | Risposta

      Aldo Ercolini
      Partecipante
        19 pts

        Questo codice serve per eliminare una macro da un modulo.

        Crediti:

        Dal sito:http://www.mvps.org/dmcritchie/excel/xlindex.htm

        articolo:VBE, Programming to The Visual Basic Editor, Chip Pearson, code to add/delete modules, [to manually delete from within the VBE, File, Remove Module]

        Sub DeleteProcedure()             
        Dim VBCodeMod As CodeModule
        Dim StartLine As Long
        Dim HowManyLines As Long
        
        Set VBCodeMod = ThisWorkbook.VBProject.VBComponents("NomeModulo").CodeModule
        With VBCodeMod
            StartLine = .ProcStartLine("NomeMacro", vbext_pk_Proc)
            HowManyLines = .ProcCountLines("NomeMacro", vbext_pk_Proc)
            .DeleteLines StartLine, HowManyLines
        End With
        
        End Sub 
        

        Provato e funziona.

         

        #44828 Score: 0 | Risposta

        FROST220684
        Partecipante

          Sinceramente ho forti difficoltà a farlo entrare nel codice ho provato cosi ma non va, tenendo conto che deve eliminare il workbook_open presente nella cartella di lavoro non in un modulo e lo deve fare solo per il nuovo file xlsm e non per il file originale da cui parte la macro

          Option Explicit
          
          Sub save_as()
          Dim p As String
          Dim s As String
          Dim V As Variant
          Dim i As Integer, uRiga As Integer
          Dim wb1 As Workbook
          Dim wb2 As Workbook
          Dim wb3 As Workbook
          Dim VBCodeMod As CodeModule
          Dim StartLine As Long
          Dim HowManyLines As Long
          
          
              'inizio istruzioni cursore mouse
              With Application
                  .ScreenUpdating = False
                  .Cursor = xlWait
              End With
              
              Set wb1 = ThisWorkbook      'in wb1 imposto riferimento a questo foglio di lavoro
              Set wb2 = Workbooks.Add
              Set wb3 = Workbooks.Add    'in wb3 imposto riferimento a nuovo foglio di lavoro
              p = "Z:\Altri computer\Il mio computer\Archivio\UFFICO BOOKING\PROVA FILE UNICO" 'inserire percorso cartelle preventivi
             ' p = "C:\Users\alebo\Downloads\Lavori in Excel\Preventivi"
              
              'variabile per salvataggio con nome
              s = "@A - @B - @C - @D"
              For i = 1 To 4
                  V = Choose(i, "B3", "B1", "B6", "B7")
                  s = Replace(s, "@" & Chr$(64 + i), wb1.Worksheets("Input").Range(V))
              Next
              ' inserire il nome della cartella preventivi excel al posto di Preventivi Excel
              wb1.Worksheets.Copy before:=wb2.Worksheets(1)
              
              'in cella N46 del foglio originale salvo data e ora di creazione del foglio copiato
              
              wb2.Worksheets("Input").Range("N46") = "Preventivo creato il " & Date
              wb2.SaveAs p & "\EXCEL\" & Replace(s, "/", "-") & ".xlsx", FileFormat:=xlWorkbookDefault
              For Each V In wb2.LinkSources(Type:=xlLinkTypeExcelLinks)
                  wb2.BreakLink Name:=V, Type:=xlLinkTypeExcelLinks
              Next
              wb1.Worksheets.Copy before:=wb3.Worksheets(1)
                  With wb3
                  Set VBCodeMod = ThisWorkbook.VBProject.VBComponents("ThisWorkbook").CodeModule
          With VBCodeMod
              StartLine = .ProcStartLine("Woorkbook_Open", vbext_pk_Proc)
              HowManyLines = .ProcCountLines("Woorkbook_Open", vbext_pk_Proc)
              .DeleteLines StartLine, HowManyLines
          End With
          End With
          
              wb3.SaveCopyAs p & "\VBA\" & Replace(s, "/", "-") & ".xlsm"
              wb3.Close True
              wb1.Worksheets("Input").Range("N45").Value = p & "\PDF\" & Replace(s, "/", "-") & ".pdf"
                  With Worksheets("Input")
                  
                  If .Range("E7") > 3 Then
              With wb2.Worksheets("Output")
                  ' inserire il nome della cartella preventivi PDF al posto di Preventivi Excel
                  .Select
                  uRiga = .Cells(Rows.Count, "B").End(xlUp).Row
              
                  .Range("$A$5:$D$65").AutoFilter Field:=4, Criteria1:="<>"
                  With .PageSetup
                      .PrintArea = "A1:D" & uRiga
                      .Orientation = xlPortrait
                      .Zoom = False
                      .FitToPagesWide = 1
                      .FitToPagesTall = False
                  End With
          
                  .ExportAsFixedFormat Type:=xlTypePDF, _
                      Filename:=p & "\PDF\" & Replace(s, "/", "-") & ".pdf", _
                      Quality:=xlQualityStandard, IncludeDocProperties:=True, _
                      IgnorePrintAreas:=False, OpenAfterPublish:=False
              End With
          
              wb2.Worksheets("Input").Select
              wb2.Close True  'salva e chiude il nuovo foglio creato
              
              With wb1.Worksheets("Input")
                  ' inizio istruzioni di resettaggio celle
                  .Range("B1,B2,B4,B5,B12:D12,B6:D6,E7,B8:D12,B20:D20,j2,J4:J6,J9,J11,M3,N45,D56,D57,D58,M7:M9,D64").ClearContents
                  .Range("B6:D6") = "8/11/2024"
                  .Range("E7") = "7"
                  .Range("B8:D8") = "2"
                  .Range("B9:D9") = "1"
                  .Range("A56:C56") = "Rigo personalizzabile"
                  .Range("A57:C57") = "Rigo personalizzabile"
                  .Range("A58:C58") = "Rigo personalizzabile"
                  
                  ' istruzione di aggiunta +1 al preventivo
                  .Range("B3").Value = .Range("B3").Value + 1
              End With
              With UserForm1      'qui ovviamente ci vuole il nome dell'userform reale
              .CheckBox1 = False
              .CheckBox2 = False
              .TextBox1.Value = ""
              Call UserForm1.btnConferma_Click
              End With
              Call RipristinaFoglio
              End If
              'fine istruzioni cursore mouse
              With Application
                  .ScreenUpdating = True
                  .Cursor = xlDefault
              End With
             With Worksheets("Input")
                  
                  If .Range("E7") < 3 Then
                  With wb2.Worksheets("Output Weekend")
                  ' inserire il nome della cartella preventivi PDF al posto di Preventivi Excel
                  .Select
                  uRiga = .Cells(Rows.Count, "B").End(xlUp).Row
              
                  .Range("$A$5:$D$65").AutoFilter Field:=4, Criteria1:="<>"
                  With .PageSetup
                      .PrintArea = "A1:D" & uRiga
                      .Orientation = xlPortrait
                      .Zoom = False
                      .FitToPagesWide = 1
                      .FitToPagesTall = False
                  End With
          
                  .ExportAsFixedFormat Type:=xlTypePDF, _
                      Filename:=p & "\PDF\" & Replace(s, "/", "-") & ".pdf", _
                      Quality:=xlQualityStandard, IncludeDocProperties:=True, _
                      IgnorePrintAreas:=False, OpenAfterPublish:=False
              End With
          
              wb2.Worksheets("Input").Select
              wb2.Close True  'salva e chiude il nuovo foglio creato
              
              With wb1.Worksheets("Input")
                  ' inizio istruzioni di resettaggio celle
                  .Range("B1,B2,B4,B5,B12:D12,B6:D6,E7,B8:D12,B20:D20,j2,J4:J6,J9,J11,M3,N45,D56,D57,D58,M7:M9,D64").ClearContents
                  .Range("B6:D6") = "8/11/2024"
                  .Range("E7") = "7"
                  .Range("B8:D8") = "2"
                  .Range("B9:D9") = "1"
                  .Range("A56:C56") = "Rigo personalizzabile"
                  .Range("A57:C57") = "Rigo personalizzabile"
                  .Range("A58:C58") = "Rigo personalizzabile"
                  
                  ' istruzione di aggiunta +1 al preventivo
                  .Range("B3").Value = .Range("B3").Value + 1
              End With
              With UserForm1      'qui ovviamente ci vuole il nome dell'userform reale
              .CheckBox1 = False
              .CheckBox2 = False
              .TextBox1.Value = ""
              Call UserForm1.btnConferma_Click
              End With
              Call RipristinaFoglio
              Call BackupFoglio
          Call BackupFoglioOutput
          Call BackupFoglioOutputWeekend
          Call ResetFoglio
              End If
              
              With Application
                  .ScreenUpdating = True
                  .Cursor = xlDefault
              End With
              
          Set wb1 = Nothing: Set wb2 = Nothing
          End With
          End With
          End Sub
          
          
          

          allego un file se si volesse provare

          Allegati:
          You must be logged in to view attached files.
          #44865 Score: 0 | Risposta

          FROST220684
          Partecipante

            Niente non riesco a richiamare quel codice nel codice stampa

            Option Explicit
            
            Sub save_as()
            Dim p As String
            Dim s As String
            Dim V As Variant
            Dim i As Integer, uRiga As Integer
            Dim wb1 As Workbook
            Dim wb2 As Workbook
            
            
            
                'inizio istruzioni cursore mouse
                With Application
                    .ScreenUpdating = False
                    .Cursor = xlWait
                End With
                
                Set wb1 = ThisWorkbook      'in wb1 imposto riferimento a questo foglio di lavoro
                Set wb2 = Workbooks.Add
               
                p = "Z:\Altri computer\Il mio computer\Archivio\UFFICO BOOKING\PROVA FILE UNICO" 'inserire percorso cartelle preventivi
               ' p = "C:\Users\alebo\Downloads\Lavori in Excel\Preventivi"
                
                'variabile per salvataggio con nome
                s = "@A - @B - @C - @D"
                For i = 1 To 4
                    V = Choose(i, "B3", "B1", "B6", "B7")
                    s = Replace(s, "@" & Chr$(64 + i), wb1.Worksheets("Input").Range(V))
                Next
                ' inserire il nome della cartella preventivi excel al posto di Preventivi Excel
                wb1.Worksheets.Copy before:=wb2.Worksheets(1)
               
                
                'in cella N46 del foglio originale salvo data e ora di creazione del foglio copiato
                
                wb2.Worksheets("Input").Range("N46") = "Preventivo creato il " & Date
                wb2.SaveAs p & "\EXCEL\" & Replace(s, "/", "-") & ".xlsx", FileFormat:=xlWorkbookDefault
                For Each V In wb2.LinkSources(Type:=xlLinkTypeExcelLinks)
                    wb2.BreakLink Name:=V, Type:=xlLinkTypeExcelLinks
                Next
            
                wb1.SaveCopyAs p & "\VBA\" & Replace(s, "/", "-") & ".xlsm"
               Call DeleteProcedure
               Call DeleteAllVBA
                
                wb1.Worksheets("Input").Range("N45").Value = p & "\PDF\" & Replace(s, "/", "-") & ".pdf"
                    With Worksheets("Input")
                    
                    If .Range("E7") > 3 Then
                With wb2.Worksheets("Output")
                    ' inserire il nome della cartella preventivi PDF al posto di Preventivi Excel
                    .Select
                    uRiga = .Cells(Rows.Count, "B").End(xlUp).Row
                
                    .Range("$A$5:$D$65").AutoFilter Field:=4, Criteria1:="<>"
                    With .PageSetup
                        .PrintArea = "A1:D" & uRiga
                        .Orientation = xlPortrait
                        .Zoom = False
                        .FitToPagesWide = 1
                        .FitToPagesTall = False
                    End With
            
                    .ExportAsFixedFormat Type:=xlTypePDF, _
                        Filename:=p & "\PDF\" & Replace(s, "/", "-") & ".pdf", _
                        Quality:=xlQualityStandard, IncludeDocProperties:=True, _
                        IgnorePrintAreas:=False, OpenAfterPublish:=False
                End With
            
                wb2.Worksheets("Input").Select
                wb2.Close True  'salva e chiude il nuovo foglio creato
                
                With wb1.Worksheets("Input")
                    ' inizio istruzioni di resettaggio celle
                    .Range("B1,B2,B4,B5,B12:D12,B6:D6,E7,B8:D12,B20:D20,j2,J4:J6,J9,J11,M3,N45,D56,D57,D58,M7:M9,D64").ClearContents
                    .Range("B6:D6") = "8/11/2024"
                    .Range("E7") = "7"
                    .Range("B8:D8") = "2"
                    .Range("B9:D9") = "1"
                    .Range("A56:C56") = "Rigo personalizzabile"
                    .Range("A57:C57") = "Rigo personalizzabile"
                    .Range("A58:C58") = "Rigo personalizzabile"
                    
                    ' istruzione di aggiunta +1 al preventivo
                    .Range("B3").Value = .Range("B3").Value + 1
                End With
                With UserForm1      'qui ovviamente ci vuole il nome dell'userform reale
                .CheckBox1 = False
                .CheckBox2 = False
                .TextBox1.Value = ""
                Call UserForm1.btnConferma_Click
                End With
                Call RipristinaFoglio
                End If
                'fine istruzioni cursore mouse
                With Application
                    .ScreenUpdating = True
                    .Cursor = xlDefault
                End With
               With Worksheets("Input")
                    
                    If .Range("E7") < 3 Then
                    With wb2.Worksheets("Output Weekend")
                    ' inserire il nome della cartella preventivi PDF al posto di Preventivi Excel
                    .Select
                    uRiga = .Cells(Rows.Count, "B").End(xlUp).Row
                
                    .Range("$A$5:$D$65").AutoFilter Field:=4, Criteria1:="<>"
                    With .PageSetup
                        .PrintArea = "A1:D" & uRiga
                        .Orientation = xlPortrait
                        .Zoom = False
                        .FitToPagesWide = 1
                        .FitToPagesTall = False
                    End With
            
                    .ExportAsFixedFormat Type:=xlTypePDF, _
                        Filename:=p & "\PDF\" & Replace(s, "/", "-") & ".pdf", _
                        Quality:=xlQualityStandard, IncludeDocProperties:=True, _
                        IgnorePrintAreas:=False, OpenAfterPublish:=False
                End With
            
                wb2.Worksheets("Input").Select
                wb2.Close True  'salva e chiude il nuovo foglio creato
                
                With wb1.Worksheets("Input")
                    ' inizio istruzioni di resettaggio celle
                    .Range("B1,B2,B4,B5,B12:D12,B6:D6,E7,B8:D12,B20:D20,j2,J4:J6,J9,J11,M3,N45,D56,D57,D58,M7:M9,D64").ClearContents
                    .Range("B6:D6") = "8/11/2024"
                    .Range("E7") = "7"
                    .Range("B8:D8") = "2"
                    .Range("B9:D9") = "1"
                    .Range("A56:C56") = "Rigo personalizzabile"
                    .Range("A57:C57") = "Rigo personalizzabile"
                    .Range("A58:C58") = "Rigo personalizzabile"
                    
                    ' istruzione di aggiunta +1 al preventivo
                    .Range("B3").Value = .Range("B3").Value + 1
                End With
                With UserForm1      'qui ovviamente ci vuole il nome dell'userform reale
                .CheckBox1 = False
                .CheckBox2 = False
                .TextBox1.Value = ""
                Call UserForm1.btnConferma_Click
                End With
                Call RipristinaFoglio
                Call BackupFoglio
            Call BackupFoglioOutput
            Call BackupFoglioOutputWeekend
            Call ResetFoglio
                End If
                
                With Application
                    .ScreenUpdating = True
                    .Cursor = xlDefault
                End With
                
            Set wb1 = Nothing: Set wb2 = Nothing
            End With
            End With
            End Sub
            
            
            

            in pratica vorrei che quando crea il file xlsm cancelli il modulo 13 dove sono presenti le macro di reset e cancelli tutto il workbook nel nuovo file lasciando chiaramente tutto nel file originale. Ho provato cosi ma mi da errore. Allego file

            Grazie dell'aiuto

            Allegati:
            You must be logged in to view attached files.
            #44875 Score: 1 | Risposta

            alexps81
            Moderatore
              58 pts

              Premetto che la soluzione proposta da Aldo non la conoscevo ma credo che sia valida...però un'alternativa potrebbe essere quella di far scrivere in una cella non utilizzabile del Foglio Copiato una parola chiave ("Vero", "Si", "Confermo", ecc...) e nell'evento Open del Workbook si fa un check su questa cella che se NON riporta quel testo (o valore) allora esegue tutte le istruzioni di reset, viceversa se contiene quel testo allora non esegue le istruzioni di reset.

              Prova a vedere se riesci. Dovresti far in modo che al salvataggio della Copia, il codice va a scrivere in una cella inutilizzata, una parola a tuo piacimento, poi, una volta effettuato il salvataggio della Copia, prima di chiudere il file originale (quindi su evento BeforeClose), deve andare a cancellare il contenuto di questa cella (altrimenti quella parola te la ritrovi anche anche nel file originale).

              #44877 Score: 0 | Risposta

              FROST220684
              Partecipante

                Ciao Alex,

                 

                La soluzione di Aldo sicuramente valida purtroppo non riuscivo a metterla in pratica. La tua ha centrato il segno!!!

                Option Explicit
                
                Sub save_as()
                Dim p As String
                Dim s As String
                Dim V As Variant
                Dim i As Integer, uRiga As Integer
                Dim wb1 As Workbook
                Dim wb2 As Workbook
                
                    'inizio istruzioni cursore mouse
                    With Application
                        .ScreenUpdating = False
                        .Cursor = xlWait
                    End With
                    
                    Set wb1 = ThisWorkbook      'in wb1 imposto riferimento a questo foglio di lavoro
                    Set wb2 = Workbooks.Add     'in wb2 imposto riferimento a nuovo foglio di lavoro
                    p = "Z:\Altri computer\Il mio computer\Archivio\UFFICO BOOKING\PROVA FILE UNICO" 'inserire percorso cartelle preventivi
                   ' p = "C:\Users\alebo\Downloads\Lavori in Excel\Preventivi"
                    
                    'variabile per salvataggio con nome
                    s = "@A - @B - @C - @D"
                    For i = 1 To 4
                        V = Choose(i, "B3", "B1", "B6", "B7")
                        s = Replace(s, "@" & Chr$(64 + i), wb1.Worksheets("Input").Range(V))
                    Next
                    ' inserire il nome della cartella preventivi excel al posto di Preventivi Excel
                    wb1.Worksheets.Copy before:=wb2.Worksheets(1)
                    'in cella N46 del foglio originale salvo data e ora di creazione del foglio copiato
                    
                    wb2.Worksheets("Input").Range("N46") = "Preventivo creato il " & Date
                    wb2.SaveAs p & "\EXCEL\" & Replace(s, "/", "-") & ".xlsx", FileFormat:=xlWorkbookDefault
                    For Each V In wb2.LinkSources(Type:=xlLinkTypeExcelLinks)
                        wb2.BreakLink Name:=V, Type:=xlLinkTypeExcelLinks
                    Next
                    wb1.Worksheets("Input").Range("N70") = "No"
                    wb1.SaveCopyAs p & "\VBA\" & Replace(s, "/", "-") & ".xlsm"
                    wb1.Worksheets("Input").Range("N45").Value = p & "\PDF\" & Replace(s, "/", "-") & ".pdf"
                        With Worksheets("Input")
                        
                        If .Range("E7") > 3 Then
                    With wb2.Worksheets("Output")
                        ' inserire il nome della cartella preventivi PDF al posto di Preventivi Excel
                        .Select
                        uRiga = .Cells(Rows.Count, "B").End(xlUp).Row
                    
                        .Range("$A$5:$D$65").AutoFilter Field:=4, Criteria1:="<>"
                        With .PageSetup
                            .PrintArea = "A1:D" & uRiga
                            .Orientation = xlPortrait
                            .Zoom = False
                            .FitToPagesWide = 1
                            .FitToPagesTall = False
                        End With
                
                        .ExportAsFixedFormat Type:=xlTypePDF, _
                            Filename:=p & "\PDF\" & Replace(s, "/", "-") & ".pdf", _
                            Quality:=xlQualityStandard, IncludeDocProperties:=True, _
                            IgnorePrintAreas:=False, OpenAfterPublish:=False
                    End With
                
                    wb2.Worksheets("Input").Select
                    wb2.Close True  'salva e chiude il nuovo foglio creato
                    
                    With wb1.Worksheets("Input")
                        ' inizio istruzioni di resettaggio celle
                        .Range("B1,B2,B4,B5,B12:D12,B6:D6,E7,B8:D12,B20:D20,j2,J4:J6,J9,J11,M3,N45,D56,D57,D58,M7:M9,D64").ClearContents
                        .Range("B6:D6") = "8/11/2024"
                        .Range("E7") = "7"
                        .Range("B8:D8") = "2"
                        .Range("B9:D9") = "1"
                        .Range("A56:C56") = "Rigo personalizzabile"
                        .Range("A57:C57") = "Rigo personalizzabile"
                        .Range("A58:C58") = "Rigo personalizzabile"
                        .Range("N70") = ""
                        
                        ' istruzione di aggiunta +1 al preventivo
                        .Range("B3").Value = .Range("B3").Value + 1
                    End With
                    With UserForm1      'qui ovviamente ci vuole il nome dell'userform reale
                    .CheckBox1 = False
                    .CheckBox2 = False
                    .TextBox1.Value = ""
                    Call UserForm1.btnConferma_Click
                    End With
                    Call RipristinaFoglio
                    End If
                    'fine istruzioni cursore mouse
                    With Application
                        .ScreenUpdating = True
                        .Cursor = xlDefault
                    End With
                   With Worksheets("Input")
                        
                        If .Range("E7") < 3 Then
                        With wb2.Worksheets("Output Weekend")
                        ' inserire il nome della cartella preventivi PDF al posto di Preventivi Excel
                        .Select
                        uRiga = .Cells(Rows.Count, "B").End(xlUp).Row
                    
                        .Range("$A$5:$D$65").AutoFilter Field:=4, Criteria1:="<>"
                        With .PageSetup
                            .PrintArea = "A1:D" & uRiga
                            .Orientation = xlPortrait
                            .Zoom = False
                            .FitToPagesWide = 1
                            .FitToPagesTall = False
                        End With
                
                        .ExportAsFixedFormat Type:=xlTypePDF, _
                            Filename:=p & "\PDF\" & Replace(s, "/", "-") & ".pdf", _
                            Quality:=xlQualityStandard, IncludeDocProperties:=True, _
                            IgnorePrintAreas:=False, OpenAfterPublish:=False
                    End With
                
                    wb2.Worksheets("Input").Select
                    wb2.Close True  'salva e chiude il nuovo foglio creato
                    
                    With wb1.Worksheets("Input")
                        ' inizio istruzioni di resettaggio celle
                        .Range("B1,B2,B4,B5,B12:D12,B6:D6,E7,B8:D12,B20:D20,j2,J4:J6,J9,J11,M3,N45,D56,D57,D58,M7:M9,D64").ClearContents
                        .Range("B6:D6") = "8/11/2024"
                        .Range("E7") = "7"
                        .Range("B8:D8") = "2"
                        .Range("B9:D9") = "1"
                        .Range("A56:C56") = "Rigo personalizzabile"
                        .Range("A57:C57") = "Rigo personalizzabile"
                        .Range("A58:C58") = "Rigo personalizzabile"
                        .Range("N70") = ""
                        
                        ' istruzione di aggiunta +1 al preventivo
                        .Range("B3").Value = .Range("B3").Value + 1
                    End With
                    With UserForm1      'qui ovviamente ci vuole il nome dell'userform reale
                    .CheckBox1 = False
                    .CheckBox2 = False
                    .TextBox1.Value = ""
                    Call UserForm1.btnConferma_Click
                    End With
                    Call RipristinaFoglio
                    Call BackupFoglio
                Call BackupFoglioOutput
                Call BackupFoglioOutputWeekend
                Call ResetFoglio
                    End If
                    
                    With Application
                        .ScreenUpdating = True
                        .Cursor = xlDefault
                    End With
                    
                Set wb1 = Nothing: Set wb2 = Nothing
                End With
                End With
                End Sub
                
                
                

                Chiaramente nel workbook ho inserito un If sulla cella N70. Funziona tutto egregiamente. Grazie mille

                #44879 Score: 0 | Risposta

                vecchio frac
                Senior Moderator
                  272 pts

                  Aldo Ercolini ha scritto:

                  Questo codice serve per eliminare una macro da un modulo.

                  Per completezza vi ricordo che tra i riferimenti dovete abilitare la voce "Microsoft Visual Basic for Applications Extensibility 5.3", per accedere agli oggetti dei componenti VBE.

                  alexps81 ha scritto:

                  la soluzione proposta da Aldo non la conoscevo ma credo che sia valida

                  E' valida sì e la farei rientrare tra le tecniche avanzate, poco usate ma utili da conoscere... se sei interessato, chiedi e ti apriamo un mondo   

                  #44921 Score: 0 | Risposta

                  tanimon
                  Partecipante
                    16 pts

                    ciao, 

                    sicuramente in questo periodo la mia testa (quale   ) è altrove....

                    ma ho un dubbio e solo per sapere:

                    l'Aticolo 5 del Regolamento del Forum è  tutt'ora in vigore?

                     

                     

                    #44945 Score: 0 | Risposta

                    vecchio frac
                    Senior Moderator
                      272 pts

                      tanimon ha scritto:

                      l'Aticolo 5 del Regolamento del Forum è  tutt'ora in vigore?

                      Domanda retorica naturalmente, e la risposta e' ovviamente si'. Poi possiamo discutere su quanto deve essere lungo il codice per essere sopportabile...

                      "Postare codice senza esagerare" lo ritieni applicabile a questa discussione? Diciamo che il post di Frost sarebbe effettivamente lungo da leggere (anche perche' avulso da un contesto normale) ma lui ha postato una soluzione, non un codice da spulciare. L'alternativa sarebbe chiedere di allegare un file, ma io non trovo cosi' fuori luogo la condivisione del codice (che ripeto serve solo a lui... e' troppo calato in un contesto specifico   )

                      #44946 Score: 0 | Risposta

                      FROST220684
                      Partecipante

                        Buonasera,

                        Premettendo che ogni regola va rispettata, dal mio punto di vista posso solo aggiungere che spesso mi sono trovato davanti (non qui) a codici parziali e con spiegazioni da valutare. Per me che non sono un veterano del VBA spesso mi ha aiutato trovare dei codici completi e funzionanti che mi hanno dato la possibilità (non sapendo scrivere un linguaggio da capo a piedi) di valutarne le parti e riadattarle alle mie esigenze. Detto questo effettivamente io posto quasi sempre cose abbastanza soggettive e mi scuso se posso sembrare lungo e troppo esaustivo. Ma ci tengo anche a precisare, che dato che spesso o sempre mi viene data una mano, è giusto condividere la soluzione corretta con gli altri e con chi ti ha aiutato.

                         

                        #44948 Score: 0 | Risposta

                        tanimon
                        Partecipante
                          16 pts

                          vecchio frac ha scritto:

                          Domanda retorica naturalmente, e la risposta e' ovviamente si'. Poi possiamo discutere su quanto deve essere lungo il codice per essere sopportabile...

                          chiaro...

                          grazie

                           

                          se dovesse capitarmi di pormi delle domande... mi darò le risposte da solo...

                          o forse meglio... non mi porrò domande...

                           

                          ricordate "Qualcuno volò sul nido del cuculo"? 

                           

                          grazie

                          #44949 Score: 0 | Risposta

                          tanimon
                          Partecipante
                            16 pts

                            vecchio frac ha scritto:

                            (anche perche' avulso da un contesto normale) ma lui ha postato una soluzione, non un codice da spulciare.

                            per capirlo... non avrei dovuto "spulciarlo"?

                          Login Registrati
                          Stai vedendo 12 articoli - dal 1 a 12 (di 12 totali)
                          Rispondi a: Creare copia file excel escludendo alcune macro…è possibile???
                          Gli allegati sono permessi solo ad utenti REGISTRATI
                          Le tue informazioni: