Selezionare Folder e richiamarne il percorso



  • Selezionare Folder e richiamarne il percorso
    di Enrico (utente non iscritto) data: 26/01/2014 11:48:37

    Ciao ragazzi, sono Enrico.

    Ho provato a fare un giro nel web ma non riesco a venirne a capo.
    Spiego brevemente la macro e cosa mi servirebbe. La macro deve prendere tutti i file in una cartella (ognuno dei quali ha 4 fogli di struttura identica ma con info diverse) e li incolla nel file dove la macro gira su 4 fogli appositi. Poi sulla base di due fogli di analisi vi è una dashboard che si aggiorna.

    Quello che non riesco ad impostare è il Dialog folder. Praticamente io al momento in ognuno dei 4 moduli faccio puntare alla macro una cartella da uno specifico percorso (ad esempio C:Documents and Settings.......). Io invece vorrei che l'utente la selezionasse una sola volta e che questo percorso fosse richiamato nei 4 moduli

    La parte che dovrei modificare è questa

    MioPercorso = "C:Documents and Settings ome.cognomeDesktopRaccolta dati"
    MioFile = Dir(MioPercorso & "*.xls")

    Come faccio a fare in modo che MioPercorso diventi il percorso della cartella selezionata dall'utente?

    Vi ringrazio anticipatamente per la vostra disponibilità e spero di essere stato chiaro sul problema.

    Grazie e buona domenica





  • di patel data: 26/01/2014 14:01:41

    un esempio
     
    Sub Opendialog9()
    Dim strFile As String, strPath As String
    
        ' Prompt user to select a file
        With Application.FileDialog(msoFileDialogOpen)
            .InitialFileName = "E:prova*.xls*" 'ThisWorkbook.Path & "e*.xls*"
            .Title = "Please Select a File"
            .AllowMultiSelect = False
            .Show
            If .SelectedItems.Count = 0 Then Exit Sub            ' User clicked cancel: Exit
            strFile = .SelectedItems(1)
        End With
        msgbox strFile
    End Sub






  • di Enrico (utente non iscritto) data: 26/01/2014 15:07:11

    Ciao Patel,
    se non sbaglio (non sono un fenomeno di macro e vba) il codice che hai messo mi fa selezionare un determinato file. Io invece vorrei che venissero aperti tutti i file in una data cartella.
    Da lì parte il mio pezzo di macro dove "mio percorso" indica la cartella e poi "mio file" gli dice di aprire tutti i file excel dentro quella cartella.
    Mi sembra che il tuo codice non mi aiuti o sbaglio?
    Forse non mi ero spiegato bene, non so fammi sapere.

    Grazie!



  • di patel data: 26/01/2014 16:30:38

    ti eri spiegato bene, sono io che ho letto quello che volevo io, intendi questo ?
     
    Sub SelectFolder() '  dialog
        Set objFSO = CreateObject("Scripting.FileSystemObject")
        InitialFoldr$ = "E:prova" '<<< Startup folder
        With Application.FileDialog(msoFileDialogFolderPicker) 'User input for folder to look at
            .InitialFileName = Application.DefaultFilePath & ""
            .Title = "Please select a folder to list Files from"
            .InitialFileName = InitialFoldr$
            .Show
            If .SelectedItems.Count = 0 Then Exit Sub
            mfolder = .SelectedItems(1) & ""
        End With
        MsgBox mfolder & "  selected"
    End Sub






  • di patel data: 26/01/2014 17:41:04

    oppure questo
     
    Sub OpenDialogfileUpdate()
    Dim strFile As String
    Set sh = ActiveSheet
    r = 2 ' initial row
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    InitialFoldr$ = "E:prova" '<<< Startup folder
    With Application.FileDialog(msoFileDialogFolderPicker) 'User input for folder to look at
      .InitialFileName = Application.DefaultFilePath & ""
      .Title = "Please select a folder to list Files from"
      .InitialFileName = InitialFoldr$
      .Show
      If .SelectedItems.Count = 0 Then Exit Sub
      mfolder = .SelectedItems(1) & ""
    End With
    strFile = Dir(mfolder & "*.xls*")
    Do While strFile <> ""
        Workbooks.Open mfolder & strFile
    ' ---------- tuo codice
        ActiveWorkbook.Close True
        r = r + 1
        strFile = Dir
    Loop






  • di Grograman data: 27/01/2014 08:34:30

    Estremamente da adattare allo scopo:
     
    Private Sub Sfoglia_Files()
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ''''' ATTENZIONE RICHIEDE L'ATTIVAZIONE DELLA LIBRERIA MICROSOFT SCRIPTING RUNTIME '''''
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '' Per l'attivazione andare su "Strumenti", "Riferimenti", cercare e spuntare il nome ''
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
       
        Dim strPath As String
        Dim fd As FileDialog
        Dim objfd As Variant
        
        Dim objFSY As FileSystemObject
        Dim objFOL As Folder
        Dim objFIL As File
        
        Set fd = Application.FileDialog(msoFileDialogFolderPicker)
        With fd
    			.InitialFileName = "C:"
    			.Title = "Sfoglia cartelle"
    			.ButtonName = "Ok"
    			.AllowMultiSelect = False
    			.InitialView = msoFileDialogViewDetails
    			.Show
    			For Each objfd In .SelectedItems
    				strPath = objfd
    			Next objfd
        End With
        
        If strPath = "" Then GoTo Uscita
        
        Set objFSY = New FileSystemObject
        Set objFOL = objFSY.GetFolder(strPath)
        
        For Each objFIL In objFOL.Files
                Debug.Print objFIL.Name 'o altre azioni da fare sui files
        Next
    Uscita:
        Set objFSY = Nothing
        Set objFOL = Nothing
        Set fd = Nothing
    End Sub
    



  • di Enrico (utente non iscritto) data: 28/01/2014 23:51:08

    Ciao ragazzi,
    scusate il ritardo nella risposta ma il lavoro mi ha preso un pò troppo in questi giorni.

    Allora sinceramente non capisco bene quale possa essere quella che meglio si adatta alla mia macro nè dove dovrei inserirla (anche se ho fatto un pò di tentativi).
    Inserisco il codice della mia macro e spero che qualcuno possa aiutarmi sul "dove inserire una di quelle macro da voi proposte" (userei la più semplice che mi sembra la prima di patel)

    Spero davvero in un vostro aiuto e vi ringrazio in anticipo!!

    Buona notte!!
     
    Sub Leggi_Dati_e_Copia_Celle_di_SALES()
        Application.ScreenUpdating = False
        Nome_Precedente = ActiveWorkbook.Name
        MioPercorso = "C:Documents and Settingsenrico.ferreriDesktopProva BI Navigator"
        MioFile = Dir(MioPercorso & "*.xls")
        RR = Range("B" & Rows.Count).End(xlUp).Row
        Workbooks(Nome_Precedente).Worksheets("SALES").Visible = xlSheetVisible
        If RR = 1 Then
            RR = 2
        End If
                Cancella_tutto_di_SALES
            Windows(Nome_Precedente).Activate
        Sheets("SALES").Select
        Range("A2:AR" & RR).ClearContents
            RR = 1
        Do While MioFile <> ""
            I = RR + 1
            Cells(I, 1) = MioFile
                    Scrivi_Dati_di_SALES
                            MioFile = Dir()
        Loop
        Workbooks(Nome_Precedente).Worksheets("SALES").Visible = xlSheetHidden
        Application.ScreenUpdating = True
        End Sub
    
    Sub Scrivi_Dati_di_SALES()
        Workbooks.Open Filename:=MioPercorso & Cells(I, 1)
        Sheets("SALES").Select
        RR = Range("D" & Rows.Count).End(xlUp).Row
        Range("B11:AO" & RR).Copy
        Windows(Nome_Precedente).Activate
        Sheets("SALES").Select
        Range("B" & I).PasteSpecial Paste:=xlPasteValues
        RR = Range("B" & Rows.Count).End(xlUp).Row
        Range("A" & I).Copy
        Range("A" & I + 1 & ":A" & RR).Select
        ActiveSheet.Paste
        Windows(MioFile).Close savechanges:=False
    
    End Sub
    Sub Cancella_tutto_di_SALES()
    '
    ' Cancella_tutto Macro
    '
    
    '
         Sheets("SALES").Select
        Range("A2:AR1048575").ClearContents
        
    End Sub



  • di patel data: 29/01/2014 08:10:58

    l'ha già detto tu nel primo post dove inserire il codice, al posto di mio percorso ....





  • di Enrico (utente non iscritto) data: 30/01/2014 11:31:27

    Ciao Patel,
    io ti ringrazio tanto ma sono talmente negato, nonostante i miei sforzi che non riesco proprio a capire.

    Io sulla base della mia macro postata qualche post indietro ho provato a mettere la tua macro al posto del percorso inserito sotto "mio percorso" ma non funziona, ho provato ad inserire il tuo pezzo sotto denominandolo come "mio percorso" ma la parte che dice mio file = ..... non lo recepisce...
    Sinceramente non so dove sbattere la testa....
    Se non ti disturba troppo te ne sarei grato se mi facessi un esempio specifico di dove dovrei inserirlo, altrimenti vorrà dire che nel weekend ci perderò un pò di tempo sopra.

    Ad ogni modo grazie mille per gli spunti,

    buona giornata,

    Enrico



  • di patel data: 30/01/2014 12:17:07

    mi sembra più sensato che TU alleghi il file con la macro che hai modificato





  • di Zer0Kelvin data: 02/02/2014 04:34:20

    Ciao.
    Non ho letto tutto il post ma, in base al quesito di partenza, dopo aver selezionato la cartella MioPercorso, dovrebbe essere sufficiente:
     
    ChDdrive(MioPercorso)
    ChDir(MioPercorso)



  • di Zer0Kelvin data: 02/02/2014 14:39:37

    Rileggendo meglio, mi sono accorto di un errore GRAVISSIMO da te commesso: tu usi variabili con lo stesso nome in sub differenti pensando che siano la stessa variabile, MA NON E' COSI'.
    Prima di avventurarsi nella programmazione, bisognerebbe capire come funzionano le variabili.
    Innanzitutto, anche se in VBA non è obbligatorio (che Microsoft bruci all'inferno per questo) LE VARIABILI VANNO DICHIARATE.
    In pratica succede questo, Es.:

    Sub Leggi_Dati_e_Copia_Celle_di_SALES()
    ........
    MioPercorso = "C:Documents and Settingsenrico.ferreriDesktopProva BI Navigator"

    VBA incontra una parola sconosciuta (MioPercorso ), quindi presume che si tratti di una variabile LOCALE (cioè valida solo all'interno della routine corrente), crea una variabile di tipo Variant e le assegna il valore richiesto .

    Sub Scrivi_Dati_di_SALES()
    Workbooks.Open Filename:=MioPercorso & Cells(I, 1)

    Come prima VBA incontra un nome sconosciuto, in quanto la variabile precedente (LOCALE) non è visibile al di fuori della Routine Leggi_Dati_e_Copia_Celle_di_SALES e smette di esistere quando la routine termina; quindi crea una NUOVA variabile di tipo Variant ed ovviamente non le assegna alcun valore. La seconda variabile NON CONTIENE NULLA!
    Ecco come dovrebbe essere il codice ( Option Explicit all'inizio del modulo serve a rendere obbligatoria la dichiarazione delle variabili)
     
    Option Explicit
    
    Dim MioPercorso As String, Nome_Precedente As String, MioFile As String 'queste variabili sono visibili in tutto il modulo
    Dim I As Long 'idem
    
    Sub Leggi_Dati_e_Copia_Celle_di_SALES()
    Dim RR As Long 'questa variabile è visibile solo all'interno di questa routine
        Application.ScreenUpdating = False
        Nome_Precedente = ActiveWorkbook.Name
        MioPercorso = "C:Documents and Settingsenrico.ferreriDesktopProva BI Navigator"
        MioFile = Dir(MioPercorso & "*.xls")
        RR = Range("B" & Rows.Count).End(xlUp).Row
        Workbooks(Nome_Precedente).Worksheets("SALES").Visible = xlSheetVisible
        If RR = 1 Then
            RR = 2
        End If
                Cancella_tutto_di_SALES
            Windows(Nome_Precedente).Activate
        Sheets("SALES").Select
        Range("A2:AR" & RR).ClearContents
            RR = 1
        Do While MioFile <> ""
            I = RR + 1
            Cells(I, 1) = MioFile
                    Scrivi_Dati_di_SALES
                            MioFile = Dir()
        Loop
        Workbooks(Nome_Precedente).Worksheets("SALES").Visible = xlSheetHidden
        Application.ScreenUpdating = True
    End Sub
    
    Sub Scrivi_Dati_di_SALES()
    Dim RR As Long 'idem
        Workbooks.Open Filename:=MioPercorso & Cells(I, 1)
        Sheets("SALES").Select
        RR = Range("D" & Rows.Count).End(xlUp).Row
        Range("B11:AO" & RR).Copy
        Windows(Nome_Precedente).Activate
        Sheets("SALES").Select
        Range("B" & I).PasteSpecial Paste:=xlPasteValues
        RR = Range("B" & Rows.Count).End(xlUp).Row
        Range("A" & I).Copy
        Range("A" & I + 1 & ":A" & RR).Select
        ActiveSheet.Paste
        Windows(MioFile).Close savechanges:=False
    
    End Sub
    
    Sub Cancella_tutto_di_SALES()
        Sheets("SALES").Select
        Range("A2:AR1048575").ClearContents
    End Sub
    



  • di Zer0Kelvin data: 02/02/2014 14:41:47

    PS: invece di usare variabili globali sarebbe opportuno ricorrere al passaggio di parametri.



  • di Enrico (utente non iscritto) data: 02/02/2014 14:54:25

    Ciao zerokelvin,
    Le variabili io le ho dichiarate chiaramente. Non ho riportato nella macro che ho messo sul forum la parte di option explicit ma chiaramente le ho dichiarate. Purtroppo rimango bloccato nel senso non capisco se la macro di patel ad esempio dovrebbe essere usata come ulteriore sub oppure no? O cmq la posizione di quella funzione di selezione cartella all'interno della macro. Purtroppo non ho ancora avuto tempo di caricare la macro all'interno del forum ma credo anche che non ve ne sia bisogno se solo riuscissi a capire dove inserire il "seleziona cartella"...forse più tardi avrò del tempo per smanettarci un pò, ma chiaramente se sapessi indicarmi il "dove" applicarmi mi sarebbe di grande aiuto.

    Grazie,
    Enrico



  • di Zer0Kelvin data: 02/02/2014 18:52:55

    Premesso che stò andando un pò a naso, non avendo sottomano i files e relative strutture, tutto ciò di cui dovresti aver bisogno è qualcosa del genere:
     
    Option Explicit
    
    Sub Leggi_Dati_e_Copia_Celle_di_SALES()
    Dim RR As Long, I As Long
    Dim MioPercorso As String, MioFile As String
        MioPercorso = "C:Documents and Settingsenrico.ferreriDesktopProva BI Navigator"
        'oppure
        'MioPercorso = GetFolderName & ""
        MioFile = Dir(MioPercorso & "*.xls")
        ActiveWorkbook.Sheets("SALES").UsedRange.ClearContents
        RR = 1
        Do While MioFile <> ""
            I = RR + 1
            Cells(I, 1) = MioFile
            Scrivi_Dati_di_SALES MioFile, I
            MioFile = Dir()
        Loop
    End Sub
    
    Sub Scrivi_Dati_di_SALES(fName As String, Index As Long)
    Dim WkNew As Workbook, SH2 As Worksheet, SH1 As Worksheet
    Dim RR As Long
        Application.ScreenUpdating = False
        Set SH1 = ActiveWorkbook.Sheets("SALES")
        Set WkNew = Workbooks.Open(fName)
        Set SH2 = WkNew.Sheets("SALES")
        RR = SH2.Range("D" & Rows.Count).End(xlUp).Row
        SH2.Range("B11:AO" & RR).Copy
        SH1.Range("B" & Index).PasteSpecial Paste:=xlPasteValues
        RR = SH1.Range("B" & Rows.Count).End(xlUp).Row
        SH1.Range("A" & Index).Copy Destination:=SH1.Range("A" & Index + 1 & ":A" & RR)
        WkNew.Close savechanges:=False
        Application.ScreenUpdating = True
    End Sub
    
    Function GetFolderName() As String
        GetFolderName = ""
        With Application.FileDialog(msoFileDialogFolderPicker)
            .AllowMultiSelect = False
            .Show
            If .SelectedItems.Count > 0 Then GetFolderName = .SelectedItems(1)
        End With
    End Function
    



  • di Zer0Kelvin data: 02/02/2014 18:54:07

    PS: ovviamente NON E' TESTATO e potrei aver male interpretato il tuo codice...



  • di Zer0Kelvin data: 02/02/2014 18:59:07

    Piccola svista:
     
            Scrivi_Dati_di_SALES MioFile, I
    deve essere invece
            Scrivi_Dati_di_SALES MioPercorso & MioFile, I



  • di scossa data: 02/02/2014 19:57:20

    cit Enrico: "Le variabili io le ho dichiarate chiaramente. Non ho riportato nella macro che ho messo sul forum la parte di option explicit ma chiaramente le ho dichiarate. .....
    ........ Purtroppo non ho ancora avuto tempo di caricare la macro all'interno del forum ma credo anche che non ve ne sia bisogno .... "

    Scommetto che se tu potessi, avendo mal di schiena, al medico porteresti solo la schiena ...



  • di Enrico (utente non iscritto) data: 03/02/2014 12:12:38

    Buongiorno a tutti,
    scusate se poi ieri non sono riuscito a dare alcun riscontro.
    Finalmente il problema è risolto grazie al vostro aiuto e alla vostra pazienza. Alla fine ho utilizzato il codice di Zer0Kelvin ed il mio codice adesso risulta questo.

    @Zer0Kelvin perchè mi dici quella piccola svista:

    Scrivi_Dati_di_SALES MioFile, I
    deve essere invece
    Scrivi_Dati_di_SALES MioPercorso & MioFile, I

    A me anche senza questa modifica gira perfettamente (in realtà mi sembra normale che giri anche perchè MioFile include già l'informazione MioPercorso essendo MioFile= Dir(MioPercorso & "*.xls").
    Se mi sfugge qualcosa ti prego di farmelo presente.

    Ringrazio tutti e dichiaro il mio problema risolto!!
    Ancora grazie e buon giornata

    Enrico
     
    Option Explicit
    Public MioPercorso As String, MioFile As String, I As Integer, J As Integer, RR As Integer, Nome_Precedente As String  ''Per gli amanti delle battute (ogni riferimento a sossa è puramente voluto) non avevo inserito questa parte semplicemente perchè di corsa ma anche perchè ritenessi fosse veramente scontato, ma forse mi sbagliavo e questo non capiterà più. Prossima volta posto con le dichiarazioni di variabili fin da subito 
    
    Sub Leggi_Dati_e_Copia_Celle_di_SALES()
        Application.ScreenUpdating = False
        Nome_Precedente = ActiveWorkbook.Name
        MioPercorso = GetFolderName & ""
        '"C:Documents and Settingsenrico.ferreriDesktopRaccolta dati LBP"
        MioFile = Dir(MioPercorso & "*.xls")
        RR = Range("B" & Rows.Count).End(xlUp).Row
        Workbooks(Nome_Precedente).Worksheets("SALES").Visible = xlSheetVisible
        If RR = 1 Then
            RR = 2
        End If
        
            Cancella_tutto_di_SALES
        
        Windows(Nome_Precedente).Activate
        Sheets("SALES").Select
        Range("A2:AR" & RR).ClearContents
        
        RR = 1
        Do While MioFile <> ""
            I = RR + 1
            Cells(I, 1) = MioFile
            
            Scrivi_Dati_di_SALES
                    
            MioFile = Dir()
        Loop
        Workbooks(Nome_Precedente).Worksheets("SALES").Visible = xlSheetHidden
        Application.ScreenUpdating = True
        
    End Sub
    
    
    Sub Scrivi_Dati_di_SALES()
        Workbooks.Open Filename:=MioPercorso & Cells(I, 1)
        Sheets("SALES").Select
        RR = Range("D" & Rows.Count).End(xlUp).Row
        Range("B11:AO" & RR).Copy
        Windows(Nome_Precedente).Activate
        Sheets("SALES").Select
        Range("B" & I).PasteSpecial Paste:=xlPasteValues
        RR = Range("B" & Rows.Count).End(xlUp).Row
        Range("A" & I).Copy
        Range("A" & I + 1 & ":A" & RR).Select
        ActiveSheet.Paste
        Windows(MioFile).Close savechanges:=False
    
    End Sub
    Sub Cancella_tutto_di_SALES()
    '
    ' Cancella_tutto Macro
    '
    
    '
         Sheets("SALES").Select
        Range("A2:AR1048575").ClearContents
        
    End Sub
    
    
    Function GetFolderName() As String
        GetFolderName = ""
        With Application.FileDialog(msoFileDialogFolderPicker)
            .AllowMultiSelect = False
            .Show
            If .SelectedItems.Count > 0 Then GetFolderName = .SelectedItems(1)
        End With
    End Function
    



  • di Enrico (utente non iscritto) data: 03/02/2014 14:53:26

    Scusate ma non riuscivo ad editare il post precedente. Scrivo questo messaggio solo per spuntare il tastino con "discussione risolta" che nel post precedente non me l'ha preso