Macro pour reprendre le focus sur son classeur et le fermer
Bonjour à toutes et tous,
Je voudrais utiliser cette macro pour fermer le fichier en cours et lancer la macro d'un autre fichier afin de le déplacer. Je ne sais pas par quoi je dois remplacer 'ThisWorkbook.name ou autre pour me repositionner sur mon classeur.
Sub LanceMacroDeplaceFichier()
'ThisWorkbook.Name
ActiveWorkbook.Close savechanges:=False
Application.Run "DONNEES.xlsm!Module1.DeplaceFichier"
End SubJe précise que je lance différentes macros pour ajouter des données et autres dans d'autres classeurs donc je perds le focus sur mon classeur. Je ne peux pas mettre en dur le nom du fichier car il varie à chaque utilisation. ex: FAC-40-DUPONTJEAN-S2-2023.xlsm ou FAC-70-DURANTRENE-S4-2023.xlsm, etc...
D'avance merci pour votre aide.
Bonjour
même sujet qu'ici --> ici ?? Si oui pourquoi ouvrir un nouveau fil de discussion ?
Je ne sais pas par quoi je dois remplacer 'ThisWorkbook.name ou autre pour me repositionner sur mon classeur.
Pas sûr d'avoir compris ce que vous voulez faire ....
Pourquoi ne faites vous pas comme ceci
Sub LanceMacroDeplaceFichier()
Application.Run "DONNEES.xlsm!Module1.DeplaceFichier"
ThisWorkbook.Close savechanges:=False
End SubCordialement
Bonsoir Dan,
Je m'excuse d'avoir agit ainsi mais je ne savais pas comment remonter mon sujet car visiblement il n'intéressait personne. Si le premier sujet est gênant je suppose qu'en tant que modérateur vous avez peut être la possibilité de le supprime. Je m'excuse auprès de vous et de la communauté.
Concernant votre proposition, j'ai bien essayé de le reproduire mais votre macro est dans le fichier qui doit être déplacé, donc impossible de le déplacer si pas fermé.
A ce jour, nous utilisons un bouton placé sur le classeur DONNEES pour lancer les différentes macros comme ci-après. Je peux m'affranchir de la première en fermant moi même le fichier.
Sub FermeFactureEnCours()
On Error Resume Next
Set AppExcel = GetObject(, "Excel.Application")
If Err.Number <> 0 Then
Set AppExcel = CreateObject("Excel.Application")
End If
Err.Clear
On Error GoTo 0
Dim w As Workbook
Dim Fichier As String
Fichier = Range("C34").Value
For Each w In AppExcel.Workbooks
If w.Name = (Fichier) Then
w.Save
w.Close
End If
Next
Call TesteSiDossierExiste
End Sub
Sub TesteSiDossierExiste() 'Teste si le dossier année existe dans le dossier ARCHIVES FACTURE
Dim Chemin As String
Dim DossierCellule As String 'Dossier a créer ou pas
Dim NomDossier As String 'Répertoire où doit être créer le dossier
Dim Output As Integer 'pour le dernière MsgBox
Dim Année
Année = Year(Now())
DossierCellule = "C:\FACTURE\ARCHIVES FACTURES\"
NomDossier = Année
Chemin = DossierCellule & NomDossier & "\"
If Dossier(Chemin) = True Then
'MsgBox "CLIQUEZ sur le bouton [OK] pour ARCHIVER LA FACTURE !!!"
Else
If MsgBox(" Le dossier pour sauvegarder les FACTURES EN COURS n'existe pas..." & Chr(10) & Chr(10) & " Souhaitez-vous le créer ?", 4 + 64, "Création du dossier...") = vbYes Then
MkDir (Chemin)
Output = MsgBox(" Votre dossier a été créé, CLIQUEZ sur le bouton [OK) pour archiver la facture !!!", 0 + 64, "Aux Cochons d'Ausson ...")
Else
Exit Sub
End If
End If
Call DeplacerFichier
End Sub
Sub DeplacerFichier() 'Fichier DONNEES
Set fso = CreateObject("Scripting.FileSystemObject")
SourcePath = ThisWorkbook.Worksheets("CHEMIN").Range("C35").Value
destinationPath = ThisWorkbook.Worksheets("CHEMIN").Range("C31").Value
fso.MoveFile SourcePath, destinationPath
End SubIl y a certainement mieux mais je n'ai que cela pour le moment. Je voulais simplement automatiser la tâche mais c'est pas évident.
Encore toutes mes excuses.
Cordialement
Bonjour
Je m'excuse d'avoir agit ainsi mais je ne savais pas comment remonter mon sujet car visiblement il n'intéressait personne. Si le premier sujet est gênant je suppose qu'en tant que modérateur vous avez peut être la possibilité de le supprime. Je m'excuse auprès de vous et de la communauté.
Ce n'était pas compliqué, il vous suffisait de refaire un post comme vous l'avez fait à 15h22 dans le fil en question
Je suis d'ailleurs allé relire votre fil et ce que vous vouliez faire. En fait votre souci est uniquement du au nom de votre fichier qui n'est pas correct.
Est-ce que je vous donne la solution sur le fil précédent ?
Pour votre demande ici :
A ce jour, nous utilisons un bouton placé sur le classeur DONNEES pour lancer les différentes macros comme ci-après. Je peux m'affranchir de la première en fermant moi même le fichier.
Quand je regarde votre fil précédent le bouton est placé dans le fichier facture et pas le fichier données. Quid ?
Bonjour,
Effectivement, j'aurais dû poursuivre dans le même post. Désolé.
Les macros sont lancées depuis le classeur DONNEES par l'intermédiaire du bouton comme ci-dessous étant que je n'arrive pas à fermer mon fichier FAC-40.....
Je suis intéressé par votre solution bien évidemment et vous pouvez me répondre dans ce fil.
Cordialement.
Edit Modo :
Les deux fichiers posté dans votre premier fil
edit : fichier supprimé pour données confidentielles
Encore moi
J'ai changé légèrement mes macros comme suit ...
Sub FermeFactureEnCours()
'Cette macro permet de fermer un fichier Excel et de le sauvegarder
On Error Resume Next 'Ignorer les erreurs
Dim AppExcel As Object 'objet qui va être créé
Dim w As Workbook 'variable pour la feuille de travail
Dim Fichier As String 'variable pour le nom du fichier
Set AppExcel = GetObject(, "Excel.Application") 'Récupérer l'objet Excel
If Err.Number <> 0 Then 'Si l'objet n'existe pas
Set AppExcel = CreateObject("Excel.Application") 'Créer l'objet Excel
End If
Err.Clear 'Effacer les erreurs
On Error GoTo 0 'Ne pas ignorer les erreurs
Fichier = Range("C34").Value 'Récupérer le nom du fichier à partir de la cellule
For Each w In AppExcel.Workbooks 'Pour chaque feuille de travail
If w.Name = (Fichier) Then 'Si le nom de la feuille de travail est le même que celui du fichier
w.Save 'Sauvegarder la feuille de travail
w.Close 'Fermer la feuille de travail
End If
Next
Call TesteSiDossierExiste 'Appeler la macro TesteSiDossierExiste
End Sub
Sub TesteSiDossierExiste()
'Cette macro permet de tester si un dossier existe et de le créer s'il n'existe pas
Dim Chemin As String 'Chemin du dossier
Dim DossierCellule As String 'Chemin parent du dossier
Dim NomDossier As String 'Nom du dossier
Dim Output As Integer 'Variable pour le message de fin
Dim Année As Integer 'Variable pour l'année en cours
Année = Year(Now()) 'Récupérer l'année en cours
DossierCellule = "C:\FACTURE\ARCHIVES FACTURES\" 'Chemin du dossier parent
NomDossier = Année 'Nom du dossier
Chemin = DossierCellule & NomDossier & "\" 'Combiner le chemin du dossier parent et le nom du dossier
If Dossier(Chemin) = True Then 'Si le dossier existe
'MsgBox "CLIQUEZ sur le bouton [OK] pour ARCHIVER LA FACTURE !!!"
Else 'Si le dossier n'existe pas
If MsgBox(" Le dossier pour sauvegarder les FACTURES EN COURS n'existe pas..." & Chr(10) & Chr(10) & " Souhaitez-vous le créer ?", 4 + 64, "Création du dossier...") = vbYes Then 'Demander si le dossier doit être créé
MkDir (Chemin) 'Créer le dossier
Output = MsgBox(" Votre dossier a été créé, CLIQUEZ sur le bouton [OK) pour archiver la facture !!!", 0 + 64, "Aux Cochons d'Ausson ...") 'Message de fin
Else
Exit Sub 'Quitter la macro
End If
End If
Call DeplacerFichier 'Appeler la macro DeplacerFichier
End Sub
Sub DeplacerFichier() 'Fichier DONNEES
'Cette macro permet de déplacer un fichier de sa source à sa destination
Dim fso As Object 'Variable pour le système de fichiers
Dim SourcePath As String 'Chemin de la source
Dim DestinationPath As String 'Chemin de destination
Set fso = CreateObject("Scripting.FileSystemObject") 'Création de l'objet pour le système de fichiers
SourcePath = ThisWorkbook.Worksheets("CHEMIN").Range("C35").Value 'Définir la source du fichier
DestinationPath = ThisWorkbook.Worksheets("CHEMIN").Range("C31").Value 'Définir la destination du fichier
fso.MoveFile SourcePath, DestinationPath 'Déplacer le fichier de sa source à sa destination
End SubCordialement
J'ai replacé vos deux fichiers du fil précédent ici. A voir si cela sert
Les macros sont lancées depuis le classeur DONNEES par l'intermédiaire du bouton comme ci-dessous étant que je n'arrive pas à fermer mon fichier FAC-40.....
Ce que vous écrivez c'est différent là .... Le bouton se trouvait dans le fichier Facture et non dans le fichier données? (c'est ce que je vois dans votre fichier facture)
Si oui, en fait votre code Sub Close_File() dans le fichier donnees fonctionne très bien. Le souci est que le nom de votre fichier mentionné en cellule C34, n'est pas identique au nom du fichier à fermer. Raison du bug
Dans le fichier données remplacez le code Sub Close_File() par celui-ci
Option Compare Text
Sub Close_File()
Dim File_Path ' As String
File_Path = ThisWorkbook.Sheets(1).Range("C34").Value
On Error Resume Next
Workbooks(File_Path).Close SaveChanges = False
If Err.Number > 0 Then MsgBox "le fichier ne semble pas être ouvert ou de nom incorrect !", vbCritical: Exit Sub
MsgBox "Votre fichier a été fermé !!!", 64
End SubFaites un test et dites moi
Edit : oulàlà votre code posté là. Vous compliquez je pense. Puis pourquoi écrivez-vous cela puisque vous êtes dans excel ?
Set AppExcel = GetObject(, "Excel.Application")Dans quel fichier se trouve Range("C34") et cette macro -->
Sub FermeFactureEnCours()Je sais que je me complique la vie au regard du coup de main sur le userform où je voulais en faire une trentaine alors qu'il vous a fallu que quelques lignes, mais hélas pour moi je n'ai pas toutes les connaissances pour affronter EXCEL. Je vous fais passer les fichiers anonymiser pour plus de clarté et c'est certiainement une usine à gaz car j'avoue que je m'y perds dans tous ces codes.
Le projet fonctionne ainsi, je pars d'un CLASSEUR nommé FACTURE (sorte de modéle) où se trouve différents feuillets dont certains sont masqués.
Donc sur la facture qui a été générée avec un nouveau nom qui correspond au numéro de facture, lorsque nous cliquons sur le bouton Facture finie, il enclenche le lancement de plusieurs macros notamment:
FACTURE_FINIE
PDF_FACTURE
COPIERPLAGE qui copie une plage de cellules dans un autre fichier, cette même macro lance la macro
SUIVI_DES_FACTURES
et c'est à la fin de celle-ci que j'aurais voulu fermer cette facture et lancer les macros qui se trouve dans le classeur DONNEES que je joints également. (Je me trompe certainement de voie)
Dans ce dernier se trouve l'ensemble des macros qui me permettent de déplacer le fichier à l'endroit voulu. Je sais pertinemment que mon écriture, ma gestion du projet, etc... n'est pas top mais je ne peux pas faire mieux. J'essaye chaque jour de l'améliorer mais ce n'est pas facile.
J'ai testé votre bout de code dans les fichiers que vous avez remis dans le fil et cela fonctionne parfaitement.
J'ai transposé le tout dans les fichiers que je joints et il m'affiche une "erreur de compilation" "Variable non définie" sur le mot "SaveChanges" (6ème ligne)
Joli fichier !
Je viens de regarder. Il y a des choses à simplifier ou modifier. On va commencer par le fichier données :
Dans le module 1 ,
1 . vous avez un code Private Sub UserForm_Initialize(). A quoi sert ce code ?
2. le code Sub FermeFactureEnCours(), vous avez placé un boucle For Each w In AppExcel.Workbooks 'Pour chaque feuille de travail. Pouvez-vous expliquer l'idée ?
Merci.
1 / Je ne l'avais pas vu, il ne sert à plus rien. Cela m'a servi au tout début.
Par contre en C9, il y avait inscrit le chemin C:\FACTURE\ARCHIVES FACTURES\ lieu où sont déplacées les factures finies. En C33 il y a l'année en cours pour le sous dossier.
2/ le code n'est pas de moi. Il me semble que cela est inutile étant donné qu'il n'y a qu'un fichier à fermer.
Je sens que cela va être compliqué.
Ne me reposter pas chaque fois votre fichier sinon on ne va pas s'y retrouver. J'ai votre fichier dont je me sers pour les modifications.
1 / Je ne l'avais pas vu, il ne sert à plus rien. Cela m'a servi au tout début.
Ok donc supprimez le.
1a. Par contre en C9, il y avait inscrit le chemin C:\FACTURE\ARCHIVES FACTURES\ lieu où sont déplacées les factures finies.
C9 ? je ne vois rien là
Pour le chemin, votre arborescence est donc chaque fois comme ceci ?
C:\FACTURE\ARCHIVES FACTURES\2022
C:\FACTURE\ARCHIVES FACTURES\2023
1b. En C33 il y a l'année en cours pour le sous dossier.
cela vient de A49 dans votre facture cette année. Là vous auriez peut être pu utiliser l'info en G9. A voir plus tard peut-être
2/ le code n'est pas de moi. Il me semble que cela est inutile étant donné qu'il n'y a qu'un fichier à fermer.
Ok on va voir ce que l'on peut arranger. Je ne comprends pas bien ce que vous voulez faire
Dans le code Close_file, vous fermez le fichier facture sans le sauver puis vous appelez la macro FermeFactureEnCours ?
3.
J'ai transposé le tout dans les fichiers que je joints et il m'affiche une "erreur de compilation" "Variable non définie" sur le mot "SaveChanges" (6ème ligne)
la ligne devrait être comme ceci --> Workbooks(File_Path).Close SaveChanges:=False. Il vous manque les : avant le signe =
Dites moi quand c'est ok sur les points ci-avant
OK, donc je travaille sur l'original le dernier que je vous ai envoyé.
Modification faites, le fichier se ferme mais il n'est pas encore déplacé. Par contre il ne m'affiche pas le message comme quoi le fichier a été fermé.
Il y a un bug dans votre dernier fichier. Je l'ai supprimé.
Donc vous pouvez me renvoyer celui que vous utilisez
1. Dans le code Sub TesteSiDossierExiste()
Si le dossier existe, vous sortez du code sans rien faire
Si le dossier n'existe pas, vous créez le répertoire
Juste ?
2. Vous appelez le code au point 1 depuis le bouton sur la feuille Chemin, pourquoi alors faites-vous un Call TesteSiDossierExiste dans le code Close_file.
EDIT : Ok c'est utilisé pour le bouton depuis le fichier facture
1 = Correct, à la première facture le code créer le sous dossier "2023", etc...
2 = Le fichier facture que vous avez, a été par le fichier FACTURE qui me permet de créer toutes mes factures (Les 2 sont identiques sauf la facture numérotée qui contiendra en plus les données saisies. Je pense que je suis obligé de faire ainsi par rapport à la première facture de l'année qui crée le sous dossier ANNEE.
Lors de la création de ma facture je me suis aperçu que l'année ne se mettait plus en ligne C33 dans le fichier DONNEES, j'ai rectifié le tire et j'ai testé par le bouton ARCHIVER LA DERNIERE FACTURE en lançant directement la macro DeplacerFichier et cela fonctionne. Donc, dans le code Close_File j'ai appelé la macro DeplacerFichier et cela ne fait rien. J'y comprends plus rien
1 = Correct, à la première facture le code créer le sous dossier "2023", etc.
Faites un test avec ce code-ci
Sub TesteSiDossierExiste()
'Cette macro permet de tester si un dossier existe et de le créer s'il n'existe pas
Dim Chemin As String 'Chemin du dossier
Dim DossierCellule As String 'Chemin parent du dossier
Dim NomDossier As String 'Nom du dossier
DossierCellule = "C:\FACTURE\ARCHIVES FACTURES\" 'Chemin du dossier parent
NomDossier = Year(Now()) 'Année 'Nom du dossier
Chemin = DossierCellule & NomDossier & "\" 'Combiner le chemin du dossier parent et le nom du dossier
If Dossier(Chemin) = False Then 'Si le dossier n'existe pas
If MsgBox(" Le dossier pour sauvegarder les FACTURES EN COURS n'existe pas..." & Chr(10) & Chr(10) & " Souhaitez-vous le créer ?", 4 + 64, "Création du dossier...") = vbYes Then 'Demander si le dossier doit être créé
MkDir (Chemin) 'Créer le dossier
MsgBox " Votre dossier a été créé, CLIQUEZ sur le bouton [OK) pour archiver la facture !!!", 0 + 64, "Aux Cochons d'Ausson ..." 'Message de fin
Else: Exit Sub
End If
End If
Call DeplacerFichier 'Appeler la macro DeplacerFichier
End Sub2 = Le fichier facture que vous avez...
En voyant votre fichier Facture, je me demande pourquoi vous n'avez pas fait un seul fichier. C'eut été nettement plus simple
3. Dans votre fichier donnees, macro dans thisworkbook, pensez à ajouter un On Error resume next juste avant Application.width..... Cela évite un bug si l'écran du PC ne permet pas d'afficher aux dimensions que vous demandez
Non rien à faire ... Il veut rien entendre
Mais en cliquant sur mon bouton programmer sur DeplacerFichier, le fichier est déplacé.
Non rien à faire ... Il veut rien entendre
Vous parlez de quoi là ? si c'est du code placé dans mon point 1, que voulez-vous dire ?
Répondez point par point sans quoi on ne va pas en sortir