Newsgroup: it.comp.appl.access
Titolo: Common dialog e browser for folder per importare file excel

Un saluto a tutti. Ho trovato nel Sito Comune il fantastico esempio di
utilizzo delle common dialog per la selezione di un file.  Dovrei
importare un file excel vorrei utilizzare l'esempio in parola per
effettuare l'operazione. Ho due domande, come passo al metodo
TransferSpreadSheet la stringa variabile contenente il percorso del
file che ottengo con l'esempio?
La seconda domanda è se posso, di default, restringere la scelta del
file agli .xls?
Un grazie di cuore a chi vorrà aiutarmi.


Chiedo scusa per la 'gnuranza, ma è forse un problema risolvibile con
FileDialog?
Sto cercando nell'help oltre che qui e su
microsoft.public.it.office.access (oltre che scaricarmi le demo dal
Sito Comune) provando a capirci qualcosa...
Se non riesco a trovare ciò che cerco spero che qualcuno mi aiuti..
Uso A03
Un saluto, Marco.

Un saluto, Marco.
Devi usare l'oggetto Application.FileDialog(msoFileDialogFilePicker)
Trovi tutto in linea. Per passare il percorso, basta che cicli il metodo show della finestra di dialogo e lo assegni ad una variabile stringa. Poi utilizzando TransferSpreadSheet scrivi direttamente la variabile utilizzata
-- 
Questo articolo e` stato inviato dal sito web 
http://www.nonsolonews.it

 ha scritto nel messaggio 
news:cb122efd-4160-4a2f...@y21g2000hsf.googlegroups.com...

prova con questo: 
http://tinyurl.com/3w35na
Ciao
Daniele 

 --
Ti ringrazio per la risposta Fair.
Ho visto nell'help l'esempio che riporto, penso sia questo quello cui
ti riferivi:
Sub Main()
    'Declare a variable as a FileDialog object.
    Dim fd As FileDialog
    'Create a FileDialog object as a File Picker dialog box.
    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    'Declare a variable to contain the path
    'of each selected item. Even though the path is a String,
    'the variable must be a Variant because For Each...Next
    'routines only work with Variants and Objects.
    Dim vrtSelectedItem As Variant
    'Use a With...End With block to reference the FileDialog object.
    With fd
        'Use the Show method to display the File Picker dialog box and
return the user's action.
        'The user pressed the action button.
        If .Show = -1 Then
            'Step through each string in the FileDialogSelectedItems
collection.
            For Each vrtSelectedItem In .SelectedItems
                'vrtSelectedItem is a String that contains the path of
each selected item.
                'You can use any file I/O functions that you want to
work with this path.
                'This example simply displays the path in a message
box.
                MsgBox "The path is: " & vrtSelectedItem
            Next vrtSelectedItem
        'The user pressed Cancel.
        Else
        End If
    End With
    'Set the object variable to Nothing.
    Set fd = Nothing
End Sub
Se ho capito bene quindi vrtSelectedItem è la mia variabile path,
giusto?
Per passare il percorso, basta che cicli il metodo show della finestra
di dialogo e lo assegni ad una variabile stringa. Poi utilizzando
TransferSpreadSheet scrivi direttamente la variabile utilizzata
Questa parte del tuo messaggio va un pò al di la delle mie
conoscenze...Se potessi farmi un esempio te ne sarei grato (non ho mai
"ciclato" prima :)
Un saluto, Marco.

 ha scritto nel messaggionews:cb122efd-4160-4a2f...@y21g2000hsf.googlegroups.com...

Ti ringrazio per la segnalazione Cidi, avevo già visto quel thread ma
si riferisce al TransferSpreadSheet diciamo "normale".
Io avrei bisogno di avviare l'operazione da una finestra di dialogo,
tipo "Sfoglia" dove potessi scegliere il file xls da importare.
Un saluto, Marco


Ok, credo di esserci riuscito, a volte ci si fa da soli dei blocchi
con il "è troppo difficile per me..."
Il codice è questo:
Private Sub Sfoglia_Click()
    Dim fd As FileDialog
    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    Dim vrtSelectedItem As Variant
    With fd
    If .Show = -1 Then
            For Each vrtSelectedItem In .SelectedItems
DoCmd.TransferSpreadsheet _
    TransferType:=acImport, _
    SpreadsheetType:=acSpreadsheetTypeExcel9, _
    TableName:="TabElencoOggi3", _
    FileName:=vrtSelectedItem, _
    HasFieldNames:=False
            Next vrtSelectedItem
        Else
        End If
    End With
    Set fd = Nothing
End Sub
Mi fa importare il foglio excel selezionato. Il problema ora è che me
lo importa con le intestazioni di colonna che io però ho settato a
False.
Come posso ovviare al problema?
Come posso restringere la selezione dei files dalla finestra di
dialogo ai soli files xls?
Un grazie a chi vorrà chiarirmi questi ultimi dubbi, Marco.

Un grazie a chi vorr=E0 chiarirmi questi ultimi dubbi, Marco.
Ciao Marco. Se guardi l'help, nei dintorni di quello che hai cercato 8non ricordo di preciso dove) c'è la possibilità di selezionare solo i filtri che ti servono. In particolare
with fd
        .Title = ""         'titolo della finestra
        .ButtonName = ""    ' Titolo del bottone
        .AllowMultiSelect = False 'Evita la multiselezione
        .Filters.Clear      'Pulisce tutti i filtri
        .Filters.Add "File excell", "*.txt" 'Imposta il filtro per excell
        .InitialFileName = "" ' Imposta il percorso predefinito
end with
Un altro consiglio. Nel passaggio For each ti conviene assegnare ad una variabile tua il percorso. Alla fine utilizzi il metodo TransferSpreadsheet fuori dal ciclo. Prova anche ad usare il metodo OutputTo per esportare i file, personalmente lo trovo migliore anche graficamente.....


 Prova anche ad usare il metodo OutputTo per esportare i file, personalmente lo trovo migliore anche graficamente.....
Devo solo importare, la grafica e' gentilmente fornita dai report di
Access :) Comunque terro' presente.
Volevo chiedere se i cambi di riferimento alle librerie Microsoft
Office 11.0 Object Library mi possono portare problemi nel trasportare
il db da un pc all'altro.
Sto provando ad informarmi qui e ho trovato riferimenti al latebinding
di cui sto cercando di capire il significato.
Grazie mille per le dritte :)


Funziona alla perfezione. Grazie

Grazie mille per le dritte :)
[risposta]
In teoria Access si porta dietro i riferimenti (se li trova sul computer 'ospite'....Dovresti controllare, altrimenti li devi fournire tu...) ma x il riferimento in oggetto nn dovresti avere problemi....
Per l'esportazione.....una mia svista....è ovvio che devi solo importare!!!!
Per il metodo fuori dal ciclo...forse è una mia fissa, ma il ciclo serve solo per leggere la selezione (1 in questo caso) e siccome tu devi compiere una sola azione, mi sembra più logico eseguire l'azione desiderata al di fuori del ciclo (anche se in questoi caso viene eseguito 1 sola volta...)



Approfitto ancora della tua gentilezza perchè da solo non ne vengo
fuori, ho provato tutta la notte.
Il codice che sto usando è questo:
Private Sub Sfoglia_Click()
   Dim fd As FileDialog
    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    Dim vrtSelectedItem As Variant
    With fd
        .Title = "Scegli File Da Importare"
        .ButtonName = "Importa"
        .AllowMultiSelect = False
        .Filters.Clear
        .Filters.Add "File excell", "*.xls"
        .InitialFileName = ""
        If .Show = -1 Then
            For Each vrtSelectedItem In .SelectedItems
If TabEsiste("TabElencoOggi2") Then
    DoCmd.DeleteObject acTable, "TabElencoOggi2"
End If
On Error GoTo Error_Sfoglia_Click
DoCmd.TransferSpreadsheet _
    TransferType:=acImport, _
    SpreadsheetType:=acSpreadsheetTypeExcel9, _
    TableName:="TabElencoOggi2", _
    FileName:=vrtSelectedItem, _
    HasFieldNames:=False
Exit_Sfoglia_Click:
    Exit Sub
            Next vrtSelectedItem
Error_Sfoglia_Click:
       MsgBox "Formato file non supportato.", vbExclamation, "Errore
di importazione"
 Resume Exit_Sfoglia_Click
     Me.Aggiorna.Visible = True
     Me.Sfoglia.Visible = False
     Me.Scegli.Visible = False
        Else
     Me.Aggiorna.Visible = False
     Me.Sfoglia.Visible = True
     Me.Scegli.Visible = True
    End If
    End With
    Set fd = Nothing
End Sub
TabEsiste e' una funzione che ho trovato tempo fa nel Sito Comune e
che testa l'esistenza di una tabella.
La necessita' della gestione dell'errore nasce dal fatto che importo
la tabella da internet e, anche se e' in formato .xls, non è una vera
cartella di lavoro (probabilmente per una precedente conversione da
testo ad excel) e necessita di un salvataggio come cartella di lavoro
per esserlo.
L'errore e' run time 3274 "la tabela importata non è nel formato
previsto".
Quindi a fronte della scelta nella finestra di dialogo l'utente, se
non ha riconvertito il file, dovrebbe trovarsi il msgbox che lo
avverte dell'errore alla chiusura del quale dovrebbe poter vedere le
etichette "Sfoglia" e "Scegli" e non "Aggiorna".
Su importazione del file convertito invece mi dovrebbe importare il
file, mostrare "Aggiorna" e non mostrarmi "Sfoglia" e "Scegli".
Ho provato in tutti i modi, ma nell'importazione normale mi resta
visibile sempre e solo sfoglia e scegli e non aggiorna come dovrebbe.
Prova a vedere, se ti va, di mettere mano a questo codice per farlo
cantare come dovrebbe :)
Un saluto e grazie, Marco.


Per favore, qualcuno può aiutarmi con questo problema? Senza corretta
procedura di importazione il mio db non parte.....please...

 ...
Per favore, qualcuno che voglia darmi una mano. La procedura
funzionava perfettamente, è che quell'errore mi manda in debug e io
vorrei assolutamente evitarlo.
Un Saluto, Marco

Un saluto e grazie, Marco.
Ciao Marco, nn ho capito quello che devi fare. A prima vista il tuo codice mi sembra un po' contorto (ma ora guardo meglio!). Allora: devi importare un file xsl (da dove? Web,pc...). Apri una finestra di dialogo, selezioni il file che vuoi e lo importi (nn ti conviene cancellare all'inizion l'eventuale tabella d'importazione con un controllo errori? Cosě sei sicuro di non aver problemi..). 'Exit_Sfoglia_Click:' ti forza l'uscita dalla sub dentro il ciclo, senza concludere nulla e chiudere gli oggetti aperti, nn andrebbe messo un po' piů in basso? E le didascalie 'Aggiorna','Sfoglia' e 'Scegli' dove vanno? Sulla finestra di dialogo? Sono pulsanti a parte? Devono essere eseguite prima, dopo, durante la scelta del file?
Fammi sapere...
Roberto


 Questo articolo e` stato inviato dal sito webhttp://
www.nonsolonews.it
Ecomi Roberto e grazie per non avermi mollato perchè questo problema
mi blocca proprio; dunque la procedura serve appunto per importare un
file xls tramite la finestra di dialogo. Apro la mia maschera da
un'altra maschera e visualizzo solo il pulsante Sfoglia, apro la
finestra di dialogo e a questo punto ho due possibilità: importo un
file (che scarico da internet e che quindi si trova sul pc) che è già
stato convertito come cartella di lavoro xls, e a quel punto cancello
la TabElencoOggi2, importo il file, Sfoglia dovrebbe scomparire e
dovrebbe invece comparire il pulsante Aggiorna. La seconda possibilità
è che l'utente, senza ascoltare le mie raccomandazioni, voglia
importare comunque un file che non è stato prima convertito e che
access non riconosce come file excel nonostante abbia estensione .xls.
Questa possibilità mi manda in debug e quindi mi è sorta la necessità
di gestire l'errore (non accadrà magari mai, ma con gli utenti è
sempre meglio prevedere l'imprevedibile). La procedura, prima
dell'inserimento dell'intercettazione dell'errore, funzionava bene ed
ottenevo il mio scopo, se veniva portata a termine la selezione dalla
finestra di dialogo mi appariva Aggiorna e Sfoglia spariva, se invece
la scelta del file veniva annullata, restava visibile Sfoglia e
Aggiorna continuava a rimanere invisibile (questa in realtà è una
terza possibilità). Dopo l'inserimento della gestione dell'errore, mi
resta visibile sempre ed in ogni caso solo Sfoglia, anche in caso di
importazione andata a buon fine e quindi non posso far continuare
l'operazione con l'aggiornamento.
Questo il problema. Il codice che vedi è il risultato di uno dei molti
tentativi che ho fatto per farlo funzionare, quindi ho provato a
spostare i passaggi di Error_Sfoglia_Click prima, dopo, in mezzo
ovunque fino ad arrendermi al fatto che non comprendendone a fondo i
passaggi logici non riesco ad intervenire nel modo giusto.
Exit_Sfoglia_Click l'avevo messo li affinchè, in caso di errore la
maschera rimanesse inalterata (solo il pulsante Sfoglia visibile).
Spero di essere riuscito a spiegare un pò meglio il problema e ti
ringrazio di cuore per l'aiuto che vorrai darmi.
Un saluto, Marco.

Un saluto, Marco.
Sei complicato!!(ma nn più di me che sono un maestro nella complicazione affari semplici!!!) Ti do la mia versione, poi se sbaglio qaltro interverrà....Io farei così: preparo il db (cancello le tabelle etc), apro la mia finestra e seleziono. Memorizzo il percorso del file da utilizzare, lo controllo (quindi sono già fuori dal ciclo), se va tutto bene, eseguo il trasferimento. La gestione degli errori serve proprio a questo: tu intercetti l'errore e poi dici ad Access cosa deve fare. Il problema è che se tu apri ogetti, recordset o imposti la caption dei bottoni, quando VBA trova exit sub, giustamente esce, e NON esegue le righe che ci sono dopo....Nell' Error devi aggiungere tutte le righe di comando per fare quello che desideri, ossia cambiare la caption dei pulsanti, eventuali messaggi, rendere visibile/invisibile quello che vuoi. Nel punto dove l'hai inserito tu, tronca il codice e lascia processi sospesi (tutta la parte di ripristino dell'interfaccia utente)....Prova a metterlo subito prima della tua gestione errori (leggi 
Uscita:
exit sub
Err_gestione:
Chiudo tutti gli oggetti
Ripristino maschera iniziale
quello che vuoi
)
e vedrai che funziona....
Fammi sapere!!!


 Roberto
Ciao Roberto e grazie.


Aggiornamenti: stavo quasi per cantar vittoria.... tramite questo
codice:
Private Sub Sfoglia_Click()
   Dim fd As FileDialog
    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    Dim vrtSelectedItem As Variant
    With fd
        .Title = "Scegli File Da Importare"
        .ButtonName = "Importa"
        .AllowMultiSelect = False
        .Filters.Clear
        .Filters.Add "File excell", "*.xls"
        .InitialFileName = ""
        If .Show = -1 Then
 If TabEsiste("TabElencoOggi2") Then
    DoCmd.DeleteObject acTable, "TabElencoOggi2"
End If
    For Each vrtSelectedItem In .SelectedItems
On Error GoTo Error_Sfoglia_Click
DoCmd.TransferSpreadsheet _
    TransferType:=acImport, _
    SpreadsheetType:=acSpreadsheetTypeExcel9, _
    TableName:="TabElencoOggi2", _
    FileName:=vrtSelectedItem, _
    HasFieldNames:=False
            Next vrtSelectedItem
     Me.Aggiorna.Visible = True
     Me.Sfoglia.Visible = False
     Me.Scegli.Visible = False
Exit_Sfoglia_Click:
    Exit Sub
 Resume Exit_Sfoglia_Click
        Else
     Me.Aggiorna.Visible = False
     Me.Sfoglia.Visible = True
     Me.Scegli.Visible = True
        End If
