Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

10 réponses
Avatar
Nicolas
Bonsoir =C3=A0 tous,

la fonction suivante me permet de r=C3=A9cup=C3=A9rer les valeurs de certai=
nes cellules, d'un fichier qui est ferm=C3=A9.

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

dim connexion as adodb.connection
set connexion =3D new adodb.connection
connexion.open "provider=3Dmicrosoft.jet.oledb.4.0;" & "data source=3D" & r=
outefichierf & ";" & "extended properties=3D""excel 8.0;" & "hdr=3Dno;imex=
=3D1;"""
=20
dim commande as adodb.command
set commande =3D new adodb.command
commande.activeconnection =3D connexion
commande.commandtext =3D "select * from `" & feuillef & "$" & cellulef & "`=
"
=20
dim valeur as adodb.recordset
set valeur =3D new adodb.recordset
valeur.open commande, , adopenkeyset, adlockoptimistic
=20
dim ligne as integer, colonne as integer
=20
dim lignes as long: lignes =3D valeur.recordcount
dim colonnes as long: colonnes =3D valeur.fields.count

dim zonef
redim zonef(1 to lignes, 1 to colonnes)
=20
valeur.movefirst

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

connexion.close

set valeur =3D nothing
set commande =3D nothing
set connexion =3D nothing

zonef2 =3D zonef
=20
End Function
************************************************************

Ma question ne r=C3=A9side pas exactement sur la r=C3=A9cup=C3=A9ration des=
donn=C3=A9es, qui fonctionne bien, mais sur la connexion, qui semble ne pa=
s se fermer.

Exemple de mon probl=C3=A8me :

Depuis, le fichierA.xls, je lance ma routine et r=C3=A9cup=C3=A8re sans pro=
bl=C3=A8me des infos du fichierB.xls, qui est ferm=C3=A9.

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

M=C3=AAme manuellement, je n'arrive pas =C3=A0 supprimer le dossier o=C3=B9=
se trouve mon fichierB.xls, =C3=A0 moins de fermer pr=C3=A9alablement le f=
ichierA.xls

=C2=BF De quelle fa=C3=A7on puis-je fermer la connexion afin de pouvoir sup=
primer le dossier o=C3=B9 se trouve mon fichierB.xls ?

Merci d'avance pour votre aide et =C3=A0 bient=C3=B4t

Nicolas

10 réponses

Avatar
isabelle
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
Avatar
Michd
Bonjour,
As-tu essayé en fermant le "RecordSet" et la connexion?
Valeur.Close
Set Valeur = Nothing
Conn.close
set Conn = Nothing
MichD
Avatar
Michd
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
Avatar
Nicolas
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
Avatar
Michd
| 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
Avatar
Michd
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
Avatar
Michd
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
Avatar
Nicolas
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
Avatar
Michd
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
Avatar
Nicolas
C'est parfait !!
Merci beaucoup
A bientôt
Nicolas