Problema apertura file con FileDialog
Hai un problema con Excel? 
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
Vuoi Approfondire?