Condividi tramite

Protezione foglio

Anonimo
2017-03-30T09:00:21+00:00

Ciao ho un foglio Master (XLSM) con all'interno una query SQL: ad ogni record compila alcuni campi e poi salva come nuovo foglio excel (XLSX). Qui l'istruzione che uso: ActiveWorkbook.SaveAs Filename:=Directory & NomeFile, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False.

Vorrei però che l'excel creato (che contiene vari fogli) non fosse editabile. Come faccio?

Grazie

S.

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

5 risposte

Ordina per: Più utili
  1. Anonimo
    2017-03-31T10:11:41+00:00

    Ciao Norman, nella attesa/speranza di trovare una soluzione che mi calzi a pennello, ho aggirato il problema:

    Sub SalvataggioFoglio(Directory As String, NomeFile As String)

        Application.DisplayAlerts = False

        ActiveWorkbook.SaveAs Filename:=Directory & NomeFile, FileFormat:=51, CreateBackup:=False

        If DirectoryOld <> "" Then VBA.SetAttr DirectoryOld & ".xlsx", vbReadOnly

        DirectoryOld = Directory & NomeFile

        Application.DisplayAlerts = True

    End Sub

    Metto il ReadOnly in differita, ovvero dopo il salvataggio del file successivo.

    Ti ringrazio per il supporto.

    S.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2017-03-31T09:02:05+00:00

    Forse mi sono spiegato male io all'inizio. Vediamo se riesco ad essere più chiaro.

    Il file originale che contiene la macro si chiama "Statino.xlsm".

     While Not adoRS.EOF

           ...... 

          ........

         SalvataggioFoglio DirectoryXls, Trim(adoRS("NomeFile"))

            adoRS.MoveNext

            DoEvents

        Wend


    Sub SalvataggioFoglio(Directory As String, NomeFile As String)

        Application.DisplayAlerts = False

        ActiveWorkbook.SaveAs Filename:=Directory & NomeFile, FileFormat:=51, CreateBackup:=False

        VBA.SetAttr Directory & NomeFile, vbReadOnly

        Application.DisplayAlerts = True

    End Sub


    Quindi ad ogni loop vorrei creare e salvare (read only) un file nuovo con il nome cambiato (D_xxxxx_2017_02.xlsx).

    Invece cosa succede con questo codice: che dopo la SaveAs lo stesso Statino.xlsxm si è trasformato in D_xxxxx_2017_02.xlsx. Questo finchè non arriva al salvataggio successivo del loop  in cui si trasforma in D_yyyyy_2017_02.xlsx, poi D_sssss_2017_02.xlsx e così via. Ritorna Statino.xlsxm solo alla fine del loop quando prima di uscire ho messo ActiveWindow.Close SaveChanges:=False.

    Il nuovo codice che hai postato devo ancora provarlo ma, ad occhio, mi lascia qualche dubbio: salvo il master in D_xxxxx_2017_02.xlsx poi lo risalvo come Statino.xlsm, giusto? A questo punto però il master è sporco con i dati di xxxxx. Mi piacerebbe di più una soluzione in cui il master non venga mai risalvato.

    Una cosa che simulasse: dal master apro nuovo foglio xxxxx, gli copio dentro i dati, salvo xxxxx e lo rendo read only.

    Spero di essere stato chiaro.

    Grazie per la pazienza  :)

    S.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2017-03-31T08:16:11+00:00

    Ciao Simone,

    grazie per la risposta. Però mi va in errore all'istruzione VBA.SetAttr per "Impossibile trovare il file".

    Molto probabilmente perchè l'ha creato ma non ancora "rilasciato" (vedi immagine sotto).

    Rimane così "appeso" finchè non salvo quello dopo. A quel punto scompare la versione Temp.

    Non c'è un modo di cambiare la SaveAs in modo che rilasci subito quello creato e torni al nome originale che è "Statino.xlsm"? Perchè tra una SaveAs e l'altra anche l'originale prende il nome di quello appena creato.

    Questo suggerirebbe che tu abbia implementato il mio codice in modo diverso ma, inoltre pare che la tua esigenza sia più ampia di quella indicata nella tua domanda originaria :-)

    Se la tua esigenza sia di creare una copia del file, salvandolo come file xlsx in modo ReadOnly, chiuderlo e poi aver aperto il file xlsm, prova qualcosa del genere:       

    '=========>>

    Option Explicit

    '=========>>

    Public Sub Tester()

        Dim sFileName As String

        Const Directory As String = "C:\Users\Ndj\Documents"

        Const NomeFile As String = "Statino"

        sFileName = Directory & NomeFile

        On Error GoTo XIT

        Application.DisplayAlerts = False

        ActiveWorkbook.SaveAs Filename:=sFileName, _

                              FileFormat:=51, _

                              CreateBackup:=False

        VBA.SetAttr sFileName & ".xlsx", vbReadOnly

       ActiveWorkbook.SaveAs Filename:=sFileName, _

                              FileFormat:=52, _

                              CreateBackup:=False

        VBA.SetAttr sFileName & "xlsm", vbNormal

    XIT:

        Application.DisplayAlerts = True

    End Sub

    '<<=========

    Eseguendo questo codice, io vedo qualcosa del tipo:

                    

    Come si vede, un file Statino.xlsx è stato creato e il file Statino.xlsm è stato salvato ed è aperto.

    Inoltre, il file xlsx è ReadIOnly:

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2017-03-31T07:08:44+00:00

    Ciao Norman,

    grazie per la risposta. Però mi va in errore all'istruzione VBA.SetAttr per "Impossibile trovare il file".

    Molto probabilmente perchè l'ha creato ma non ancora "rilasciato" (vedi immagine sotto).

    Rimane così "appeso" finchè non salvo quello dopo. A quel punto scompare la versione Temp.

    Non c'è un modo di cambiare la SaveAs in modo che rilasci subito quello creato e torni al nome originale che è "Statino.xlsm"? Perchè tra una SaveAs e l'altra anche l'originale prende il nome di quello appena creato.

    Spero di essere stato chiaro.

    Grazie

    S.

    La risposta è stata utile?

    0 commenti Nessun commento
  5. Anonimo
    2017-03-30T10:54:46+00:00

    Ciao Simone.

    Ciao ho un foglio Master (XLSM) con all'interno una query SQL: ad ogni record compila alcuni campi e poi salva come nuovo foglio excel (XLSX). Qui l'istruzione che uso: ActiveWorkbook.SaveAs Filename:=Directory & NomeFile, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False.

    Vorrei però che l'excel creato (che contiene vari fogli) non fosse editabile. Come faccio?

    Prova qualcosa del genere:

    '=========>>

    Option Explicit

    '--------->>

    Public Sub Tester()

        Dim sFullName As String

        Const Directory As String = "**C:\Users\Darth_Pig**"         '<<=== Modifica

        Const NomeFile As String = "Pippo.xlsx"                        '<<=== Modifica

        sFullName = Directory & NomeFile

        On Error GoTo XIT

        Application.DisplayAlerts = False

        ActiveWorkbook.SaveAs Filename:=sFullName, _

                              FileFormat:=51, _

                              CreateBackup:=False

        VBA.SetAttr sFullName, vbReadOnly

    XIT:

        Application.DisplayAlerts = True

    End Sub

    '<<=========

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento