devba77
Messages postés22Date d'inscriptionsamedi 22 avril 2006StatutMembreDernière intervention20 août 2006
-
25 avril 2006 à 23:11
rvblog
Messages postés792Date d'inscriptionvendredi 4 mars 2005StatutMembreDernière intervention12 juin 2012
-
28 avril 2006 à 11:54
Bonjour,
Le code suivant lit sur un répertoire donné tous les fichiers Excel et les importe dans une base access. Il importe plus particulièrement les onglets
"TestIndicateurs" et "Transpose".
Contrainte lié à mon application:
Ces 2 onglets doivent être masqués. Et le code ici présent marche très bien lorsque les onglets sont visibles, mais ne fonctionne pas lorsque je masque les onglets.
J'ai donc rajouté la procédure Sub "ToutAfficher" (que j'appelle juste avant la lecture):
En utilisant le débugger pas à pas je passe bien dans l'onglet mais il me sort une erreur à la compil.
L'erreur provient apparemment du fait que le fichier est en lecture seule donc il ne peut pas modifier
les onglets en masqué.
J'ai donc changé la ligne suivante:
Set Wb = xlAppl.Workbooks.Open(FileName:=strPathToFiles, ReadOnly:=True)
en
Set Wb = xlAppl.Workbooks.Open(FileName:=strPathToFiles, ReadOnly:=False)
Le programme me fait donc l'import des feuilles masquées parfaitement bien hormis un gros pb à la fin de l'import:
il bug sur les fichiers excel et m'ouvre la boite de dialogue suivante:
"Fichier désormais disponible"
"monFichier.xls" est à présent disponible pour modification.
Ouvrez le fichier en lecture-écriture pour le modifier. (choix Lecture-Ecriture/Annuler)
Et après il plante sur mes fichiers excel. Donc je tue les processus à la main.
En fait Excel réagit comme s'il y avait 2 accès concurrents sur le même fichier.
Comment faire pour éviter cela ? Il ne doit pas y avoir grand chose à changer mais je ne trouve pas
Merci à tous pour votre aide
Le code:
Sub ToutAfficher()
Dim ws As Worksheet
For Each ws In Worksheets
ws.Visible = True
Next
End Sub
Sub ImportAllFiles()
Dim strPathToFiles As String
Dim xlAppl As Excel.Application
Dim Wb As Excel.Workbook
Dim onglet As String
Dim ws As Excel.Worksheet
Dim Repertoire As String, Fichier As String
'Repertoire = "C:\Documents and Settings\dossier"
Repertoire = "C:\Documents and Settings\dossierOngletMasque"
Fichier = Dir(Repertoire & "*.xls")
Do While Fichier ?? ""
Set xlAppl = CreateObject("Excel.Application")
strPathToFiles = Repertoire & Fichier
'Supprimer enreg table T_Import_Brut
DoCmd.RunSQL "DELETE FROM TImport"
DoCmd.RunSQL "DELETE FROM TImport2"
Set Wb = xlAppl.Workbooks.Open(FileName:=strPathToFiles, ReadOnly:=True)
Call ToutAfficher
For Each ws In Wb.Worksheets
If ws.Visible = True Then
onglet = ws.Name
le fait que tu travailles avec le fichier Excel ouvert (tu l'ouvres pour rendre les onglets visibles, et tu ne le fermes pas tout de suite) fait qu'il est verrouillé!
DoCmd.TransferSpreadsheet fonctionne avec un fichier Excel fermé (sans instance d'Excel créée par toi).
Je sais, ça ne t'arrange pas, mais il ne reste plus qu'à faire le nécessaire.
Attention aussi, il manque un espace :
Wb.Close False
<strike>setwb = Nothing</strike>
set wb = Nothing
xlAppl.Quit
Enfin, pour ta procédure ToutAfficher (), tu devrais faire :
Sub ToutAfficher(byrefwksSheetsAs Worksheets)
Dim ws As Worksheet
For Each ws InwksSheets
ws.Visible = True
Next
End Sub
et lui passer la collection à l'appel.
PS : si la réponse te convient, merci de cliquer accepter la réponse.
à+
rvblogn
<sup>
</sup><sup>Je veux ton bien... et je l'aurais... mais jamais avant la page 4
</sup>
devba77
Messages postés22Date d'inscriptionsamedi 22 avril 2006StatutMembreDernière intervention20 août 2006 27 avril 2006 à 19:13
Salut rvblog,
merci pour ta réponse...enfin quelqu'un qui s'intéresse à mon pb...lol
J'ai modifier ma procédure comme tu me l'a indiqué, par contre je n'ai pas compris lorsque tu me dis cela: "Je sais, ça ne t'arrange pas, mais il ne reste plus qu'à faire le nécessaire"
Quelles modifications dois-je apporter à mon code en plus ?
rvblog
Messages postés792Date d'inscriptionvendredi 4 mars 2005StatutMembreDernière intervention12 juin 20127 27 avril 2006 à 19:30
En gros (ou plutôt en bref, ma voiture m'attend),
il te faut :
- ouvrir chaque classeur pour rendre les onglets visibles (je n'ai pas vérifié si c'est vraiment obligatoire, je te crois sur parole) , l'enregistrer tel quel et le fermer.
- appeler le DoCmd.TransferSpreadsheet (donc le classeur est fermé avant l'appel, à toi de te débrouiller pour avoir les noms de fichiers stockés).
- ouvrir à nouveau chaque classeur pour masquer les onglets.
ça fait bouger pas mal ton code, et si ça plante entre temps, tu te retrouves avec des onglets non masqués.
à+
rvblogn
<sup>
</sup><sup>Je veux ton bien... et je l'aurais... mais jamais avant la page 4
</sup>
devba77
Messages postés22Date d'inscriptionsamedi 22 avril 2006StatutMembreDernière intervention20 août 2006 28 avril 2006 à 11:36
Voici comment le code a été modifié:
Dim xlApp As excel.Application
Dim onglet As String
Dim wbk As excel.Workbook
Dim xlOuvert As Boolean
xlOuvert = True
On Error Resume Next
Set xlApp = GetObject(, excel.Application) ' on veut voir si xl est ouvert
If Err.Number <> 0 Then: Err.Clear: xlOuvert = False
On Error GoTo 0
Set wbk = GetObject(myfileName) 'on ouvre le classeur pour permettre l'import
Set xlApp = wbk.Application
wbk.Close xlDoNotSaveChanges
If Not xlOuvert Then xlApp.Quit ' on ne ferme l'apllication que si elle l'était au départ
Set wbk = Nothing
'xlAppl.Application.DisplayAlerts = False' CECI EST DEVENU INUTILE
If Not xlOuvert Then xlApp.Quit ' on ne ferme l'apllication que si elle l'était au départ
rvblog
Messages postés792Date d'inscriptionvendredi 4 mars 2005StatutMembreDernière intervention12 juin 20127 28 avril 2006 à 11:54
dac,
mais je ne comprends toujours pas pourquoi tu ouvres le classeur avant de faire l'import, surtout que tu ne t'en sert pas directement (par sa référence, à part pour obtenir xlApp, mais tu n'en as pas besoin, alors?)
m'enfin, si ça marche!
rvblogn
<sup>
</sup><sup>Je veux ton bien... et je l'aurais... mais jamais avant la page 4
</sup>