Pb Import fichier excel

devba77 Messages postés 22 Date d'inscription samedi 22 avril 2006 Statut Membre Dernière intervention 20 août 2006 - 25 avril 2006 à 23:11
rvblog Messages postés 792 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 12 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

If onglet = "TestIndicateurs" Then

' transfert vers table T_Import_Brut
DoCmd.TransferSpreadsheet acImport, 8, "TImport", strPathToFiles, False, onglet & "!H2:L201"

ElseIf onglet = "Transpose" Then

' transfert vers table T_Import_IG
DoCmd.TransferSpreadsheet acImport, 8, "TImport2", strPathToFiles, False, onglet & "!A1:F"

End If
End If
Next ws

Wb.Close False
setwb = Nothing
xlAppl.Quit
Set xlAppl = Nothing

Fichier = Dir
Loop
End Sub

7 réponses

rvblog Messages postés 792 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 12 juin 2012 7
27 avril 2006 à 14:37
Salut 754729 devba77,

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>
0
devba77 Messages postés 22 Date d'inscription samedi 22 avril 2006 Statut Membre Dernière intervention 20 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 ?


D'avance merci,
@+
0
rvblog Messages postés 792 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 12 juin 2012 7
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>
0
devba77 Messages postés 22 Date d'inscription samedi 22 avril 2006 Statut Membre Dernière intervention 20 août 2006
27 avril 2006 à 22:47
salut,

dsl, je n'ai pas encore tout compris...
si mon classeur est fermé, je peux comme même le lire ?


Où doivent être stockés le nom des fichiers ?


Les onglets peuvent rester démasqués après la lecture, ça ne pose pas de souci.


ps: en fait, tu as raison je n'ai besoin d'ouvrir que 2 onglets pour l'importation (les deux onglets masqués justement...)


 


merci encore, @]+ 


 


 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
rvblog Messages postés 792 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 12 juin 2012 7
27 avril 2006 à 23:04
oui, pas besoin d'ouvrir le classeur (et même interdit d'ouvrir le classeur) pour le DoCmd.TransferSpreadsheet  !

les noms de fichiers à stocker, c'est si tu veux en traiter plusieurs (de fichiers), et pour les stocker, mets-les dans un tableau.

à+
rvblogn

<sup>
</sup><sup>Je veux ton bien... et je l'aurais... mais jamais avant la page 4
</sup>
0
devba77 Messages postés 22 Date d'inscription samedi 22 avril 2006 Statut Membre Dernière intervention 20 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

onglet = "TestIndicateurs"

' transfert vers table T_Import_Brut
DoCmd.TransferSpreadsheet acImport, 8, "TImportCompta", myfileName, False, onglet & "!A2:F201" 'ici les valeurs des plages étaient bidonnées
DoCmd.TransferSpreadsheet acImport, 8, "TImportClient", myfileName, False, onglet & "!A203:F291"
DoCmd.TransferSpreadsheet acImport, 8, "TImportJuridique", myfileName, False, onglet & "!A293:F328"
DoCmd.TransferSpreadsheet acImport, 8, "TImportCom", myfileName, False, onglet & "!A339:F344"
DoCmd.TransferSpreadsheet acImport, 8, "TImportTraitement", myfileName, False, onglet & "!A346:F352"


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

Set xlApp = Nothing



End Sub
0
rvblog Messages postés 792 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 12 juin 2012 7
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>
0
Rejoignez-nous