+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 10 su 10

Discussione: tornare al file principale dopo aver chiuso quello da archiviare

  1. #1
    LuDo non è in linea Scolaretto
    Luogo
    Parigi
    Post
    119

    tornare al file principale dopo aver chiuso quello da archiviare

    Ciao a tutti e buone feste.
    Ho un file di formato Excel 2003 (anche se lo gestisco con il 2010), che mi produce dei grossi indici mensili.
    Per alleggerire questo grosso file, sto preparando un'utility di archiviazione dei fogli riguardanti i mesi che non serve più avere sottomano, in formato csv.
    Mi impicco nel chiudere l'archivio appena salvato.

    codice:
    Sub ArchiviaFoglioCSV()
    If Not ActiveSheet.Name = "monitor" Then
        MsgBox ("La Macro ArchiviaFoglioCSV può essere lanciata solo dal foglio Monitor")
        Exit Sub
    End If
    Dim ArchiFoglio As String, ArchiFile As String, FilePrinc As Workbook
    Set FilePrinc = Application.ActiveWorkbook()
    risp = ""
    ArchiFoglio = Range("archivianda").Value
    risp = MsgBox("Archivio adesso il foglio " & ArchiFoglio & " ?", vbYesNo)
    If risp = vbNo Then Exit Sub
    DkPerc
    ArchiFile = TbPerc(1, 2) & "back\" & ArchiFoglio & "_PROVA.csv"
    ActiveWorkbook.Sheets(ArchiFoglio).SaveAs FileName:=ArchiFile, FileFormat:=xlCSVMSDOS
    
    Application.Workbooks(ArchiFile).Close ' SI BLOCCA QUI "Indice non incluso nell'intervallo"
    
    FilePrinc.Activate
    risp = MsgBox("Sopprimo adesso il foglio " & ArchiFoglio & " da questo file ?", vbYesNo)
    If risp = vbNo Then Exit Sub
    ActiveWorkbook.Sheets(ArchiFoglio).Delete
    End Sub
    Il codice si comporta come se con il comando SaveAs si chiudesse il file principale (che contiene la macro) e lavorasse poi sul solo file csv che continua ad essere aperto.
    Qualcuno mi saprebbe dire dove sbaglio?
    Grazie, di nuovo buone feste, Luca

    P.S.:
    Ho tentato anche:
    codice:
    FilePrinc.Sheets(ArchiFoglio).SaveCopyAs FileName:=ArchiFile, FileFormat:=xlCSVMSDOS
    Ma mi dice che la proprietà o metodo non sono supportati dall'oggetto.
    Ultima modifica di LuDo; 19-12-2016 14:10 

  2. #2
    LuDo non è in linea Scolaretto
    Luogo
    Parigi
    Post
    119
    Scusate, mi sono reso conto che il mio codice rischia di non essere comprensibile senza l'informazione che segue:
    la macro "DkPerc" contiene la dichiarazione di variabili a partire da un Range di celle in cu ho messo i percorsi da usare (delle cose tipo: Z:\percorso\sottopercorso\"). Dopo, tiro fuori il valore che mi interessa con la riga seguente, che contiene "TbPerc(1,2)". Comunque questo pezzettino non costituisce certamente nessun problema: ho controllato col debug e soprattutto ho usato la stessa identica sintassi in un'altra quindicina di macro dello stesso file, e funzionano.
    In più, il codice del post precedente si ferma DOPO aver prodotto l'archivio nel percorso che voglio.

  3. #3
    Marius44 non è in linea Scolaretto
    Luogo
    Catania
    Post
    218
    Ciao LuDo
    Quando VBA dice "Indice non incluso nell'intervallo" vuol dire che quell'indice per VBA non esiste.
    Potrebbe trattarsi di un po' di confusione (per VBA), e cioè:
    hai dichiarato ArchiFile come string
    salvi il file come FileName:=ArchiFile
    chiudi il file con Application.Workbooks(ArchiFile)

    Prova a dichiarare ArchiFile come Workbook (cambiando ovviamente tutti i riferimenti)

    Ciao,
    Mario

  4. #4
    LuDo non è in linea Scolaretto
    Luogo
    Parigi
    Post
    119
    Grazie del chiarimento, Mario.
    Purtroppo però non ho ben chiaro come gestire la valorizzazione di una variabile di quel tipo dal contenuto di una cella o peggio concatenando diverse variabili di tipo String.
    Per esempio:
    codice:
    Dim ArchiFoglio As Worksheet, ArchiFile As Workbook, FilePrinc As Workbook
    Set FilePrinc = Application.ActiveWorkbook()
    risp = ""
    ArchiFoglio = Range("archivianda").Value
    ==> Variabile oggetto o variabile del blocco With non impostata
    Mentre se lascio ArchiFoglio su String, si blocca più in là:
    codice:
    Set ArchiFile = TbPerc(1, 2) & "back\" & ArchiFoglio & "_PROVA.csv"
    ==> Necessario oggetto
    Forse ArchiFoglio può restare String (vedremo provando), ma se ArchiFile diventa Workbook, come faccio a valorizzarla?
    E cosa intendi per "cambiare tutti i riferimenti"?
    Grazie ancora.

  5. #5
    L'avatar di gibra
    gibra non è in linea Amanuense
    Luogo
    Breganze (VI)
    Post
    5,644
    Nel tuo codice, io vedo che:

    a) prim dichiari ArchiFoglio come String,
    b) poi gli assegni un Range,
    c) ed infine cerchi di usarlo come indice del Workbooks

    Come puoi pensare che funzioni?

  6. #6
    LuDo non è in linea Scolaretto
    Luogo
    Parigi
    Post
    119
    Ciao, Gibra.
    Si dice che un vecchio crede a tutto
    un uomo maturo dubita di tutto
    un giovane sa tutto...

    Non saprei esattamente dove mettermi, personalmente, ma certamente non più tra i giovani, e il mio problema (come tu hai ben capito) è proprio che non sono capace di dire ad una variabile tipo Workbook o Worksheet di prendere il valore dal contenuto di una cella; l'unico modo che conosco è passare da una string ed evidentemente non va bene.
    Chiaramente, non chiedo di meglio che imparare, quindi se qualcuno ha la pazienza di spiegare, sono tutt'orecchi...

    Detto questo, devo chiudere tutto e partire e non rileggerò prima del 27 dicembre. Auguro buon Natale a tutti e ringrazio chiunque abbia la pazienza di farmi approfondire la materia.

  7. #7
    L'avatar di Zer0Kelvin
    Zer0Kelvin non è in linea Scolaretto
    Luogo
    Teramo - provincia
    Post
    267
    Salve a tutti.
    A prescindere da errori veri o presunti nella macro, il modo più pratico per effettuare l'operazione è creare una copia del foglio.
    Questa operazione crea un nuovo Workbook col solo foglio copiato che verrà poi salvato come CSV e chiuso
    codice:
    Option Explicit
    
    Sub ArchiviaFoglioCSV()
    Dim ArchiFoglio As String, ArchiFile As String, ArchiBOOK As Variant
        If ActiveSheet.Name = "monitor" Then
            ArchiFoglio = Range("archivianda").Value
            If MsgBox("Archivio adesso il foglio " & ArchiFoglio & " ?", vbYesNo) = vbYes Then
                DkPerc
                ArchiFile = TbPerc(1, 2) & "back\" & ArchiFoglio & "_PROVA.csv"
                ThisWorkbook.Sheets(ArchiFoglio).Copy ' crea ed attiva un nuovo workbook
                ActiveWorkbook.SaveAs Filename:=ArchiFile, FileFormat:=xlCSVMSDOS
                Application.DisplayAlerts = False 'disabilito gli avvisi di Excel
                ActiveWorkbook.Close
                If MsgBox("Sopprimo adesso il foglio " & ArchiFoglio & _
                    " da questo file ?", vbYesNo) = vbYes _
                Then
                    ThisWorkbook.Sheets(ArchiFoglio).Delete
                End If
                Application.DisplayAlerts = True
            End If
        Else
            MsgBox ("La Macro ArchiviaFoglioCSV può essere lanciata solo dal foglio Monitor")
        End If
    End Sub
    PS:
    Si dice che un vecchio crede a tutto
    un uomo maturo dubita di tutto
    un giovane sa tutto...
    ....hhmm, io la metterei così:

    Si dice che un giovane crede a tutto
    un uomo maturo sa tutto
    un vecio dubita di tutto...


    PPSS: e auguri a tutti
    Ultima modifica di Zer0Kelvin; 20-12-2016 16:28 
    __________________________
    [Excel 2010]
    -Condividere la conoscenza aumenta la ricchezza di tutti. (Z0°K)
    -Dai ad un uomo un e pesce lo avrai sfamato per un giorno; insegnagli a pescare e lo avrai sfamato per sempre. (Confucio)
    -Il sonno della ragione genera mostri. (Francisco Goya)

  8. #8
    LuDo non è in linea Scolaretto
    Luogo
    Parigi
    Post
    119
    Zer0Kelvin buongiorno e auguri a te!
    Per prima cosa, grazie del tuo intervento che mi risolve il problema, funziona alla perfezione e mi riordina perfino il codice in un assetto più elegante (cosa chiedere di più!).
    Ho una domanda ed un'osservazione, a questo punto a scopo esclusivamente didattico:

    Domanda: ArchiBOOK As Variant: che ci fai? dov'è che lo usi? (a meno di improvvisa cecità mia...)

    Osservazione: In generale, mi pare di capire che non è possibile usare una variabile String per dare un nome ad un Object, vero? Ma non è che passando da un altro tipo di variabile, come per esempio Variant, si possono aggiustare le cose? Oppure non ha senso dare un nome ad un Object perché esiste già per conto suo?

    Se è il vecchio a dubitare di tutto, io sono proprio arrivato alla frutta...

  9. #9
    L'avatar di Zer0Kelvin
    Zer0Kelvin non è in linea Scolaretto
    Luogo
    Teramo - provincia
    Post
    267
    Buon 2017 a tutti...
    Grazie per l'epprezzamento, poi: ArchiBOOK è spazzatura rimasta in giro; il secondo quesito non è proprio chiarissimo.
    Il nome di un Oggetto è una stringa, se parliamo della proprietà (per es.) Name:
    Foglio1.Name è la stringa "Foglio1".
    Il tipo variant può contenere qualunque tipo di dato, ma va usato solo se serve.
    __________________________
    [Excel 2010]
    -Condividere la conoscenza aumenta la ricchezza di tutti. (Z0°K)
    -Dai ad un uomo un e pesce lo avrai sfamato per un giorno; insegnagli a pescare e lo avrai sfamato per sempre. (Confucio)
    -Il sonno della ragione genera mostri. (Francisco Goya)

  10. #10
    LuDo non è in linea Scolaretto
    Luogo
    Parigi
    Post
    119

    risolto, grazie

    Zer0Kelvin, effettivamente la mia seconda osservazione è confusa, non ho capito neanche io quello che intendo...
    Quando riuscirò a formulare meglio, tornerò a chiedere o forse a spiegare io stesso.
    Intanto considero il thread risolto, ma non trovo come segnarlo.
    Ciao e grazie. Luca

+ Rispondi al Thread

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi