Problema apertura file con FileDialog



  • Problema apertura file con FileDialog
    di cauanna data: 02/06/2013 20:03:23

    Salve,
    vi espongo il mio problema:
    ho una serie di file dai quali copio lo stesso intervallo di celle su un file riepilogativo.
    Attualmente attraverso l'oggetto FileDialog scelgo più file e copio il loro contenuto senza un ordine preciso. Mi servirebbe copiare in sequenza gli intervalli, partendo dal primo file selezionato fino all'ultimo.
    E' Possibile???
    Grazie.



  • di Vecchio Frac data: 02/06/2013 20:45:48

    "In sequenza" si intende "in ordine di selezione" nella file dialog?
    Scorrendo l'insieme .SelectedItems della file dialog i file non sono memorizzati nella sequenza con cui li hai scelti, ma come appaiono nella cartella. Puoi verificarlo con un semplice for each nella finestra immediata dopo aver impostato un punto di interruzione dopo la scelta dei file (segue codice di test).
    Per ovviare, puoi prenominare i file con un indice numerico che rispetti la sequenza desiderata.
    Altrimenti occorre che innesti una breve procedura (in un piccolo userform che guidi l'utente a selezionare l'ordine dei file mediante una listbox) con cui individui un file alla volta della cartella desiderata e lo metti in un array (o una collection). Successivamente la routine principale pescherà da questo array ordinato come vuoi tu i file da cui trarre il range da copiare.
     
    Sub test()
    Dim f As Variant
    
        With Application.FileDialog(msoFileDialogOpen)
            .AllowMultiSelect = True
            .Show
    
            For each f in .SelectedItems
                Debug.Print f.name
            Next 
        End With
    End Sub






  • di cauanna (utente non iscritto) data: 02/06/2013 22:51:13

    Effettivamente è come dici tu.

    "Prenominare i file con un indice numerico che rispetti la sequenza desiderata."
    Se intendi i nomi dei file.. sono del tipo "File_20-05-2013", "File_21-05-2013" etc.... ma non vengono ordinati.
    Non essendo molto esperta di VBA, potresti darmi una mano sulla procedura userform+routine principale?
    Ti ringrazio.



  • di Vecchio Frac data: 03/06/2013 14:31:45

    Allego un file buttato giù al volo, quindi migliorabile, con una form da cui puoi scegliere da una cartella qualsiasi i file che vuoi, mostrarli in un elenco apposito che puoi riordinare, e che infine mostra l'elenco esatto dei file come tu li hai ordinati. L'elenco (in una variabile "list_of_files") è liberamente manipolabile per estrarre da lì i file nell'ordine desiderato all'interno del tuo programma principale.





  • di cauanna data: 03/06/2013 18:46:47

    E' proprio ciò che cercavo... ma purtroppo la mia scarsa "conoscenza" non mi permette di assemblare la userform con il programma principale (di cui allego la parte fondamentale).
    Ho provato ad utilizzare la variabile "list_of_file" nel ciclo For Each .. ma mi da errore.

     
    Option Explicit
    Sub Riepilogo()
      Dim FD As FileDialog, MyRange As Range, varFile As Variant, sh As Byte, LC As Integer, _
      W1 As Workbook, W2 As Workbook, n As Byte
      Set MyRange = [A1:M40]
      Set W1 = ActiveWorkbook
      n = 1
        Set FD = Application.FileDialog(msoFileDialogFilePicker)
        With FD
            .InitialFileName = "C:"  'Per selezionale da dove fare iniziare la ricerca
            .AllowMultiSelect = True 'posso selezionare più files
            .Show
                Application.ScreenUpdating = False 'Conviene spegnere lo schermo
                For Each varFile In .SelectedItems 'Il ciclo esterno scorre tutti i files selezionati
                Workbooks.Open varFile
                Set W2 = ActiveWorkbook
                    For sh = 1 To Worksheets.Count 'Il ciclo interno scorre tutti i fogli di ogni singolo file
                    ' In ogni foglio prende l'intervallo A1:M40 e lo incolla nel corrispondente foglio del file di riepilogo
                    W2.Worksheets(sh).Range(MyRange.Address).Copy
                    W1.Worksheets(sh).Cells(1, n).PasteSpecial xlPasteValuesAndNumberFormats
                    Next
                ' Adesso trovo la colonna su cui posizione il successivo intervallo di dati
                n = n + Columns("M").Column 'Rappresenta la colonna M dell'intervallo preso in esame
                Application.CutCopyMode = False 'svuoto la memoria dagli appunti
                W2.Close savechanges:=False
                Next
        End With
    Application.ScreenUpdating = True
    Sheets(1).Select
    Range("A1").Select
    End Sub



  • di Vecchio Frac data: 04/06/2013 10:43:39

    Prova la revisione 2 che allego ("esempio per cauanna - vfrac2").
    Non avendo i dati originali non ho potuto fare test affidabili (ma la struttura della tua macro originale è stata rispettata).





  • di cauanna data: 04/06/2013 18:08:27

    Tre aggettivi.... competente, sintetico, risolutore.

    Ho solo dovuto modificare alcune definizioni di variabili e il tutto ha funzionato alla perfezione.

    Ti ringrazio tanto

    Ciao



  • di Vecchio Frac data: 04/06/2013 18:13:40

    cit. "Ho solo dovuto modificare alcune definizioni di variabili"
    ---> questo mi preoccupa un pochino ^_^





  • di cauanna data: 04/06/2013 18:28:20

    Le variabili MyRange e sh non erano definite.
    Ma nessun problema.... se sono stata capace io .. non penso ti debba preoccupare.



  • di Vecchio Frac data: 04/06/2013 18:41:13

    In effetti: ho controllato e nel mio codice ho commesso l'errore di non dichiarare sh. Per fortuna Option Explicit ti è venuto in aiuto segnalandoti l'errore ^_^
    Invece myRange puoi eliminarlo, perchè non serve. Puoi eliminare tranquillamente tutta la riga della sub Riepilogo
    Set MyRange = W1.Sheets(1).[A1:M40]
    perchè non mi serve definire il range, visto che ci accedo direttamente nell'istruzione:
    sh.[A1:M40].Copy






  • di cauanna data: 04/06/2013 18:45:12

    OK... Ricevuto