Risultati da 1 a 15 di 15

Discussione: Tabella Film divisi per genere con Modulo di classe



  1. #1
    L'avatar di dracoscrigno
    Clicca e Apri
    Data Registrazione
    May 2016
    Località
    ferrara
    Età
    41
    Messaggi
    2074
    Versione Office
    office pro 2010
    Likes ricevuti
    440
    Likes dati
    241

    Tabella Film divisi per genere con Modulo di classe

    Il progetto che sto costruendo molto a rilento (dieci minuti oggi, dieci minuti domani ) mi è venuto in mente parlando con un amico al bar.
    Lui ha un sacco di film su più Hdd e dopo avrgli proposto di passarmene qualcuno è venuto fuori il problema di avere unan lista da poter consultare di modo da poter scegliere tra i molteplici titoli.

    ho cos' deciso di creare uan serie di macro che andassero a leggere tutti i file partendo da una origine (ora è thisworkbook.path) e, scendendo in profondità, estrapolare tutti i file che si incontra nelle varie sottocartelle.

    Ogni PercorsoNomeFile.Estensione trovato viene scomposto e posizionato in una tabella dove i campi rappresentano:
    Estensione
    nomeFile
    Percorso

    Dando luogo a qualcosa del genere
    A B C
    1 percorso nomeFile estensione
    2 sottocartella/sottocartella2/sottocartella3 fantozzi II Iso
    3 sottocartella/sottocartella2 baseLuna Avi


    Naturalmente lo scopo è quello di poter suddividere i vari film per genere secondo regole definite dall' amico in questione che dovrebbe, a suo dire, aver utilizzato criteri legati al nome delle cartelle ed al nome dei file e fino a quando non vedrò questa struttura non potrò fare molto ma non ritengo sia un problema. una volta conosciuto il criterio si estrapola tutto :P Forse :D


    Tornando al perchè ho pubblicato questo topic.

    L' ho pubblicato perche ho provato ad implementare l' utilizzo delle classi e quindi ho bisogno di caziate a gogo per capire dove sbaglio e dove posso correggere.

    Per ora il file è così composto:
    un unico foglio con un pulsante che se pigiato attiva il flusso del codice il quale, ora, scrive SOLO nelal finestra debug un paio di print che riguardano i dati memorizzati nella classe e che, successivamente, saranno parte di quelli da infilare nelal tabella che ora è vuota dell unio foglio disponibile in questo momento.


    Quello che mi perplime (fortuna che esiste corrado guzzanti )di questa classe è che non ho saputo fare in altro modo che creare l' oggetto attraverso una sua proprietà, dalla quale ho richiamato una SubRoutine privata denominata INITIALIZE.

    In questo modo l' ho istanziata:
    Codice: 
    Dim ObjPercorso As PercorsoCompleto
    Set ObjPercorso = New PercorsoCompleto
    ObjPercorso.PathCompleto = Replace(Documento.Path, ThisWorkbook.Path, "")
    E, con particolare attenzione all' unico ingresso ad essa:
    Codice: 
    'input della proprietà "PathCompleto".
    Public Property Let PathCompleto(ByVal vDati As String)
        mPathCompleto = vDati
        inizializze (vDati)
    End Property
    Ecco la classe come si presenta:
    Codice: 
    Private mPathCompleto As String
    Private mFile As String
    Private mNomeFile As String
    Private mEstensione As String
    Private mPathSplit() As String
    Private mPosizionePunto As Integer
    
    
    
    
    'input della proprietà "PathCompleto".
    Public Property Let PathCompleto(ByVal vDati As String)
        mPathCompleto = vDati
        inizializze (vDati)
    End Property
    'output della proprietà "PathCompleto".
    Public Property Get PathCompleto() As String
        PathCompleto = mPathCompleto
    End Property
    
    
    Public Property Get File() As String
        File = mFile
    End Property
    
    
    Public Property Get NomeFile() As String
        NomeFile = mNomeFile
    End Property
    
    
    Public Property Get Estensione() As String
        Estensione = mEstensione
    End Property
    
    
    Public Property Get PosizionePunto() As String
        PosizionePunto = mPosizionePunto
    End Property
    
    
    Public Property Get PathSplit() As Variant
        PathSplit = mPathSplit
    End Property
    
    
    Private Sub inizializze(dati As String)
        mPosizionePunto = InStr(1, StrReverse(mPathCompleto), ".")
        mPathSplit = Split(mPathCompleto, "\")
        mFile = mPathSplit(UBound(mPathSplit))
        mEstensione = Right(mFile, mPosizionePunto - 1)
        mNomeFile = Replace(mFile, "." & mEstensione, "")
    End Sub
    Mi era capitato, più per gioco che per altro, di creare classi in .Net e li non funziona certo così. Dichiaro una variabile, la istanzio con set e, come sarebbe lecito in questo caso, gli passo un argomento per inizializzarla.
    Qui, anche se devo dire che facendo le cose a dieci minuti alla volta non è che abbia poi molto cercato, ho dovuto cercare questo tipo di escamotasc per poter popolare tutte le variabili interne alla classe.



    Il Listato completo, oltre alla classe, ad ora risulta essere solo all' interno del folgio1 ed è tutto quì:

    Codice: 
    Sub CommandButton1_Click()
        'pulitura del foglio
        Foglio1.Cells.ClearContents
        'creazione della tabella
        With Foglio1.ListObjects.Add(xlSrcRange, Range("$D$9:$F$9"), , xlYes)
            .Name = "TabellaFilm"
            .TableStyle = "TableStyleMedium9"
        End With
        'Ingresso della procedura di ricerca e popolamento
        CreaAlbero PercorsoDiPartenza:=ThisWorkbook.Path, TabellaDiArrivo:="TabellaFilm"
    End Sub
    
    
    Sub CreaAlbero(ByVal PercorsoDiPartenza As String, TabellaDiArrivo As String)
        Application.ScreenUpdating = False
        Dim FdS As FileSystemObject
        Set FdS = New FileSystemObject
        
        Dim cartelle As Folders
        Set cartelle = FdS.GetFolder(PercorsoDiPartenza).SubFolders
        
        Dim cartella As Folder
        For Each cartella In cartelle
            Dim Documento As File
            For Each Documento In cartella.Files
                'Debug.Print Documento.Name
                
                With Foglio1.Range(TabellaDiArrivo)
                    Dim ObjPercorso As PercorsoCompleto
                    Set ObjPercorso = New PercorsoCompleto
                    ObjPercorso.PathCompleto = Replace(Documento.Path, ThisWorkbook.Path, "")
                    
                    'Da qui verrà popolata la tabella con i valori dell' oggetto
                    Debug.Print ObjPercorso.NomeFile,
                    Debug.Print ObjPercorso.PathSplit(UBound(ObjPercorso.PathSplit))
                End With
            Next
            
            'Ricorsione. Togliere il REM per attivarla.
            'CreaAlbero PercorsoDiPartenza:=cartella.Path, TabellaDiArrivo:=TabellaDiArrivo
        Next
        
        Set FdS = Nothing
        Set cartelle = Nothing
        Set cartella = Nothing
        Set Documento = Nothing
        
        Application.ScreenUpdating = True
    End Sub
    Il funzionamento attuale è molto semplice:

    c'è un foglio con un pulsante ed una tabella vuota
    premendo il pulsante si accede alla propria SUbRoutine_click dove
    1- il foglio viene ripulito di tutto
    2-viene creata la tabella che si può notare anche ora
    3-il flusso del progemma viene spedito nelal seconda Sub dove sta avvenendo il vero lavoro del progetto.

    Tale Sub, per ora, non fa altro che definire alcuni oggetti per avere accesso alle proprieta del filesistem di modo da poter elaborare cartelle e file e per ogni file trovato, lo assegna alla variabile oggetto da me definita per poterne utilizzare le varie parti del percorso.




    Dopo avervi rotto le scatole con tutto sto popò di chiacchiere sono qui a chiedervi se la strada adottata è buona o è meglio rivisitarla. Attendo bastonate con estrema unzione :D :D :D
    Il progetto consta di un file e di qualche sottocartella, allego solo il file perchè dovrebbe girare senza problemi anche sulle vostre macchine.
    Non posizionatelo in C:\ perchè,
    Una volta tolto il rem dall istruzione:

    Codice: 
         'Ricorsione. Togliere il REM per attivarla.
            'CreaAlbero PercorsoDiPartenza:=cartella.Path, TabellaDiArrivo:=TabellaDiArrivo
        Next
    Il flusso non si ferma fino a che non vi ha passato ogni file di tutte le sotto cartelle che incontra
    Neanche DeskTop credo sia igenico perchè non ricordo se i collegamenti sono visti come cartelle...

    ... la ricerca dell sotto cartelle è in modo ricorsivo quindi per i test non c'è bisogno dell' istruzione di ricorsività ma se volete almeno stiate attenti :D

    Vabbè... ora devo scappare... ciao ciao :)
    File Allegati File Allegati

  2. #2

    L'avatar di cromagno
    Clicca e Apri
    Data Registrazione
    Aug 2015
    Località
    Sardegna
    Età
    37
    Messaggi
    4016
    Versione Office
    2013
    Likes ricevuti
    1225
    Likes dati
    923

    Re: Tabella Film divisi per genere con Modulo di classe

    Ciao draco,
    anche io ho più di 2000 film (per non contare le serie tv) in vari HDD, e per ora ho un semplice file fatto anni e anni fa con sole formule e macro registrate. Mi son sempre ripromesso di crearne uno "ad hoc" ma ho sempre rimandato... per ora sono ancora in ferie ma quando rientro lo guarderò con interesse

    "Sono le persone che nessuno immagina che possano fare certe cose, quelle che fanno cose che nessuno può immaginare."

  3. #3
    L'avatar di patel
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Livorno
    Età
    72
    Messaggi
    1101
    Versione Office
    2010
    Likes ricevuti
    141
    Likes dati
    1

    Re: Tabella Film divisi per genere con Modulo di classe

    cia draco, hai impostato una tabella e poi non la riempi, perché ? vedo solo debug.print

  4. #4
    L'avatar di patel
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Livorno
    Età
    72
    Messaggi
    1101
    Versione Office
    2010
    Likes ricevuti
    141
    Likes dati
    1

    Re: Tabella Film divisi per genere con Modulo di classe

    Mi è piaciuta, allego versione senza classi per chi come me non le conosce
    Codice: 
    Dim R As Long
    Sub avvia()
        Application.ScreenUpdating = False
        LR = Cells(Rows.Count, "B").End(xlUp).Row
        Range("B8") = "PERCORSO"
        Range("C8") = "NOME"
        Range("D8") = "EST"
        Range("B9:D" & LR).ClearContents
        R = 9
        CreaAlbero PercorsoDiPartenza:=ThisWorkbook.Path
        Application.ScreenUpdating = True
    End Sub
    
    Sub CreaAlbero(ByVal PercorsoDiPartenza As String)
    
        Dim FdS As FileSystemObject, mNomeFile As String
        Set FdS = New FileSystemObject
        Dim cartelle As Folders
        Set cartelle = FdS.GetFolder(PercorsoDiPartenza).SubFolders
        Dim cartella As Folder
        For Each cartella In cartelle
            For Each Documento In cartella.Files
               ObjPercorso = Replace(Documento.Path, ThisWorkbook.Path, "")
               mPosizionePunto = InStrRev(ObjPercorso, ".")
               mPosizioneSlash = InStrRev(ObjPercorso, "\")
               mFile = Right(ObjPercorso, Len(ObjPercorso) - mPosizioneSlash)
               mEstensione = Right(mFile, Len(ObjPercorso) - mPosizionePunto)
               mNomeFile = Left(mFile, InStr(mFile, ".") - 1)
               Cells(R, 2) = Left(ObjPercorso, mPosizioneSlash - 1)
               Cells(R, 3) = mNomeFile
               Cells(R, 4) = mEstensione
               R = R + 1
            Next
            
            'Ricorsione. Togliere il REM per attivarla.
            CreaAlbero PercorsoDiPartenza:=cartella.Path
        Next
        On Error Resume Next
        ActiveSheet.ListObjects.Add(xlSrcRange, Range("B8:D" & R), , xlYes).Name = _
            "Table"
        On Error Goto 0
        Set FdS = Nothing
        Set cartelle = Nothing
        Set cartella = Nothing
        Set Documento = Nothing
     End Sub

  5. I seguenti utenti hanno dato un "Like"


  6. #5
    L'avatar di dracoscrigno
    Clicca e Apri
    Data Registrazione
    May 2016
    Località
    ferrara
    Età
    41
    Messaggi
    2074
    Versione Office
    office pro 2010
    Likes ricevuti
    440
    Likes dati
    241

    Re: Tabella Film divisi per genere con Modulo di classe

    Ciao a Tutti e grazie dell' interessamento :) Mi auguro vivamente che mi diate una mano a procedere. Non tanto con listati gia preconfezionati ma, piuttosto, con opinioni ed esempi per migliorare, si il progetto, ma anche il nostro modo di programmare.
    Quindi Cromagno. Vedi di tornare dalle ferie che tutto quel sole ti brucia la crapa

    Patel. Mi chiedi come mai ho dei "Debug.print" piuttosto che popolare una tabella che avevo anche gia creato.
    IN effetti la cosa è un pò strana
    E' il mio modo di programmare:
    Incomincio con un idea vaga e mi si mette a fuoco piano piano, buttando giu qualcosa...

    Citazione Originariamente Scritto da Pensieri accavallati dialogano fra loro
    io - Cosa devo fare?
    un altro io - Voglio una lista di film!
    io - E come lo facciamo?
    un altro io - Mah. Sarà una tabella con dei nomi e dei percorsi.
    io - Va popolata.
    un altro io - Eh. Si. Certo. la popoliamo.
    Di cosa la popoliamo?
    Stefano ha detto che ha diviso tutto in cartelle.
    immagino che ad ogni cartella corrispondano i vari dati:
    sottocartella film piuttosto che serie televisiva
    sottocartella Avventura piuttosto che horror
    sottocartella priam stagione piuttosto che sesta stagione
    sotto cartella NomeDel film per poter contenere tutte le versioni ed i contenuti dello stesso film
    io - No vabbè. Secondo me i film li avra anche categorizzati nel nome. certi parametri saranno li.
    altrimenti cosa ha; annidato sottocartelle fino all' inferno?
    un altro altro io - lasciamo stare la tabella che tanto c'è da creare tutto l' impalco per avere qualcosa da infilarci dentro.
    Direi che un pò di ordine non fa male:
    Una classe per avere tutte le variabili legate al film in esame direi che non è male.
    diamo in pasto alla classe il Percorso-NomeFile-PuntoEstensione e lei ci fa tutto il lavoro la dietro.
    Un altro io - Si si. facciamo così.
    Creiamo anche una procedura per scegliere il percorso di partenz ache mi sono rotto le balle di copioincollare il file nelle sotto cartelle del PC. eccheddiamine!!
    io - Bè. allora eliminiamo anche il superfluo che ora non serve. la tabella la cancello e tolgo anche quelle tre righe che rompono solo le balle.
    Toh!. mettiamo anche una messagebox così premiamo il bottone e vediamo il risultato di qualcosa che cambia.
    un altro altro io - Ecco fatto.
    facciamo tutto con una collection tanto, che dite, di memoria ce ne sarà no?
    con il metodo della classe popoliamo tutta la collection
    nel modulo "varie" c'è la funzione per avere il percorso scelto da fileDialog
    Toh! Eccoti la MessageBox.
    Pare pure funzionare.. facciam du prove va.



    Dicevo Patel. la tabella è il risultato finale e direi che per come avevo intenzione di rigirare la frittata il suo popolamento sia una delle utlime cose. Tant' è vero che credo di aver dato una buona riordinata al listato e mi sembra di vedere che sia tutto più lineare.

    il vecchio listato ha cambiato completamente i connotati:

    Il Foglio rimane uno solo.
    La tabella è saltata via.
    Un unico pulsante che attiva la macro è rimasto, naturalmente e, a seconda di cosa si sceglie come come directori di partenza potrebbe essere necessario attendere anche qualche buona decina di secondi (33k file sono stati processati in un... Non ho cronometrato.. direi tra i 30 ed i 60 secondi ma sto tirando ad indovinare)

    adesso, premendo il foglio si accede ad una finestra di dialogo dove scelgliere la directory di partenaza e, alla fine esce una messagebox con il numero di file processati.

    il messaggio è più un segnaposto per indicare dove andrà infilata la prima istruzione per popolare un eventuale tabella o foglio che sia.


    l' ingresso del programma è, appunto il pulsante che attiva la propira procedura_Evento che, ora, ha più commenti che istruzioni e che dovrebbe farsi capire senza molte parole:

    abbiamo una prima parte in trsta di inizializzazione che ora è occupata solo dalla disabilitazione dell aggiornamento dello schermo
    ed una finalizzzazione in coda che, come quella appena citata, contiene una sola istruzione di ripristino dell' aggiornamento dello schermo.

    prima della finalizzazione c'è la parte dedicata all' elaborazione dei dati memorizzati che ora consta solo di una messagebox a mo di segnaposto.

    Ho tenuto per la fine la porzione più importante, quela che ora occupa la seconda parte di questa procedura.

    Qui viene crata una variabile collection nella quale verranno memorizzati tutti i dati raccolti ed una variabile della classe film per poter utilizzare un metodo in essa contenuta. (si. Ho rinominato la classe perchè mi sembra più appropriato questo nuovo nome )

    Codice: 
    
    Sub CommandButton1_Click()
    '***************************************
    '* INIZIALIZZAZIONE
    '***************************************
        Application.ScreenUpdating = False
        
    '***************************************
    '* creazione di una collezione
    '*   contenente tutti i film
    '***************************************
        '
        Dim CollezioneFilm As Collection    '<- Contenitore della collezione dei film
        Set CollezioneFilm = New Collection
        Dim MetodoDellaMiaClasse As Film     '<- Creata SOLO per utilizzarne il metodo ".CreaCollezione()"
        Set MetodoDellaMiaClasse = New Film
        Set CollezioneFilm = MetodoDellaMiaClasse.CreaCollezione(Varie.SelezionaCartellaDiPartenza)
           
    '****************************************
    '* Elaborazione dei dati memorizzati
    '****************************************
        '
        MsgBox ("file trovati: " & CollezioneFilm.Count)
        
        
    '***************************************
    '* FINALIZZAZIONE
    '***************************************
        Application.ScreenUpdating = True
    End Sub
    Ho aggiunto un modulo standard dove appoggiare le eventuali procedure utili che potrebbero nascere con il tempo ed una è gia al suo interno.
    E' una semplice funzione che restituisce un path attraverso una finestra di dialogo e nel caso venga annullata la procedura, restituisce il percorso di ThisWorkBook.
    L' ho fatta per ovviare al fatto di dover testare il tutto copioincolando il file in giro per le cartelle del pc ma non ditelo a nessuno e comunque, effettivamente, è utile è ampliabile anche per altri utilizzi quindi è unan buona procedura da tenere separata :P
    Codice: 
    'Semplice funzione che restituisce la cartella selezionata nella finestra di dialogo
    Public Function SelezionaCartellaDiPartenza() As String
        Dim FinestraDiDialogo As FileDialog
        Set FinestraDiDialogo = Application.FileDialog(msoFileDialogFolderPicker)
        Dim CartellaSelezionata As String
        
        With FinestraDiDialogo
            .Show
            If .SelectedItems.Count <> -1 Then
                SelezionaCartellaDiPartenza = .SelectedItems(1)
            Else
                SelezionaCartellaDiPartenza = ThisWorkbook.Path
            End If
        End With
    End Function
    Selezionata la cartella il flusso non fa altro che inserire nella collezione di oggetti tutti gli oggetti film creati uno per ogni file trovato utilizzando il metodo memorizzato nella classe Film.

    Ora la classe, si presenta così:
    Codice: 
    Private mPathCompleto As String
    Private mFile As String
    Private mNomeFile As String
    Private mEstensione As String
    Private mPathSplit() As String
    Private mPosizionePunto As Integer
    
    
    
    
    'input della proprietà "PathCompleto".
    Public Property Let PathCompleto(ByVal vDati As String)
        mPathCompleto = vDati
        inizializze (vDati)
    End Property
    'output della proprietà "PathCompleto".
    Public Property Get PathCompleto() As String
        PathCompleto = mPathCompleto
    End Property
    
    
    Public Property Get File() As String
        File = mFile
    End Property
    
    
    Public Property Get NomeFile() As String
        NomeFile = mNomeFile
    End Property
    
    
    Public Property Get Estensione() As String
        Estensione = mEstensione
    End Property
    
    
    Public Property Get PosizionePunto() As String
        PosizionePunto = mPosizionePunto
    End Property
    
    
    Public Property Get PathSplit() As Variant
        PathSplit = mPathSplit
    End Property
    
    
    Private Sub inizializze(dati As String)
        mPosizionePunto = InStr(1, StrReverse(mPathCompleto), ".")
        mPathSplit = Split(mPathCompleto, "\")
        mFile = mPathSplit(UBound(mPathSplit))
        If Not mPosizionePunto < 1 Then
            mEstensione = Right(mFile, mPosizionePunto - 1)
        End If
        mNomeFile = Replace(mFile, "." & mEstensione, "")
    End Sub
    
    
    Public Function CreaCollezione(ByVal PercorsoDiPartenza As String) As Collection
        Dim outCollezione As Collection
        Set outCollezione = New Collection
    
        Dim FdS As FileSystemObject
        Set FdS = New FileSystemObject
    
        Dim cartelle As Folders
        Set cartelle = FdS.GetFolder(PercorsoDiPartenza).SubFolders
    
        Dim cartella As Folder
        For Each cartella In cartelle
            Dim Documento As File
            For Each Documento In cartella.Files
                Dim ObjPercorso As Film
                Set ObjPercorso = New Film
                ObjPercorso.PathCompleto = Replace(Documento.Path, ThisWorkbook.Path, "")
                outCollezione.Add ObjPercorso
            Next
            
            'Ricorsione. Togliere i REM per attivarla.
            'Dim CollezioneRicorsiva As Collection
            'Set collezionericorsiava = New Collection
            'Set CollezioneRicorsiva = CreaCollezione(cartella.Path)
            'Dim Elemento As Film
            'For Each Elemento In CollezioneRicorsiva
            '    outCollezione.Add Elemento
            'Next
        Next
        Set CreaCollezione = outCollezione
    End Function
    Come prima vi ho remmato la parte che riguarda la ricorsione di modo che possiate decidere in tranquillità come procedere valutando prima eventuali miei strafalcioni.


    ...

    Ho cercato qualcosa in rete per ovviare a quella Sub INIZIALIZZE della classe ma a parte qualcosa in inglese che devo aver capito poco e che mi sa che era solo un escamotage per "FAR SEMBRARE" che il modulo di classe avesse un costruttore; non ho trovato niente che mi sfagiolasse per modificare questo approcio che non mi piace affatto.


    Mi sa Patel :)
    Che al prossimo giro che mi leggi, se mi leggi, troverai pure la fantomatica tabella. :P


    Allego di nuovo visti i cambiamenti :)
    File Allegati File Allegati

  7. #6
    L'avatar di dracoscrigno
    Clicca e Apri
    Data Registrazione
    May 2016
    Località
    ferrara
    Età
    41
    Messaggi
    2074
    Versione Office
    office pro 2010
    Likes ricevuti
    440
    Likes dati
    241

    Re: Tabella Film divisi per genere con Modulo di classe

    Citazione Originariamente Scritto da patel Visualizza Messaggio
    Mi è piaciuta, allego versione senza classi per chi come me non le conosce...
    Ih ih ih ih
    mentre scrivevo il post sei arrivato tu ... appena torno ti leggo :)

  8. #7

    L'avatar di scossa
    Clicca e Apri
    Data Registrazione
    Jul 2015
    Località
    Verona Provincia
    Età
    57
    Messaggi
    1011
    Versione Office
    .
    Likes ricevuti
    365
    Likes dati
    0

    Re: Tabella Film divisi per genere con Modulo di classe

    Ciao,

    Citazione Originariamente Scritto da dracoscrigno Visualizza Messaggio
    Mi auguro vivamente che mi diate una mano a procedere. Non tanto con listati gia preconfezionati ma, piuttosto, con opinioni ed esempi per migliorare, si il progetto, ma anche il nostro modo di programmare.
    Ci sono alcune cose nel tuo codice (anzi no, nella tua sequenza ordinata di istruzioni in linguaggio VBA ) che non mi piacciono.

    N.B.: mi sto riferendo al tuo primo post


    In primis, l'aver posto le istruzioni
    Codice: 
                Dim ObjPercorso As Film
                Set ObjPercorso = New Film
    all'interno del ciclo For ... Next, il che comporta che ad ogni iterazione viene creato un nuovo oggetto (il che, tra l'altro, non serve a nulla) senza distruggere il precedente.

    Quindi se fossi in te porteri tutti i Dim e Set all'inizio della sub CreaAlbero.

    Codice: 
    Sub CreaAlbero(ByVal PercorsoDiPartenza As String, TabellaDiArrivo As String)
        Application.ScreenUpdating = False
        Dim FdS As FileSystemObject
        Dim cartelle As Folders
        Dim cartella As Folder
        Dim Documento As File
        Dim ObjPercorso As PercorsoCompleto
        
        Set FdS = New FileSystemObject
        Set cartelle = FdS.GetFolder(PercorsoDiPartenza).SubFolders
        Set ObjPercorso = New PercorsoCompleto
        
    .........
    .........
    P.S.: meglio togliere lo "\" passando il path:
    Codice: 
    ObjPercorso.PathCompleto = Replace(Documento.Path, ThisWorkbook.Path & "\", "")
    Poi riguardo alla classe trovo inutile la chiamata ad Inizializze(), meglio popolare le proprietà della classe direttamente:

    Codice: 
    ....
    .....
    Private mPopulate As String
    
    
    'popolamento delle proprietà della classe.
    Public Property Let Populate(ByVal vDati As String)
        mPathCompleto = vDati
        mPosizionePunto = InStr(1, StrReverse(vDati), ".")
        mPathSplit = Split(mPathCompleto, "\")
        mFile = mPathSplit(UBound(mPathSplit))
        mEstensione = Right(mFile, mPosizionePunto - 1)
        mNomeFile = Replace(mFile, "." & mEstensione, "")
    
    
    End Property
    ....
    ....

    EDIT: ovviamente la chiamata diventa
    Codice: 
    ObjPercorso.Populate = Replace(Documento.Path, ThisWorkbook.Path & "\", "")
    Bye!
    scossa
    scossa's web site
    ___
    Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

  9. #8

    L'avatar di scossa
    Clicca e Apri
    Data Registrazione
    Jul 2015
    Località
    Verona Provincia
    Età
    57
    Messaggi
    1011
    Versione Office
    .
    Likes ricevuti
    365
    Likes dati
    0

    OT: piuttosto che

    Citazione Originariamente Scritto da dracoscrigno Visualizza Messaggio
    un altro io - Eh. Si. Certo. la popoliamo.Di cosa la popoliamo?
    Stefano ha detto che ha diviso tutto in cartelle.
    immagino che ad ogni cartella corrispondano i vari dati:

    sottocartella film piuttosto che serie televisiva
    sottocartella Avventura piuttosto che horror
    sottocartella priam stagione
    piuttosto che sesta stagione
    sotto cartella NomeDel film per poter contenere tutte le versioni ed i contenuti dello stesso film
    il termine Codice tu non lo potrai vedere, ma piuttosto che è veramente da

    Ovviamente è riferito ad un altro io
    Bye!
    scossa
    scossa's web site
    ___
    Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

  10. #9
    L'avatar di dracoscrigno
    Clicca e Apri
    Data Registrazione
    May 2016
    Località
    ferrara
    Età
    41
    Messaggi
    2074
    Versione Office
    office pro 2010
    Likes ricevuti
    440
    Likes dati
    241

    Re: OT: piuttosto che

    Citazione Originariamente Scritto da scossa Visualizza Messaggio
    il termine Codice tu non lo potrai vedere, ma piuttosto che è veramente da

    Ovviamente è riferito ad un altro io
    Stai calmo capo che sto correggendo il codice hammurrabi e non ho tempo di studiar anche Italiano e comunque se lo scrivono anche Treccani non vedo perchè non possa scriverlo io che sono somaro

    Tornando al topic, che mi pare più interessante del mio pessimo modo di scrivere

    Ho preso il tuo consiglio di eliminare la procedura interna INITIALIZZE e di utilizzare una più consona Property let
    Ho naturalmente impostato questa come di sola scrittura ed impostato il vecchio ingresso (Properti PathCompleto) come sola lettura.

    facendola diventare:
    Codice: 
    Option Explicit
    
    
    Private mPathCompleto As String
    Private mFile As String
    Private mNomeFile As String
    Private mEstensione As String
    Private mPathSplit() As String
    Private mPosizionePunto As Integer
    
    
    
    
    Public Property Let PopolaOggetto(ByVal vNewValue As Variant)
        mPathCompleto = vNewValue
        mPosizionePunto = InStr(1, StrReverse(mPathCompleto), ".")
        mPathSplit = Split(mPathCompleto, "\")
        mFile = mPathSplit(UBound(mPathSplit))
        If Not mPosizionePunto < 1 Then
            mEstensione = Right(mFile, mPosizionePunto - 1)
        End If
        mNomeFile = Replace(mFile, "." & mEstensione, "")
    End Property
    
    
    
    
    Public Property Get PathCompleto() As String
        PathCompleto = mPathCompleto
    End Property
    
    
    Public Property Get File() As String
        File = mFile
    End Property
    
    
    Public Property Get NomeFile() As String
        NomeFile = mNomeFile
    End Property
    
    
    Public Property Get Estensione() As String
        Estensione = mEstensione
    End Property
    
    
    Public Property Get PosizionePunto() As String
        PosizionePunto = mPosizionePunto
    End Property
    
    
    Public Property Get PathSplit() As Variant
        PathSplit = mPathSplit
    End Property
    
    
    
    
    Public Function CreaCollezione(ByVal PercorsoDiPartenza As String) As Collection
        Dim outCollezione As Collection
        Dim FdS As FileSystemObject
        Dim cartelle As Folders
        Dim cartella As Folder
        Dim Documento As File
        Dim ObjPercorso As Film
        
        Set outCollezione = New Collection
        Set FdS = New FileSystemObject
        Set cartelle = FdS.GetFolder(PercorsoDiPartenza).SubFolders
        Set ObjPercorso = New Film
        
        For Each cartella In cartelle
            For Each Documento In cartella.Files
                ObjPercorso.PopolaOggetto = Replace(Documento.Path, ThisWorkbook.Path, "")
                outCollezione.Add ObjPercorso
            Next
            
            'Ricorsione. Togliere i REM per attivarla.
            Dim CollezioneRicorsiva As Collection
            Set CollezioneRicorsiva = New Collection
            Set CollezioneRicorsiva = CreaCollezione(cartella.Path)
            Dim Elemento As Film
            For Each Elemento In CollezioneRicorsiva
               outCollezione.Add Elemento
            Next
        Next
        Set CreaCollezione = outCollezione
    End Function
    ho
    Non hai detto niente riguardo a quanto ho evidenziato in rosso. Secondo me non ci hai fatto caso.
    Ho scoperto che sul Pc esistono dei file senza estensione e l' ho scoperto perchè mi andava in debug per colpa della mancanza di un controllo.
    Alla svelta ho scritto quelle 4 righe che si vedono in rosso ma non mi sono mica soffermato a pensare se ho calcolato tutte le possibilità e se, soprattutto, ho ragionato nei giusti termini... Vedremo strada facendo



    Quanto riguarda la dichiarazione delle variabili e compagnia bella. si... lo so che se le infilo la sopra è meglio ma mentre ragiono su cosa combinare mi trovo meglio ad averle li vicino...

    Messo ordine anche a questo:
    Codice: 
    '...
    Public Function CreaCollezione(ByVal PercorsoDiPartenza As String) As Collection
        Dim outCollezione As Collection
        Dim FdS As FileSystemObject
        Dim cartelle As Folders
        Dim cartella As Folder
        Dim Documento As File
        Dim ObjPercorso As Film
        
        Set outCollezione = New Collection
        Set FdS = New FileSystemObject
        Set cartelle = FdS.GetFolder(PercorsoDiPartenza).SubFolders
        Set ObjPercorso = New Film
        
        For Each cartella In cartelle
            For Each Documento In cartella.Files
                ObjPercorso.PopolaOggetto = Replace(Documento.Path, ThisWorkbook.Path, "")
                outCollezione.Add ObjPercorso
            Next
            
            'Ricorsione. Togliere i REM per attivarla.
            'Dim CollezioneRicorsiva As Collection
            'Set CollezioneRicorsiva = New Collection
            'Set CollezioneRicorsiva = CreaCollezione(cartella.Path)
            'Dim Elemento As Film
            'For Each Elemento In CollezioneRicorsiva
               'outCollezione.Add Elemento
            'Next
        Next
        Set CreaCollezione = outCollezione
    End Function
    '...
    Ma la parte commentata è "a mucchio" (tra virgolette perchè non so se Treccani e Accademia della crusca accettino o meno perchè è più semplice decommentare alla bisogna

    Stavo pensando che non ho messo a Nothing i vari oggetti ma mi sa che per farti un pò fuoco sotto non li aggiungo ancora


    Però, a parte gli scherzi, sta storia del garbagecolllector bisogna che la ridiscutiamo perchè non mi hai ancora convinto del tutto e non sai quanto odio impostare ogni volta gli oggetti a nothing.



    Allego anche il file corretto perchè mi sono accorto di essermi dimenticato di Option Explicit ed avevo sbagliato a scrivere una variabile... sai le martellate sulle unghie di Patel dopo :P

    Speriamo che ora sia tutto a posto :)
    File Allegati File Allegati
    Ultima modifica fatta da:dracoscrigno; 20/08/16 alle 15:12 Motivo: aggiunto allegato corretto

  11. #10

    L'avatar di scossa
    Clicca e Apri
    Data Registrazione
    Jul 2015
    Località
    Verona Provincia
    Età
    57
    Messaggi
    1011
    Versione Office
    .
    Likes ricevuti
    365
    Likes dati
    0

    Re: OT: piuttosto che

    Citazione Originariamente Scritto da dracoscrigno Visualizza Messaggio
    ...e comunque se lo scrivono anche Treccani non vedo perchè non possa scriverlo io che sono somaro
    Intanto cominciamo con l'OT che è la parte più importante

    Il problema non è piuttosto che in sé, ma è il suo uso come disgiuntivo che è sbagliato.
    Se dici "in vacanza, vado in montagna piuttosto che al mare ...." significa che "in vacanza, piuttosto che andare al mare vado in montagna" non puoi pensare che il tuo interlocutore lo interpreti come "in vacanza, vado in montagna oppure al mare ...."
    Giusto per ... http://www.accademiadellacrusca.it/i...re-disgiuntivo
    ma credo sia una battaglia persa, visto che persino i giornalisti, ormai semplici utilizzatori di Word, ne fanno abuso
    Bye!
    scossa
    scossa's web site
    ___
    Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

  12. #11

    L'avatar di scossa
    Clicca e Apri
    Data Registrazione
    Jul 2015
    Località
    Verona Provincia
    Età
    57
    Messaggi
    1011
    Versione Office
    .
    Likes ricevuti
    365
    Likes dati
    0

    Re: OT: piuttosto che

    Citazione Originariamente Scritto da dracoscrigno Visualizza Messaggio
    Ho preso il tuo consiglio di eliminare la procedura interna INITIALIZZE e di utilizzare una più consona Property let
    Codice: 
    ....
       mFile = mPathSplit(UBound(mPathSplit))
        If Not mPosizionePunto < 1 Then
    ...
    Perché non semplicemente
    Codice: 
    ....
       mFile = mPathSplit(UBound(mPathSplit))
       If mPosizionePunto > 0 Then
    ...
    ?


    Citazione Originariamente Scritto da dracoscrigno Visualizza Messaggio
    Non hai detto niente riguardo a quanto ho evidenziato in rosso. Secondo me non ci hai fatto caso.
    Avevo precisato che mi riferivo al tuo primo post: logorroico come sei non riuscirei mai a starti dietro (probabilmente tra il mio precedente post e questo avrai già postato almeno 5 modifiche)

    Citazione Originariamente Scritto da dracoscrigno Visualizza Messaggio
    Codice: 
    '...
    Public Function CreaCollezione(ByVal PercorsoDiPartenza As String) As Collection
    ......    
        For Each cartella In cartelle
            For Each Documento In cartella.Files
                ObjPercorso.PopolaOggetto = Replace(Documento.Path, ThisWorkbook.Path, "")
                outCollezione.Add ObjPercorso
            Next
            
            'Ricorsione. Togliere i REM per attivarla.
            'Dim CollezioneRicorsiva As Collection
            'Set CollezioneRicorsiva = New Collection
    ...
    Come già detto, trovo inutile, stilisticamente brutto e probabilmente fonte di problemi usare Set ... New all'interno di un ciclo ma, non avendo il "dump della memoria" per capire come excel gestisce la cosa, mi limito a dire che io non farei mai così.

    Citazione Originariamente Scritto da dracoscrigno Visualizza Messaggio
    Però, a parte gli scherzi, sta storia del garbagecolllector bisogna che la ridiscutiamo perchè non mi hai ancora convinto del tutto e non sai quanto
    Vedi sopra, io preferisco farlo, voi fate vobis
    Bye!
    scossa
    scossa's web site
    ___
    Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

  13. #12
    L'avatar di dracoscrigno
    Clicca e Apri
    Data Registrazione
    May 2016
    Località
    ferrara
    Età
    41
    Messaggi
    2074
    Versione Office
    office pro 2010
    Likes ricevuti
    440
    Likes dati
    241

    Re: OT: piuttosto che

    MAledetta ed incontrollata scarica di elettroni che stuntona e sburlana a destra e manca adesso è normale che ci sia un pò di casotto qui e la. lo sto costruendo a pezzettini di 10m minuti alla volta e non mi va di soffermarmi sui fronzoli. Mi auguro che 4 giga di ram bastino a contenere qualche variabile superflua

    A proposito... Mannaggia! Mi sa che ho gia cambiato alcune cosucce ...
    Dicevo, hai notato che non va in errore?. se Ri-DIM-mi una variabile senza utilizzare REDIM non va in debug? ... Mi sa che non andava in debug perchè mi ero scorato "Option Explicit"... però è interessante

    A parte gli scherzi. cazziami pure maledetto contrabbandiere di mele Però abbi anche pazienza che ormai saprai che ti ascolto ma mi serve il mio tempo


    Comuque.. per ora sono fermo. L' amico, al quale ho dato la bozza che allegherò, doveva spedirmi un txt sul quale avrei potuto finalmente lavorare per terminare il tutto... tornerà prossimamente e prossimamente mi rimetto all' opera per fare qualche danno.



    PATEL.
    Alla fine, modulo di classe, modulo standard, Procedure e funzioni, a parte qualche piccola peculiarità che le contraddistingue, hanno una cosa in comune per le quali sono utili ed indispensabili per poter, a mio modestissimo avviso, implementare un buon programma:

    Sono utili per separare in blocchi più piccoli l' intero algoritmo rendendolo più semplice da comprendere a distanza di tempo e, soprattutto, di dover lavorare solo su piccole porzioni del listato per comprendere dove si trova un errore o per doverlo correggere uan volta trovato.
    Poi, nel caso si cambi idea su una parte del programma si è sicuri che cambiando poche righe del sorgente si possono apportare grandi modifiche.

    Semplicemente per dire che ti ho fregato una parte del tuo post e c'ho costruito una mia SUbroutine... oddio... non so se si possa ancora vedere la firma dell autore. Ih ih ih ih

    .. va bene...
    Ripasso da quì una volta che ho ricevuto quello il txt creato dal foglio :-D :-D


    A presto e grazie come sempre per i buoni consigli :)

    P.s.
    Ricordatevi che io i file li testo sempre molto poco. soprattuto se sono in fase di studio. Ergo... Ocio!
    File Allegati File Allegati

  14. #13
    L'avatar di dracoscrigno
    Clicca e Apri
    Data Registrazione
    May 2016
    Località
    ferrara
    Età
    41
    Messaggi
    2074
    Versione Office
    office pro 2010
    Likes ricevuti
    440
    Likes dati
    241

    Re: OT: piuttosto che

    dimenticavo.

    anche se credo ma non ne son sicuro che sia controllata da un if.

    il file contiene

    APPLICATION.QUIT



    salvate i vostri lavori prima di aprire ed utilizzare l allegato.

  15. #14
    L'avatar di cianricc
    Clicca e Apri
    Data Registrazione
    Jan 2017
    Località
    grosotto (so)
    Età
    60
    Messaggi
    50
    Versione Office
    office 2010-16
    Likes ricevuti
    2
    Likes dati
    36

    creare elenco film - progetto completato?

    salve
    ho trovato il topic scorrendo il forum
    il progetto è interessante.
    volevo sapere se è poi stato completato "rifinendo" alcune cosette, tipo:
    - definizione più puntuale del nome file da salvare;
    - possibilità di salvare il file come xls
    - verifica esistenza di un file da salvare che abbia già lo stesso nome
    - eliminare application.quit che è nella routine SalvaTxtEdEsci
    grazie e a risentirvi
    Ultima modifica fatta da:cianricc; 24/01/17 alle 10:18 Motivo: errori e titolo

  16. #15
    L'avatar di dracoscrigno
    Clicca e Apri
    Data Registrazione
    May 2016
    Località
    ferrara
    Età
    41
    Messaggi
    2074
    Versione Office
    office pro 2010
    Likes ricevuti
    440
    Likes dati
    241

    Re: creare elenco film - progetto completato?

    Citazione Originariamente Scritto da cianricc Visualizza Messaggio
    salve
    volevo sapere se è poi stato completato "rifinendo" alcune cosette, tipo:
    - definizione più puntuale del nome file da salvare;
    - possibilità di salvare il file come xls
    - verifica esistenza di un file da salvare che abbia già lo stesso nome
    - eliminare application.quit che è nella routine SalvaTxtEdEsci
    grazie e a risentirvi
    Il committente ha perso interesse nella cosa ed io ho seguito altre strade. Quindi il progetto è finito nel dimenticatoio. Probabilmente, oggi, affronterei la questione in un altro modo.
    Questo, forse, va più visto come un esercizio u pò balordo per avere un pò più di dimestichezza con le classi.

    Quanto riguarda il salvare il file in un formato differente dal Txt attuale, formato scelto per questioni di progetto, basta cambiare l' istruzione dove vine salvato il txt, con un istruzione in cui si salvi in un altro formato.
    Va da se che, mentre, quì si sovrascrive il file, sempre per questioni relative al progetto, nel caso in cui si salvi un file perchè questo rimanga sul pc, allora, va costruita, attorno ad essa, la struttura di istruzioni atta a controllare e gestire l' eventualità di un nome doppio.

    Anche Application quite nasce da un esigenza di progetto.
    In questo caso non ricordo se è stato implementato da cani oppure ho avuto l' accortezza di fargli salvare e chiudere tutti i progetti eventualmente aperti... E' probabile...

    P.s.

    Prendi questo progetto solo come esercizio per le classi.
    Il processo di prelievo dei file da una cartella e relative sotto cartelle è questione di qualche riga di istruzione che, a mio avviso, potresti trovare più interessante, comprendere nel topic Processare Cartelle o file - Il File Sistem nella sezione Tutorial Excel & VBA


Discussioni Simili

  1. Creazione Tabella - Una Classe per tutte le occasioni
    Di dracoscrigno nel forum Componenti Aggiuntivi, Add-ins e Plugins
    Risposte: 1
    Ultimo Messaggio: 02/06/17, 09:42
  2. Risposte: 16
    Ultimo Messaggio: 27/02/17, 12:10
  3. [Risolto] Riempire array in un modulo e richiamare lo stesso array su un modulo diverso
    Di Domynix nel forum Domande su Excel VBA e MACRO
    Risposte: 8
    Ultimo Messaggio: 07/01/17, 19:36
  4. I Moduli di Classe vba
    Di ggratis nel forum Domande su Excel VBA e MACRO
    Risposte: 6
    Ultimo Messaggio: 19/08/16, 23:12
  5. Calcolo Genere da nome proprio
    Di elfo_pak nel forum Domande su Excel in generale
    Risposte: 7
    Ultimo Messaggio: 13/07/16, 15:41

Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •