ADO - problème accès "Feuil1" sur fichier fermé

CAPRI_456

XLDnaute Occasionnel
Bonjour le Forum,

Dans une procédure ADO qui exécute la récupération de données sur une feuille ("Feuil1") d'un classeur fermé, j'ai un souci.

Mes feuilles identiques des classeurs fermés ne se nomment pas "Feuil1" mais ont le nom de fichier par exemple "10-LG1830"

Lorsque j'utilise la procédure ci dessous avec le véritable nom de la feuille , soit "10-LG1830" tout se déroule à merveille.
Mais comme les noms de fichiers peuvent changer et par conséquent le nom de la feuille1 , cette procédure par l'appel de "Feuil1" ne fonctionne pas.

Comment trouver solution à ce problème :

Dim CheminXLS As String
Dim NomFichierDepart As String
'A1.------ Adresse du fichier à lire (ici un listview)
CheminXLS = .ListItems(.SelectedItem.Index).ListSubItems(6)
NomFichierDepart = UserForm1.ListView1.SelectedItem.Text

'A2.------Adresse de la feuille 'n'oubliez pas d'ajouter $ au nom de la feuille.
Feuille = "10-LG1830" = parfait :) (nB j(insère le $ plus bas dans le code)
Feuille = "Feuil1" = pas d'accès possible :rolleyes:" Moteur jet ne peut accéder à feuille
'A3.------Adresse de la plage contenant la donnée à récupérer
Plage = ("A2:AV100")
'A3 ----- 'prépare les commandes ADO
'++ OUVRE UNE CONNECTION ADO VERS le CLASSEUR excel FERME
Set Source = New ADODB.Connection
Source.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & CheminXLS & "\" & NomFichierDepart & _
";Extended Properties=""Excel 8.0;HDR=No;"";"


'++++++++++ exerce la requete ADO sur la donnée à recopier
texte_SQL = "SELECT * FROM " & " [" & Feuille & Plage & "$]"
Set Requete = CreateObject("ADODB.Recordset")

Requete.Open texte_SQL, Source, adOpenStatic



Application.DisplayAlerts = False
Workbooks(NomFichierDepart).Close SaveChanges:=False


'***********************'OUVERTUE DU FICHIER "MODELE" *******************************************************

Dim Workbook
Dim CheminModèle As String
CheminModèle = "D:\Serveur\modèle-lecture-22-11.xls"
'=répertoire destination
Workbooks.Open CheminModèle
'puis nettoyage du contenu en partant de la dernière ligne complétée
Sheets("Feuil1").Range(Cells(2, 2), Cells(Cells(65536, 2).End(xlUp)(2).Row, 48)).ClearContents

Range("B2").CopyFromRecordset Requete

Requete.Close
Source.Close
Set Source = Nothing
Set Requete = Nothing
Set Cd = Nothing

' End With

Application.CutCopyMode = True 'Vide le presse papier


Merci pour votre aide

CAPRI_456
 
Dernière modification par un modérateur:
G

Guest

Guest
Re : ADO - problème accès "Feuil1" sur fichier fermé

Bonjour Capri_456,

L'idée d'ADO catalog n'est pas de moi mais de l'ami Bruno M45:D (continue Bruno, je récolte)

En ce qui concerne ta question, sur +-200 fichiers, je ne sais pas du tout lequel sera le plus rapide, j'ai un penchant pour dire ADO. Faut voir.

Précise la question: Je cherche donc un fil qui traite de cela
ADO en général ou la méthode pour sommer des champs?

A+
 

CAPRI_456

XLDnaute Occasionnel
Re : ADO - problème accès "Feuil1" sur fichier fermé

Le Forum, HASCO, BRUNO M45, les autres,

BRUNO M45, sorry , autant pour moi:confused:....

Je continue à chercher et à tester la méthode la plus efficace,
disons que je sèche,:rolleyes: mais c'est cela le Forum Excel Downloads

CAPRI_456:)
 

CAPRI_456

XLDnaute Occasionnel
Re : ADO - problème accès "Feuil1" sur fichier fermé

Bonne fin d'après midi le Forum,

Je cherche donc un fil qui traite de cela


Eh bien oui , tant que j'y suis, il va falloir prouver que mon choix est le bon et donc, tant qu'à faire, j'amerais bien pouvoir boucler sur un fichier fermé par la méthode ADO pour pouvoir y réaliser des totaux de valeurs (NOMBRE de données, SOMME,)



CAPRI_456
 
G

Guest

Guest
Re : ADO - problème accès "Feuil1" sur fichier fermé

Bonjour,

Les termes employés sont très ambigüs.

1 - Boucler
Avec ADO tu n'as pas besoin de 'boucler' ce sont les requêtes qui s'en charge.

Exemple: "SELECT SUM(Champ1) FROM [Feuil1$] WHERE Champ2 = 3 AND Champ3 = 'machin bidule' GROUP BY Champ1, Champ2;"

Devrait (si j'ai pas fait d'erreur) Totaliser Champ1 si Champ2 = 3 et Champ3 = 'machin bidule'

SELECT COUNT(Champ1)...... te donneras le nombre.

2 - pour pouvoir y réaliser des totaux de valeurs (NOMBRE de données, SOMME,)

Faire des formules de total dans le classeur férmé n'est pas possible avec ADO. Il te faudrait faire comme pour le point 1 et renvoyé avec une requête UpDate le résultat dans le classeur et au bon endroit.

Dans ces conditions je doute que cela soit plus rapide

A+



A+
 

CAPRI_456

XLDnaute Occasionnel
Re : ADO - problème accès "Feuil1" sur fichier fermé

Bonjour, le Forum, HASCO,

Merci pour la piste destinée à réaliser des totaux par ADO
MAis bien avant cela j'ai un autre souci.... Hi hi :p


-- Je lis en effet dans un fichier fermé "AAAA.xls" d'un répSOURCE
-- les données d'une plage de la feuil1
-- je les copie sans problèmes dans un fichier modèle ouvert "BBBB.xls" (ici
pas par ADO
-- je renomme ce fichier modèle sous le nom AAAA.xls dans rép DESTIN

Parfait :)

-- ensuite, je voudrais supprimer le fichier AAAA.xls du répSOURCE : il ne sert plus à rien. Et Bien là surprise" je ne puis pas y accéder !!! :( :
VBA m'affiche "erreur exécution 1004 impossible d'acceder à AAAA.xls"

Pour vérifier :
durant la procédure vba j'ai tenté de l'ouvrir directement par l'explorateur de fichiers : j'obtiens le même message ( il reste ouvert je suppose, et donc n'est pas accessible ).

Pour vérifier :
dans ADO j'ai bien vérifié que :
'Aprés avoir utilisé une requete, il faut la fermer... :
Requete.Close
'Et de meme pour la connexion :
Source.Close
'Et pour plus de sécurité, c'est à dire pour être sur que la connexion est bien fermée:
Set Source = Nothing
Set Requete = Nothing


Comment puis je libérer entièrement ce classeur pour pouvoir y accéder, donc le "killer" ?

J'ai vu qu'il étaiT possible d'utiliser
'POUR LIBERER LE CLASSEUR
XlApp.RunAutoMacros xlAutoClose
XlApp.Close
XlApp.Quit
Set XlApp = Nothing

Qu'en pensez vous?
Comment Paramétre ce code ?

Merci pour votre avis éclairé
Je pense ici que YANN-56 doit sourrire :rolleyes::):rolleyes::)

CAPRI_456
 
G

Guest

Guest
Re : ADO - problème accès "Feuil1" sur fichier fermé

Re,

Il faudrait voir ta macro complète, il doit y avoir quelque chose qui empêche la fermeture de la connexion au classeur.

Vérifie dans le gestionnaire de tâche(CTLR-ALT-SUPPR) que ton classeur n'est pas ouvert dans une instance cachée d'excel.

Les lignes que tu proposent ne sont utilisablees que sur un classeur ouvert. et XLApp doit être une variable objet Application issue d'un module de classe.

A+
 

CAPRI_456

XLDnaute Occasionnel
Re : ADO - problème accès "Feuil1" sur fichier fermé

Bonjour le Forum, HASCO,

Voici le code

NB: je démarre toute mon action au niveau d'une case à cocher d'un listview1, donc il y a un "With Listview 1" plus haut dans le code

Dim CheminXLS As String
Dim NomFichierDepart As String
Dim CheminCompletDepart, CCD As String

'A1.------ Adresse du fichier à lire (ici un listview)
CheminXLS = .ListItems(.SelectedItem.Index).ListSubItems(6)
NomFichierDepart = UserForm1.ListView1.SelectedItem.Text
'soit le nom du fichier ici : AAAA.xls
CheminCompletDepart = CheminXLS & "\" & NomFichierDepart
CCD = CheminCompletDepart 'soit ici , le répertoire source
'soit ici D:\ AAAA.xls

'A2.------Adresse feuille 'n'oubliez pas d'ajouter $ au nom de la feuille.
'
A2.A. ------Ici rechercher le nom de la feuil1 'proposition BRUNO M45
Dim XlConnect As Object, XlCatalog As Object
Dim Sht
Dim Feuille As String
Dim WsCCD
Set XlConnect = CreateObject("ADODB.Connection")
Set XlCatalog = CreateObject("ADOX.Catalog")
XlConnect.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & CCD & _
";Extended Properties=""Excel 8.0;HDR=No;"";"
' Ouvrir le catalog d'objets
Set XlCatalog.ActiveConnection = XlConnect
For Each Sht In XlCatalog.Tables
' Récupère le nom des feuilles du classeur
Feuille = Sht.Name
Next



'A3.------Adresse de la plage contenant la donnée à récupérer
Dim Plage
Plage = "A2:AV5000"


'A3 ----- 'prépare les commandes ADO
'++ OUVRE UNE CONNECTION ADO VERS le CLASSEUR excel FERME
Set Source = New ADODB.Connection
Source.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & CheminXLS & "\" & NomFichierDepart & _
";Extended Properties=""Excel 8.0;HDR=No;"";"


'++++++++++ exerce la requete ADO sur la donnée à recopier
texte_SQL = "SELECT * FROM [" & Plage & "] " ' prop "CHTI160"
Set Requete = CreateObject("ADODB.Recordset")

Requete.Open texte_SQL, Source, adOpenStatic


'*****'OUVERTUE DU FICHIER "MODELE" **********************
'appelle un fichier modèle contenant d'autres datas dans lequel je vais copier le contenu de ma requête
Dim Workbook
Dim CheminModèle As String
CheminModèle = "D:\BBBB.xls"
'
=répertoire destination
Workbooks.Open CheminModèle
'puis nettoyage du contenu en partant de la dernière ligne complétée
Sheets("Feuil1").Range(Cells(2, 2), Cells(Cells(65536, 2).End(xlUp)(2).Row, 48)).ClearContents
' y copie les datas de la requete
Range("B2").CopyFromRecordset Requete
' veille à fermer les connexions et requête , les vider....
Requete.Close
Source.Close
Set Source = Nothing
Set Requete = Nothing
Set Cd = Nothing

' End With ' pour Listview1

Jusque ici PARFAIT :)
'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
'0 --- lors du cochage === Le fichier modèle est transféré de répertoire source, vers le répertoire destination avec le nom intitial

Dim OldChemin, NewChemin As String
Dim FileName
If Item.Checked = True Then
Dim Ws As Worksheet
With ListView1
Dim fichierouvert
Dim Var_FileName

Dim CheminXLS_ANALYSES As String
CheminXLS_ANALYSES = D\AAAA.xls
If Dir(CheminXLS_ANALYSES, vbDirectory + vbHidden) = "" Then MkDir (CheminXLS_ANALYSES)
'Enregistre le fichier sous son nom de départ mais dans le répertoire destination
ActiveWorkbook.SaveAs FileName:=CheminXLS_ANALYSES & "\" & NomFichierDepart
'ferme le fichier après l'avoir enregistré
ActiveWorkbook.Close SaveChanges = True


'supprime fichier départ dans son rep source
' c'est ici que cela bloque
Kill CheminXLS & "\" & (NomFichierDepart)


A. Quand je n'exécute pas l'instruction kill, tout fonctionne à merveille :)
Lors de l'exécution de Kill : :( VBA m'affiche
"Erreur d'exécution 70, permission refusée

B. Si je n'exécute pas Kill mais que je continue d'autres opérations, par exemple appeler à nouveau ce fichier AAAA.xls dans le rép source pour d'autres opérations ultérieures :( VBA m'affiche
"erreur exécution 1004 impossible d'acceder à AAAA.xls"


C'est donc bien la preuve que l'instance provoquée par ADO n'a pas libéré le fichier AAAA.XLS, je pense
Pour vérifier :
durant la procédure vba j'ai tenté de l'ouvrir directement par l'explorateur de fichiers : j'obtiens le même message ( ce fichier reste donc ouvert je suppose, et donc n'est pas accessible ).


Voilà,



Merci pour votre aide

CAPRI_456
 

Pierrot93

XLDnaute Barbatruc
Re : ADO - problème accès "Feuil1" sur fichier fermé

Bonjour Capri, Hasco:)

il semble que "XlConnect" et "XlCatalog" soient encore ouverts et utilisent le fichier... mais bon, comprends pas tout de ton code, avec 2 connections et des déclarations de variable un peu partout......

bonne journée
@+
 
G

Guest

Guest
Re : ADO - problème accès "Feuil1" sur fichier fermé

Bonjour Capri,
Bonjour Pierrot:)

tout comme Pierrot plus la propriété de la connexion .CursorLocation = 3 (cela évite, sur du local, pas mal d'erreur potentielle)
Une connexion pour le catalogue et pour les requêtes suffit.
Ouvre ta connexion
Ouvre ton catalogue sur la même connexion
Set XlCatalog.ActiveConnection = Source (ou XlConnect)
Interroge tes tables
Ferme le recordset Explicitement: Requete.close
Détruit le Set Requete = nothing
Ferme la connection Source.Close
Détruit là Set Source = Nothing

A+
 
Dernière modification par un modérateur:

CAPRI_456

XLDnaute Occasionnel
Re : ADO - problème accès "Feuil1" sur fichier fermé

Le Forum, HASCO, Pierrot93,


Great ! génial !

En effet, mon XlCOnnect n'a pas été fermé , ni détruit,
C'était là le Bug

Merci Pierrot93 :)

J'ai donc adapté mon Code comme proposé par HASCO, et donc ainsi je n'ouvre plus qu'une seule fois ma connexion.

Set Source = New ADODB.Connection
Source.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & CCD & _
";Extended Properties=""Excel 8.0;HDR=No;"";"


Set XlCatalog.ActiveConnection = Source '(au lieu de XlConnect)
' Récupère le nom des feuilles du classeur
For Each Sht In XlCatalog.Tables
Feuille = Sht.Name
Next

Merci HASCO, le Forum

Bon appétit à tous

CAPRI_456
 

CAPRI_456

XLDnaute Occasionnel
Re : ADO - problème accès "Feuil1" sur fichier fermé

Bonsoir le Forum, Pierrtot93, Hasco,

Suis prudent, j'en met au début , à la fin,
Pas de soucis, d'habitude je dis merci à tous, sauf erreur,
hi hi

Vais continuer maintenant sur les totaux dans mes nombreux fichiers avec ADO.....

Bon week end

CAPRI_456
 

alaaepes

XLDnaute Nouveau
Re : ADO - problème accès "Feuil1" sur fichier fermé

Bonjour le Forum, j'ai un petot soucis aussi concernant la boucle sur les feuilles d'un fichier fermé. Je voudrais savoir s'il n y a vait pas de moyen de le faire sans ADO.. surtout que mon traitement qui suit s'appuie sur la macro "Macro4excel".

Un autre soucis: en testant avac ADO, le nom de feuille qui n'existe pas me resorte :s du type "xlnx....". De plus la méthode range(cellule).copyfromRecordset " ne me donne aucun résultat!!

Merci d'avance pour votre aide!
 

Discussions similaires

Haut Bas