Condividi tramite

Aprire file in background, salvarlo ad ogni modifica di un altro file e chiuderlo insieme alla chiusura di quest'ultimo

Anonimo
2014-03-11T10:27:17+00:00

Buongiorno a tutti,

sono alle prese con un piccolo problema.

Premetto che non sono praticissimo di VBA ma mi arrangio copiando pezzi qui e lì è usando il registratore di macro.

Ho un file con un database da cui un altro file estrae dei valori di interesse.

Vorrei che all'apertura del file principale si aprisse anche l'altro ma in background (credo come oggetto), e che ad ogni variazione sul primo il secondo venisse salvato e poi, a fine lavoro, con la chiusura del workbook si chiudesse anche l'altro.

non credo sia una cosa complicatissima ma la mia scarsissima esperienza non mi aiuta.

Grazie a chi vorrà aiutarmi.

Federico

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

Risposta accettata dall'autore della domanda

Anonimo
2014-03-11T15:11:59+00:00
  1. lui apre il suo file
  2. la macro apre in background il file specchio in pubblica
  3. lui esegue modifiche sul suo file
  4. la macro salva il file specchio ad ogni variazione rilevata
  5. lui chiude il file
  6. la macro salva e chiude il file specchio
  1. lui apre il suo file
  2. fa le sue modifiche
  3. in chiusura o a tempo salva una copia del file modificato nella cartella pubblica sovrascrivendo il vecchio

Non è più semplice così? Se L'utente fa 100 scritture, provochi un traffico non indifferente. Inoltre non ho capito se il file *specchio* è un file condiviso.

La risposta è stata utile?

0 commenti Nessun commento

5 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2014-03-11T16:33:33+00:00

    ...

    1. lui apre il suo file
    2. fa le sue modifiche
    3. in chiusura o a tempo salva una copia del file modificato nella cartella pubblica sovrascrivendo il vecchio

    Non è più semplice così? Se L'utente fa 100 scritture, provochi un traffico non indifferente. Inoltre non ho capito se il file *specchio* è un file condiviso.

    Forse intendeva proprio automatizzare la duplicazione del file in chiusura.

    Se così è, copia il codice allegato ed incollalo nel modulo ThisWorkbook del file sul quale lavora il tuo collega, modifica nella parte evidenziata il nome della cartella nella quale eseguire la copia.

    Andrea.


    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

    Dim sFileName As String

    '--- modifica qui il nome della cartella pubblica nella quale salvare il file

    Const FOLDER As String = "Z:\CartellaPubblica"

      '--- salva nella cartella pubblica con il medesimo nome

      sFileName = FOLDER & ThisWorkbook.Name

      Application.DisplayAlerts = False

      If ThisWorkbook.FullName <> sFileName Then

        ActiveWorkbook.SaveCopyAs Filename:=sFileName

        Call MsgBox("Copia effettuata in: " & vbNewLine & sFileName, vbInformation + vbOKOnly)

      End If

      Application.DisplayAlerts = True

    End Sub


    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2014-03-11T14:38:26+00:00

    Ciao. Norman,

    grazie per il tempo che mi stai dedicando. Proverò ad essere più chiaro.

    lavoro in una grande rete divisa in sezioni. Ogni sezione risponde di una cartella pubblica ed una privata con i relativi diritti di accesso.

    Il database di un collega é nella sua privata, io nella mia privata ho un mio database che, in parte, attinge da suoi dati.

    Per ovviare all'impossibilità di accedere al suo file gli ho fatto creare una specie di speculare nella pubblica della sua sezione e abbiamo protetto il file con password, l'unico problema é che tale file specchio si aggiorna solo se lui lo apre e lo salva altrimenti, se lo aprissi io, risentirei dei problemi dei collegamenti alla cartella privata cui si riferisce (in pratica rimango fermo ai dati dell'ultimo salvataggio del collega).

    Per evitargli noie (apri e salva ogni volta che apporti modifiche) pensavo appunto alla macro di cui sopra quindi:

    1. lui apre il suo file
    2. la macro apre in background il file specchio in pubblica
    3. lui esegue modifiche sul suo file
    4. la macro salva il file specchio ad ogni variazione rilevata
    5. lui chiude il file
    6. la macro salva e chiude il file specchio

    tutto il processo deve rimanere trasparente all'operatore. 

    Spero di esserti stato d'aiuto.

    Federico

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2014-03-11T13:48:21+00:00

    Ciao Federico,

    Avrei dovuto spiegare che la mia principale obiezione alla strategia proposta è che l'aggiornamento del file secondario ogni volta che non vi è alcun cambiamento del database sembra molto inefficiente e potrebbe mettere un carico pesante sul processore.

    Avrei anche dovuto aggiungere che, al fine di proporre adeguatamente una soluzione alternativa, sarebbe opportuno spiegare gli obiettivi generali del progetto. 

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2014-03-11T13:32:06+00:00

    Ciao Federico,

    Premesso che non so nulla del tuo progetto, dubito che avrei adottato una tale strategia. Di diverse possibili strategie alternative, potrei forse aggiornare il file secondario una sola volta, alla chiusura del database. 

    Detto questo, prendendo la richiesta al valore nominale, potresti provare qualcosa del genere:

    Alt-F11 per aprire l'editor di VBA

    Alt-IM per inserire un nuovo modulo di codice

    Nel nuovo modulo vuoto, incolla il seguente codice:

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

    Option Explicit

    Option Private Module

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

    Property Get myFilename() As String

        myFilename = "Pippo.xlsx"                                    '<<==== Cambia

    End Property

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

     Fai doppio clic su ThisWorkbook e incolla il seguente codice:

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

    Option Explicit

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

    Private Sub Workbook_BeforeClose(Cancel As Boolean)

        Dim WB As Workbook

        On Error GoTo ErrHandler

        Set WB = Workbooks(myFilename)

        WB.Close Savechanges:=False

        Exit Sub

    ErrHandler:

        Call MsgBox(Prompt:="Error " _

                            & Err.Number _

                            & " (" _

                            & Err.Description _

                            & ") nella routine: Workbook_BeforeClose", _

                    Buttons:=vbCritical, _

                    Title:="ERRORE")

    End Sub

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

    Private Sub Workbook_SheetChange(ByVal SH As Object, ByVal Target As Range)

        Dim WB As Workbook

        Dim CalcMode As Long

        Dim sStr As String

        On Error GoTo ErrHandler

        With Application

            .ScreenUpdating = False

            CalcMode = .Calculation

            .Calculation = xlCalculationManual

        End With

        On Error Resume Next

        sStr = myFilename

        Set WB = Workbooks(sStr)

        If Err.Number = 9 Then

            Err.Clear

            On Error GoTo ErrHandler

            Set WB = Workbooks.Open(sStr)

        End If

        WB.Save

    XIT:

        Me.Activate

        With Application

            .Calculation = CalcMode

            .ScreenUpdating = True

        End With

        On Error GoTo 0

        Exit Sub

    ErrHandler:

        Call MsgBox(Prompt:="Error " _

                            & Err.Number _

                            & " (" _

                            & Err.Description _

                            & ") nella routine: Workbook_SheetChange", _

                    Buttons:=vbCritical, _

                    Title:="ERRORE")

        Resume XIT

    End Sub

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

    Alt-Q per chiudere l'editor di VBA

    Salva il file Database.

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento