Fermer classeur depuis autre classeur dont le nom se trouve dans cellule
Bonsoir à tous,
Un petit coup de pouce, s'il vous plait. Je cherche une SUB pour résoudre mon problème. Je possède 2 fichiers ouverts DONNEES.xlsm et FACTURE.xlsm.
Dans DONNEES en cellule C19 se trouve le nom du fichier ouvert que je dois fermer exemple = FACTURE.xlsm
Attention ce n'est qu'un exemple car le nom de mes fichiers sont enregistrer sous se format = "FAC - 39 - DIPED LES ALANIERS - S1 - 2023.xlsm"
D'avance merci à tous et bonne nuit
Bonjour Pigneau,
C'est la base du développement VBA qui est orienté objets
Sub OuvreFermeClasseur()
Dim sPath As String, sNomFic As String
Dim Wbk As Workbook ' Ma variable objet
' Chemin d'accès des classeurs
sPath = "C:\Dossier\Sous-Dossier\"
' Nom du fichier
sfic = Sheets("NomFeuille").Range("C19")
' J'ouvre le classeur en définissant ma variable
Set Wbk = Workbooks.Open(sfic)
MsgBox "Le classeur est ouvert"
' que j'utilise pas la suite
Wbk.Close SaveChanges:=True
MsgBox "Le classeur est fermé avec enregistrement"
End SubBonne nuit
Bonjour BrunoM45,
Heureux de te revoir et merci pour ton coup de main.
J'ai fait une petite modification à ta macro car j'avais la possibilité d'aller cherche directement le chemin complet du fichier en C35 du style :
"C:\FACTURE\FACTURES EN COURS\2023\FAC - - 0 - S1 - 2023.xlsm" par rapport à ta macro le fichier DONNEES se trouve en C:\FACTURE et l'autre
dans le chemin en C35, en effet le dossier 2023 évolue chaque ANNEE .
Je ne sais pas si ma modification est bonne :
Sub Ferme_Classeur()
Dim sNomFic As String ',sPath As String
Dim Wbk As Workbook ' Ma variable objet
Dim sfic As String
sfic = Sheets("CHEMIN").Range("C35")
Set Wbk = Workbooks.Open(sfic) 'Récupération du chemin
Wbk.Close SaveChanges:=True 'Le fichier est fermé avec sauvegarde
LancerFormulaireDeplacerFichier 'J'ai tenté les 2 méthodes mais rien faire
'ou
FormulaireDeplaceFichier.Show
End Sub
Sub LancerFormulaireDeplacerFichier()
FormulaireDeplacerFichier.Show
End SubLe fichier se ferme bien mais la macro ne me lance pas le formulaire. . Je sèche.
Re,
Je ne comprends rien de rien à ce que vous voulez faire
Merci de déposer un fichier anonymisé avec des explications correctes SVP
A+
Re,
Je comprends, j'espère que cela pourra le faire.
Le principe, l'utilisateur appuie sur le bouton "Facture Finie".
Le but est de déplacer mon fichier dans un autre répertoire. Voici mes fichiers
D'avance merci
Philippe,
Je ne comprends toujours pas votre logique
Pourquoi ouvrir le classeur pour le déplacer, si c'est bien cela que vous voulez faire ?
A+
ReBonjour Bruno,
Merci pour ta patience. Je vois que tu as beaucoup à faire sur le site, donc .... ces quelques explications
L'ami pour qui j'essaye de faire cette application n'avait plus le courage de déplacer ces fichiers dans le dossier ARCHIVES FACTURES.
En préambule, je te présente l'organisation de mon dossier. Le fichier DONNEES se trouve en C:\FACTURE et il y a également 2 sous dossiers. FACTURE EN COURS et ARCHIVES EN COURS. Lorsque la facture est finie, l'utilisateur clique sur le bouton FACTURE FINIE. La macro effectue quelques tâches dont notamment le déplacement du fichier du dossier FACTURE EN COURS dans le dossier ARCHIVES EN COURS après sa fermeture. Cette fermeture se fait par l'intermédiaire du FormulaireDeplaceFichier du fichier DONNEES --> . Il a un peu évolué, quelques bugs et j'ai essayé d'intégrer ta macro dans le code du formulaire. La fermeture se fait correctement mais il ne déplace pas le fichier. Je ne dois pas avoir intégré ta macro au bon endroit ou il manque quelque chose.
D'avance merci pour ton aide et explications.
Oups je n'ai pas anonymisé le fichier facture... Je viens de le supprimer. Voici l'anonymisé?
Re,
Lorsque la facture est finie, l'utilisateur clique sur le bouton FACTURE FINIE
J'ai enfin trouvé ce fameux bouton, je ne regardais que dans le fichier Données
Je commence donc à un peu mieux comprendre, il faut juste ces 3 lignes pour moi , à tester
Sub Cmd_Valider_Click() 'Dans fichier DONNEES
Dim sPathFic As String, sNomFic As String
Dim Wbk As Workbook ' Ma variable objet
Dim FichierOriginal As String
Dim FichierDeplace As String
Dim CheminFacturesEnCours As String
Dim CheminArchivesFactures As String
Dim Nomdossier As String
Dim Chemin As String
Dim DossierCellule As String
sPathFic = Sheets("CHEMIN").Range("C35")
sNomFic = Mid(sPathFic, InStrRev(sPathFic, "\") + 1)
Workbooks(sNomFic).Close SaveChanges:=TrueNota : en général on définit les variables en début de module
A+
Re, re
Pas de soucis et je comprends que c'est difficile de percevoir le problème quand on n'a pas tout sous la main. J'aurais dû faire le bouton plus gros
Je viens de tester les trois lignes en déclarant toutes les variables au début.
Le fichier se ferme mais il reste toujours dans le dossier FACTURE EN COURS.
Re,
Attention, nous sommes bien d'accord... mes 3 lignes ne sont que pour remplacer ce que j'ai donné préalablement
Il faut la suite de ce qui est existant pour déplacer les fichiers
A+
Tout à fait, voilà ma macro en totalité.
Sub Cmd_Valider_Click() 'Dans fichier DONNEES
Dim sPathFic As String, sNomFic As String
Dim Wbk As Workbook ' Ma variable objet
Dim FichierOriginal As String
Dim FichierDeplace As String
Dim CheminFacturesEnCours As String
Dim CheminArchivesFactures As String
Dim Nomdossier As String
Dim Chemin As String
Dim DossierCellule As String
sPathFic = Sheets("CHEMIN").Range("C35")
sNomFic = Mid(sPathFic, InStrRev(sPathFic, "\") + 1)
Workbooks(sNomFic).Close SaveChanges:=True
DossierCellule = Range("C9").Value 'Chemin du dossier ARCHIVES FACTURES
Nomdossier = TextBox1.Value
Chemin = DossierCellule & Nomdossier & "\"
If Dossier(Chemin) = True Then
CheminFacturesEnCours = Range("C35")
CheminArchivesFactures = Range("C31")
FichierOriginal = CheminFacturesEnCours
FichierDeplace = CheminArchivesFactures
Name FichierOriginal As FichierDeplace
CreateObject("WScript.Shell").Popup ("Je déplace le fichier ..."), 2, "Patience ..." 'Message pour
MsgBox "Votre fichier a été déplacé dans le dossier ARCHIVES FACTURES."
Else
If MsgBox("Le dossier n'existe pas..." & Chr(10) & Chr(10) & "Souhaitez-vous le créer ?", vbYesNo) = vbYes Then
MkDir (Chemin)
CheminFacturesEnCours = Range("C35")
CheminArchivesFactures = Range("C31")
FichierOriginal = CheminFacturesEnCours
FichierDeplace = CheminArchivesFactures
Name FichierOriginal As FichierDeplace
CreateObject("WScript.Shell").Popup ("Je déplace le fichier ..."), 2, "Patience ..." 'Message pour
MsgBox "Votre fichier a été déplacé dans le dossier ARCHIVES FACTURES."
Else
Exit Sub 'Quitte la procédure si Annuler
Exit Sub
End If
End If
Unload Me
End SubRe, BRUNO
J'ai testé la macro en pas à pas. Elle s'arrête au If. J'ai testé avec un sans sous dossier 2023, rien à faire, il ne teste pas l'existence ou l'absence du sous dossier 2023. Avant l'incorporation de la partie macro pour fermer le fichier, la condition se vérifiait.
If Dossier(Chemin) = True Then
CheminFacturesEnCours = Range("C35")
CheminArchivesFactures = Range("C31")
FichierOriginal = CheminFacturesEnCours
FichierDeplace = CheminArchivesFacturesJ'y comprends plus rien mais si toi cela peut t'aider. A moins qu'il y ait une autre solution. Je suis preneur.
A+
Re,
"Dossier(Chemin)" est une fonction dans le classeur, le code ne devrait pas s'arrêter dessus,
sauf si vous avez supprimé la fonction
Nou sommes bien d'accord le mode pas à pas se fait bien dans le classeur "Données.xlsm", dans l'USF "FormulaireDeplacerFichier" ?
Vous avez un message d'erreur ? Quel est-il ?
A+
Re,
J'ai vérifié que la fonction existe. C'est celle-ci est elle fonctionne pour les autres modules
Public Function Dossier(Chemin As String)
If Len(Dir(Chemin, vbDirectory)) > 0 Then
Dossier = True
Else
Dossier = False
End If
End FunctionJe l'ai placé à nouveau en entête du code du FormulaireDeplacerFichier par acquis de conscience. J'ai effectué un test par F8 dans le code du FormulaireDeplacerFichier :
Facture ouverte :
Private Sub UserForm_Initialize()
TextBox1 = Sheets("CHEMIN").Range("C33")
End SubIl commence par Initialize et en survolant Text1 celui ci est vide
Il m'affiche l' Erreur d'exécution '9': L'indice n'appartient pas à la sélection
Facture fermer :
Il m'affiche mon FormulaireDeplacerFichier qui récupère la valeur de TextBox1 en validant il m'affiche le même message d'erreur et s'arrête sur la dernière ligne ci-après
sPathFic = Sheets("CHEMIN").Range("C35")
sNomFic = Mid(sPathFic, InStrRev(sPathFic, "\") + 1)
Workbooks(sNomFic).Close SaveChanges:=TrueJe pense que c'est normal normal puisque la facture n'est pas ouverte et qu'il ne peut pas la fermer.
Je croise les doigts pour que vous trouviez une solution car il ne me reste que cela pour avancer plus dans le projet.
Bon journée.
Re,
Il m'affiche l' Erreur d'exécution '9': L'indice n'appartient pas à la sélection
C'est qu'à ce moment précis vous ne vous trouvez pas sur le bon classeur
C'est bien pour cette raison que l'on devrait toujours mettre l'objet conteneur
Private Sub UserForm_Initialize()
TextBox1 = ThisWorkbook.Sheets("CHEMIN").Range("C33")
End SubMais votre cellule C33 de la feuille "Chemin" du classeur "donnees" est vide,
a quel moment devez vous la remplir ?
en validant il m'affiche le même message d'erreur et s'arrête sur la dernière ligne ci-après
Ensuite oui, c'est logique si le classeur de votre facture est fermée, il faut alors empêcher l'erreur
On Error Resume Next
sPathFic = Sheets("CHEMIN").Range("C35")
sNomFic = Mid(sPathFic, InStrRev(sPathFic, "\") + 1)
Workbooks(sNomFic).Close SaveChanges:=True
On Error Goto 0A+
Re,
Merci pour le bout de code qui m'évite l'erreur.
Pour l'erreur 9 cela se complique pour moi
Je comprends pas trop la notion de "conteneur". Je prendrais un petit moment pour faire des recherches sur le sujet.
Concernant la valeur C33, elle est prise au moment de lancer FormulaireDeplacerFichier
C'est à partir de là qu'il doit vérifier la présence du sous dossier 2023, fermer le fichier et le déplacer.
A+ et bon dimanche
Re,
J'ai fait une nouvelle mouture très allégée de mes fichiers DONNEES et FACTUR. (Y a pas de faute sur FACTUR).
Cette mouture ne me permet plus de vérifier la présence du sous dossier de l'année en cours mais dans l'absolu je peux les créer pour 20 ans. (A défaut de grives, je mange du merle) LOL
Premier constat, j'ai été obligé de modifier le nom de ma feuille FACTURE en FACTUR car il ne me prenait plus la formule pour le "NOM.xlsm" du fichier seul et la formule pour le chemin complet du fichier. A RIEN Y COMPRENDRE.... Grrrr
Ouverture des fichiers et la partie développeur.
J'exécute la macro de FACTUR. Pas de problème.
J'exécute la macro de DONNEES pour déplacer. Là encore pas de problème.
Super, donc je me suis dit depuis le fichier FACTUR je vais lancer la macro de DONNEES par l'intermédiaire d'une autre macro de FACTUR comme suit :
Sub LanceMacroDonnees()
Application.Run "DONNEES.xlsm!Module1.DeplacerFichier"
End Subet bien là le fichier se FERME mais ne SE DÉPLACE PAS.
Je te fais passer le zip si tu peux y jeter un œil. Merci
A+++++
Bonsoir à tous,
Malgré l'aide de BrunoM45, je n'ai pas réussi à trouver une solution, j'ai dû revoir le fonctionnement de mon application. J'ai tout de même appris pas mal de choses au travers des corrections apportées par BrunoM45.
Bon courage à tous.
Bonsoir Pigneau,
Pour moi le problème de base est que nous ne savons absolument pas comment vous pratiquez
Je pense qu'un petit listing des actions effectuées et du ou des problèmes rencontrés aurait pu permettre la mise au point
Bon courage