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 Sub

Bonne 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 Sub

Le 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

16donnees.xlsm (52.75 Ko)
16fac-0-s1-2023.xlsm (175.73 Ko)

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.

13donnees.xlsm (52.96 Ko)

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:=True

Nota : 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 Sub

Re, 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 = CheminArchivesFactures

J'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 Function

Je 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 Sub

Il 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:=True

Je 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 Sub

Mais 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 0

A+

Re,

Merci pour le bout de code qui m'évite l'erreur.

Pour l'erreur 9 cela se complique pour moi , comment faire référence au bon classeur étant donné que le nom du classeur ne sera pas le même ?

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

capture d ecran 2023 01 08 094557

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 Sub

et 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

13atest.zip (36.46 Ko)

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

Rechercher des sujets similaires à "fermer classeur nom trouve"