Fermer connexion sur fichier fermé après récupération de données

Le
Nicolas
Bonsoir à tous,

la fonction suivante me permet de récupérer les valeurs de certai=
nes cellules, d'un fichier qui est fermé.

************************************************************
private function recupererdonneesfichierferme(routefichierf as string, feui=
llef as string, cellulef as string, zonef2 as variant)

dim connexion as adodb.connection
set connexion = new adodb.connection
connexion.open "provider=microsoft.jet.oledb.4.0;" & "data source=" & r=
outefichierf & ";" & "extended properties=""excel 8.0;" & "hdr=no;imex=
=1;"""

dim commande as adodb.command
set commande = new adodb.command
commande.activeconnection = connexion
commande.commandtext = "select * from `" & feuillef & "$" & cellulef & "`=
"

dim valeur as adodb.recordset
set valeur = new adodb.recordset
valeur.open commande, , adopenkeyset, adlockoptimistic

dim ligne as integer, colonne as integer

dim lignes as long: lignes = valeur.recordcount
dim colonnes as long: colonnes = valeur.fields.count

dim zonef
redim zonef(1 to lignes, 1 to colonnes)

valeur.movefirst

for ligne = 1 to lignes
for colonne = 0 to colonnes - 1
zonef(ligne, colonne + 1) = valeur.fields(colonne).value
next
valeur.movenext
next

connexion.close

set valeur = nothing
set commande = nothing
set connexion = nothing

zonef2 = zonef

End Function
************************************************************

Ma question ne réside pas exactement sur la récupération des=
données, qui fonctionne bien, mais sur la connexion, qui semble ne pa=
s se fermer.

Exemple de mon problème :

Depuis, le fichierA.xls, je lance ma routine et récupère sans pro=
blème des infos du fichierB.xls, qui est fermé.

Mais lorsque ma routine se poursuit et tente de supprimer le dossier o=
se trouve le fichierB.xls, ça ne fonctionne pas.

Même manuellement, je n'arrive pas à supprimer le dossier où=
se trouve mon fichierB.xls, à moins de fermer préalablement le f=
ichierA.xls

¿ De quelle façon puis-je fermer la connexion afin de pouvoir sup=
primer le dossier où se trouve mon fichierB.xls ?

Merci d'avance pour votre aide et à bientôt

Nicolas
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
isabelle
Le #26475058
bonjour,
remplacer:
connexion.close
par:
valeur.close
isabelle
Le 2018-05-16 à 17:44, Nicolas a écrit :
Bonsoir à tous,
la fonction suivante me permet de récupérer les valeurs de certaines cellules, d'un fichier qui est fermé.
************************************************************
private function recupererdonneesfichierferme(routefichierf as string, feuillef as string, cellulef as string, zonef2 as variant)
dim connexion as adodb.connection
set connexion = new adodb.connection
connexion.open "provider=microsoft.jet.oledb.4.0;" & "data source=" & routefichierf & ";" & "extended properties=""excel 8.0;" & "hdr=no;imex=1;"""
dim commande as adodb.command
set commande = new adodb.command
commande.activeconnection = connexion
commande.commandtext = "select * from `" & feuillef & "$" & cellulef & "`"
dim valeur as adodb.recordset
set valeur = new adodb.recordset
valeur.open commande, , adopenkeyset, adlockoptimistic
dim ligne as integer, colonne as integer
dim lignes as long: lignes = valeur.recordcount
dim colonnes as long: colonnes = valeur.fields.count
dim zonef
redim zonef(1 to lignes, 1 to colonnes)
valeur.movefirst
for ligne = 1 to lignes
for colonne = 0 to colonnes - 1
zonef(ligne, colonne + 1) = valeur.fields(colonne).value
next
valeur.movenext
next
connexion.close
set valeur = nothing
set commande = nothing
set connexion = nothing
zonef2 = zonef
End Function
************************************************************
Ma question ne réside pas exactement sur la récupération des données, qui fonctionne bien, mais sur la connexion, qui semble ne pas se fermer.
Exemple de mon problème :
Depuis, le fichierA.xls, je lance ma routine et récupère sans problème des infos du fichierB.xls, qui est fermé.
Mais lorsque ma routine se poursuit et tente de supprimer le dossier où se trouve le fichierB.xls, ça ne fonctionne pas.
Même manuellement, je n'arrive pas à supprimer le dossier où se trouve mon fichierB.xls, à moins de fermer préalablement le fichierA.xls
¿ De quelle façon puis-je fermer la connexion afin de pouvoir supprimer le dossier où se trouve mon fichierB.xls ?
Merci d'avance pour votre aide et à bientôt
Nicolas
Michd
Le #26475062
Bonjour,
As-tu essayé en fermant le "RecordSet" et la connexion?
Valeur.Close
Set Valeur = Nothing
Conn.close
set Conn = Nothing
MichD
Michd
Le #26475113
Dans le haut d'un module standard, déclaration des API
Declare Function OpenClipboard Lib "user32" _
(ByVal hwnd As Long) As Long
Declare Function EmptyClipboard Lib "user32" () As Long
Declare Function CloseClipboard Lib "user32" () As Long
'---------------------------------------
Sub Vider_Presse_Papier()
OpenClipboard 0
EmptyClipboard
CloseClipboard
End Sub
'---------------------------------------
Et à la fin de ta procédure :
Valeur.Close
Set Valeur = Nothing
Conn.close
set Conn = Nothing
Call Vider_Presse_Papier
MichD
Nicolas
Le #26475120
Encore merci pour ton temps,
mais le problème persiste toujours.
j'apporte une précision sur mon cas.
Les fichiers "fichierA.xls" et "fichierB.xls" sont en lecture seule.
J'ai essayé en changeant la propriété du "fichierB.xls" avan t la connexion mais sans résultat.
Actuellement, mon code se termine ainsi ...
'*****
Set Commande = Nothing
Valeur.Close
Set Valeur= Nothing
Connexion.Close
Set Connexion = Nothing
Application.Run "FichierA.xls!Presse_Papier.Vider_Presse_Papier"
'*****
A bientôt,
Nicolas
Michd
Le #26475129
| Mais lorsque ma routine se poursuit et tente de supprimer le dossier où se trouve le fichierB.xls,
ça ne fonctionne pas.
Pourrais-tu donner plus de détails sur ce que tu veux supprimer? Est-ce que tu essaies de supprimer
le RÉPERTOIRE dont un de ses fichiers est encore ouvert? Si oui, il n'y a pas d'autres solutions de
fermer tous les fichiers appartenant à ce répertoire avant d'exécuter la suppression de ce dernier.
MichD
Michd
Le #26475134
En passant si ce que tu veux supprimer c'est un fichier, ajoute cette ligne de code à la toute fin
de la procédure :
Kil "C:CheminNomDufichier.xls"
Attention, cette commande n'envoie pas le fichier dans la poubelle, mais le supprime définitivement.
MichD
Michd
Le #26475148
Je n'ai pas le temps d'effectuer des tests,
si tu établis une connexion Ado pour connaitre le contenu d'une seule cellule,
choisis n'importe quelle cellule du classeur et copies cette formule en adaptant le chemin, nom du
fichier et l'adresse de ladite cellule dans la formule suivante :
Range("A3") = "='[Classeur1].xlsm]Feuil1'!$A$1"
Selon le résultat qu'affiche A3, tu exécutes le code désiré et tu supprimes le contenu de la cellule
A3.
MichD
Nicolas
Le #26475158
Merci encore MichD,
cela solutionne effectivement mon problème.
Est-il possible de faire, avec vba, quelque chose du genre :
Range("A1").resize(1,3).formulaR1C1 = "='[Classeur1.xlsm]Feuil1'!$A$1:$ C$1"
ou
Range("A1").resize(10,2).formulaR1C1 = "='[Classeur1.xlsm]Feuil1'!R1C1: R10C2"
sans avoir à passer par une boucle.
Nicolas
Michd
Le #26475165
On peut faire ceci. Observe l'adresse de la cellule A1 est en référence relative et non absolue.
Range("A5").Resize(3) = "='F:Documents[Classeur1.xlsm]Feuil1'!A1"
MichD
Nicolas
Le #26475169
C'est parfait !!
Merci beaucoup
A bientôt
Nicolas
Publicité
Poster une réponse
Anonyme