Error_Sfoglia_Click:
       MsgBox "Formato file non supportato. ", vbExclamation, "Errore
di importazione"
    End With
    Set fd = Nothing
End Sub
Ottengo che intercetti puntualmente l'errore e che in caso di
importazione corretta Sfoglia sparisca e venga visualizzato Aggiorna.
Ho pensato di aver risolto fino a quando, dopo un pò di importazioni
di prova, non ne ho rigettata una con annulla e mi ha dato la
segnalazione dell'errore con il Msgbox.
Spero di venirne a capo, grazie comunque per l'aiuto.

Spero di venirne a capo, grazie comunque per l'aiuto.
Il problema è di logica. Il passaggio
Exit_Sfoglia_Click:
Exit Sub
Resume Exit_Sfoglia_Click
si rimanda a se stesso e spezza la sub!! Resume vuol significare una sorta di 'riprendi da'. Exit sub deve stare alla fine in quanto li la routine esce e nn ci puoi fare nulla!! Quando parlo di 'ciclo' intendo che l'oggetto FileDialog pretende di leggere la risposta dell'utente con 'For each item in ...'.E questo è un ciclo...Quando dico 'è complicato' nn intendo che la procedura è complicata, ma il codice scritto così potrebbe essere farraginoso!
Per esempio
' Trovo il percorso
with
..
..
If .Show =3D -1 Then
    For Each vrtSelectedItem In .SelectedItems
       TuaVariabile = vrtSelectedItem 
    next
end if
end with
' Chiudo tutto
' Ora trasferisco
on Error GoTo Err_desc
DoCmd.TransferSpreadsheet _
    TransferType:=3DacImport, _
    SpreadsheetType:=3DacSpreadsheetTypeExcel9, _
    TableName:=3D"TabElencoOggi2", _
    FileName:=3DvrtSelectedItem, _
    HasFieldNames:=3DFalse
    Me.Aggiorna.Visible =3D True
    Me.Sfoglia.Visible =3D False
    Me.Scegli.Visible =3D False
'Se arrivo qui, è andato tutto bene quindi esco
Uscita:
    exit sub
' Se arrivo qui, c'è stato un errore
' Lo gestisco
Err_desc:
MsgBox "Formato file non supportato. ", vbExclamation, "Errore
di importazione"
' Imposto le condizioni iniziali
Me.Aggiorna.Visible =3D True
Me.Sfoglia.Visible =3D False
Me.Scegli.Visible =3D False
' Torno all'uscita
resume uscita
End Sub
e chiudo. Senza else e un po' più pulito. Tieni conto che più intrecciato è il codice, più sono le possibilità di incorrere in bug e problemi. E' una buona norma (riferisco da altri ovviamente!!!) una volta completato il codice, normalizzarlo, ossia renderlo più breve possibile (magari anche spezzandolo in diverse sub) e meno contorto possibile. In altre parole, deve essere bello (o elegante come dicono i fighi)!!!!Per queste cose ti dovresti rivolgere a qualcuno decisamente più bravo di me....
Fammi sapere!!!



Caro Roberto, grazie un pò alle tue dritte ed un pò alla mia testa
dura, alla fine ci sono riuscito :) praticamente la gestione
dell'errore e' quella che mi hai suggerito in quest'ultimo post. E'
stato un pò difficile capirne la logica ma alla fine funziona tutto
alla perfezione ed e' questo che conta.
Ancora grazie per la tua gentilezza e disponibilità, Marco.

Ancora grazie per la tua gentilezza e disponibilit=E0, Marco.
Perfetto, l'importante č che funzioni (dopo aver capito il perchč!!!!!)
A presto
