Fermer connexion sur fichier fermé après récupération de données
10 réponses
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
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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 ?
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
Bonjour, As-tu essayé en fermant le "RecordSet" et la connexion? Valeur.Close Set Valeur = Nothing Conn.close set Conn = Nothing MichD
Bonjour,
As-tu essayé en fermant le "RecordSet" et la connexion?
Valeur.Close
Set Valeur = Nothing
Conn.close
set Conn = Nothing
Bonjour, As-tu essayé en fermant le "RecordSet" et la connexion? Valeur.Close Set Valeur = Nothing Conn.close set Conn = Nothing MichD
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
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
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
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
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.
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
| 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
| 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.
| 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
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
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.
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
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
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.
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
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
Merci encore MichD,
cela solutionne effectivement mon problème.
Est-il possible de faire, avec vba, quelque chose du genre :
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
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
On peut faire ceci. Observe l'adresse de la cellule A1 est en référence relative et non absolue.
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