Bouton VBA outlook pour ouvrir fichier
danielc0 Messages postés 1270 Date d'inscription mardi 5 juin 2018 Statut Membre Dernière intervention 20 novembre 2024 - 23 oct. 2024 à 09:57
- Bouton VBA outlook pour ouvrir fichier
- Comment ouvrir un fichier epub ? - Guide
- Ouvrir fichier .bin - Guide
- Fichier rar - Guide
- Comment ouvrir un fichier docx ? - Guide
- Ouvrir un fichier .dat - Guide
15 réponses
21 oct. 2024 à 11:00
Sub Merge() Dim sourceWorkbookNAS As Workbook Dim sourceWorkbookAcronis As Workbook Dim sourceWorkbookBootCatalog As Workbook Dim sourceWorkbookPRTG As Workbook Dim destinationWorkbook As Workbook Dim sourceSheet As Worksheet Dim destinationSheet As Worksheet Dim sourceFilePathNAS As String Dim sourceFilePathAcronis As String Dim sourceFilePathBootCatalog As String Dim sourceFilePathPRTG As String Dim destinationFilePath As String Dim configFilePath As String Dim sourceIndex As Integer Dim destinationIndex As Integer Dim lastRow As Long Dim currentDate As Date Dim formatdate As String Dim ws As Worksheet ' Chemins des fichiers source et destination formatdate = Format(Date, "dd_MM_yyyy") sourceFilePathNAS = Environ("USERPROFILE") & "\Documents\mail\" & formatdate & "_checkup_NAS.xlsx" sourceFilePathAcronis = Environ("USERPROFILE") & "\Documents\mail\" & formatdate & "_checkup_Acronis.xlsx" sourceFilePathBootCatalog = Environ("USERPROFILE") & "\Documents\mail\" & formatdate & "_checkup_BootCatalog.xlsx" sourceFilePathPRTG = Environ("USERPROFILE") & "\Documents\mail\" & formatdate & "_checkup_PRTG.xlsx" destinationFilePath = Environ("USERPROFILE") & "\Documents\mail\" & formatdate & "_consolidated_report.xlsx" configFilePath = Environ("USERPROFILE") & "\Documents\mail\config.xlsx" ' Fichier Config pour gérer les noms des appareils ' Ouvrir les fichiers source et destination Set sourceWorkbookNAS = Workbooks.Open(sourceFilePathNAS) Set sourceWorkbookAcronis = Workbooks.Open(sourceFilePathAcronis) Set sourceWorkbookBootCatalog = Workbooks.Open(sourceFilePathBootCatalog) Set sourceWorkbookPRTG = Workbooks.Open(sourceFilePathPRTG) Set destinationWorkbook = Workbooks.Open(destinationFilePath) ' Initialiser les indices pour les feuilles sourceIndex = 1 destinationIndex = destinationWorkbook.Sheets.Count ' Commencer à la dernière feuille du destinationWorkbook ' ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ' ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ' ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ' Transférer les données NAS dynamiquement Do While sourceIndex <= sourceWorkbookNAS.Sheets.Count And destinationIndex >= 1 Set sourceSheet = sourceWorkbookNAS.Sheets(sourceIndex) Set destinationSheet = destinationWorkbook.Sheets(destinationIndex) ' Trouver la dernière ligne avec des données dans la feuille source lastRow = sourceSheet.Cells(sourceSheet.Rows.Count, "A").End(xlUp).row ' Renommer la feuille de destination RenameSheet destinationSheet, sourceSheet.Range("A1").Value ' Utilisation de A1 pour la date du NAS ' Transférer les données dynamiques If lastRow >= 3 Then With sourceSheet ' Fusionner A6 et B6, et les définir égal à A1 du fichier source (date) With destinationSheet.Range("A6:B6") .Merge ' Fusionner les cellules A6 et B6 .Value = sourceSheet.Range("A2").Value ' Prendre la valeur de A2 du fichier source .Font.Size = 18 ' Taille de police 18 .Font.Bold = True ' Mettre en gras .Font.Color = RGB(255, 255, 255) ' Couleur du texte en blanc .Interior.Color = RGB(24, 50, 63) ' Fond égal à #18323F (converti en RGB) .HorizontalAlignment = xlCenter ' Centrer le texte horizontalement .VerticalAlignment = xlCenter ' Centrer le texte verticalement End With ' Mettre en place les en-têtes "Description" et "Statut" destinationSheet.Range("A7").Value = "Description" destinationSheet.Range("B7").Value = "Statut" ' Boucle dynamique pour transférer les données des NAS Dim i As Long For i = 3 To lastRow destinationSheet.Cells(5 + i, 1).Value = .Cells(i, 1).Value ' Colonne A (Nom NAS) destinationSheet.Cells(5 + i, 2).Value = .Cells(i, 2).Value ' Colonne B (Statut NAS) Next i End With ' Appliquer la couleur bleu clair aux cellules A8 jusqu'à la dernière ligne With destinationSheet.Range("A7:B" & (5 + lastRow)) .Interior.Color = RGB(173, 216, 230) ' Bleu clair End With ' Appliquer des bordures sur la plage A6:B(lastRow) With destinationSheet.Range("A6:B" & (5 + lastRow)).Borders .LineStyle = xlContinuous ' Style de ligne continu .Weight = xlThin ' Épaisseur de la bordure (fine) .ColorIndex = 0 ' Couleur noire par défaut End With ' Appliquer la mise en forme conditionnelle pour le statut des NAS si nécessaire ApplyConditionalFormattingNAS destinationSheet, lastRow End If ' Passer à la feuille suivante dans source et précédente dans destination sourceIndex = sourceIndex + 1 destinationIndex = destinationIndex - 1 Loop ' Réinitialiser les indices pour les feuilles Acronis sourceIndex = 1 destinationIndex = destinationWorkbook.Sheets.Count ' Recommencer à la dernière feuille du destinationWorkbook ' ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ' ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ' ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ' Transférer les données Acronis Do While sourceIndex <= sourceWorkbookAcronis.Sheets.Count And destinationIndex >= 1 Set sourceSheet = sourceWorkbookAcronis.Sheets(sourceIndex) Set destinationSheet = destinationWorkbook.Sheets(destinationIndex) ' Trouver la dernière ligne avec des données dans la feuille source lastRow = sourceSheet.Cells(sourceSheet.Rows.Count, "A").End(xlUp).row ' Renommer la feuille de destination RenameSheet destinationSheet, sourceSheet.Range("A1").Value ' Utilisation de A1 pour la date d'Acronis ' Transférer les données dynamiques If lastRow >= 3 Then With sourceSheet ' Fusionner C6 et D6, et les définir égal à A2 et B2 du fichier source With destinationSheet.Range("C6:D6") .Merge ' Fusionner les cellules C6 et D6 .Value = sourceSheet.Range("A2").Value ' Prendre la valeur de A2 du fichier source .Font.Size = 18 ' Taille de police 18 .Font.Bold = True ' Mettre en gras .Font.Color = RGB(255, 255, 255) ' Couleur du texte en blanc .Interior.Color = RGB(24, 50, 63) ' Fond égal à #18323F (converti en RGB) .HorizontalAlignment = xlCenter ' Centrer le texte horizontalement .VerticalAlignment = xlCenter ' Centrer le texte verticalement End With destinationSheet.Range("C7").Value = "Description" destinationSheet.Range("D7").Value = .Range("B2").Value Dim j As Long For j = 3 To lastRow destinationSheet.Cells(5 + j, 3).Value = .Cells(j, 1).Value ' C column destinationSheet.Cells(5 + j, 4).Value = .Cells(j, 2).Value ' D column Next j End With ' Appliquer la couleur bleu clair aux cellules C8 jusqu'à la dernière ligne With destinationSheet.Range("C7:D" & (5 + lastRow)) .Interior.Color = RGB(173, 216, 230) ' Bleu clair End With ' Appliquer des bordures sur la plage C7:D11 With destinationSheet.Range("C6:D" & (5 + lastRow)).Borders .LineStyle = xlContinuous ' Style de ligne continu .Weight = xlThin ' Épaisseur de la bordure (fine) .ColorIndex = 0 ' Couleur noire par défaut End With ' Appliquer la couleur verte ou rouge selon la valeur des cellules D12 et D13 ApplyConditionalFormattingAcronis destinationSheet, lastRow End If ' Passer à la feuille suivante dans source et précédente dans destination sourceIndex = sourceIndex + 1 destinationIndex = destinationIndex - 1 Loop ' Réinitialiser les indices pour les feuilles PRTG sourceIndex = 1 destinationIndex = destinationWorkbook.Sheets.Count ' Recommencer à la dernière feuille du destinationWorkbook ' ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ' ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ' ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 'Appliquer la couleur #18323F de E6:E10 For Each ws In destinationWorkbook.Sheets ws.Range("E6:E10").Interior.Color = RGB(24, 50, 63) ' Fond égal à #18323F (converti en RGB) Next ws ' Transférer les données PRTG Do While sourceIndex <= sourceWorkbookPRTG.Sheets.Count And destinationIndex >= 1 Set sourceSheet = sourceWorkbookPRTG.Sheets(sourceIndex) Set destinationSheet = destinationWorkbook.Sheets(destinationIndex) ' Trouver la dernière ligne avec des données dans la feuille source lastRow = sourceSheet.Cells(sourceSheet.Rows.Count, "A").End(xlUp).row ' Renommer la feuille de destination RenameSheet destinationSheet, sourceSheet.Range("A1").Value ' Utilisation de A1 pour la date de PRTG With sourceSheet ' Fusionner F6 et G6 With destinationSheet.Range("F6:G6") .Merge ' Fusionner les cellules F6 et G6 .Value = "PRTG" .Font.Size = 18 ' Taille de police 18 .Font.Bold = True ' Mettre en gras .Font.Color = RGB(255, 255, 255) ' Couleur du texte en blanc .Interior.Color = RGB(24, 50, 63) ' Fond égal à #18323F (converti en RGB) .HorizontalAlignment = xlCenter ' Centrer le texte horizontalement .VerticalAlignment = xlCenter ' Centrer le texte verticalement End With destinationSheet.Range("F7").Value = "Description" destinationSheet.Range("G7").Value = .Range("B2").Value Dim k As Long For k = 3 To lastRow destinationSheet.Cells(5 + k, 6).Value = .Cells(k, 1).Value ' F column destinationSheet.Cells(5 + k, 7).Value = .Cells(k, 2).Value ' G column Next k ' Appliquer la couleur bleu clair aux cellules F7 jusqu'à la dernière ligne With destinationSheet.Range("F7:G" & (5 + lastRow)) .Interior.Color = RGB(173, 216, 230) ' Bleu clair End With ' Appliquer des bordures sur la plage F7 jusqu'à la dernière ligne With destinationSheet.Range("F6:G" & (5 + lastRow)).Borders .LineStyle = xlContinuous ' Style de ligne continu .Weight = xlThin ' Épaisseur de la bordure (fine) .ColorIndex = 0 ' Couleur noire par défaut End With ' Appliquer la couleur verte ou rouge selon la valeur des cellules G13 et au-delà ApplyConditionalFormattingPRTG destinationSheet, lastRow End With ' Passer à la feuille suivante dans source et précédente dans destination sourceIndex = sourceIndex + 1 destinationIndex = destinationIndex - 1 Loop ' Réinitialiser les indices pour les feuilles Boot Catalog sourceIndex = 1 destinationIndex = destinationWorkbook.Sheets.Count ' Recommencer à la dernière feuille du destinationWorkbook ' ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ' ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ' ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ' Transférer les données Boot Catalog Do While sourceIndex <= sourceWorkbookBootCatalog.Sheets.Count And destinationIndex >= 1 Set sourceSheet = sourceWorkbookBootCatalog.Sheets(sourceIndex) Set destinationSheet = destinationWorkbook.Sheets(destinationIndex) ' Trouver la dernière ligne avec des données dans la feuille source lastRow = sourceSheet.Cells(sourceSheet.Rows.Count, "A").End(xlUp).row ' Renommer la feuille de destination RenameSheet destinationSheet, sourceSheet.Range("A1").Value ' Utilisation de A1 pour la date de Boot Catalog ' Transférer les données dynamiques If lastRow >= 3 Then With sourceSheet destinationSheet.Range("U11").Value = .Range("A1").Value destinationSheet.Range("U12").Value = .Range("A2").Value destinationSheet.Range("V12").Value = .Range("B2").Value Dim l As Long For l = 3 To lastRow destinationSheet.Cells(10 + l, 21).Value = .Cells(l, 1).Value ' T column destinationSheet.Cells(10 + l, 22).Value = .Cells(l, 2).Value ' U column Next l End With ' Appliquer la couleur bleu clair aux cellules T12 et U12 With destinationSheet.Range("U12:U" & (10 + lastRow)) .Interior.Color = RGB(173, 216, 230) ' Bleu clair End With End If ' Passer à la feuille suivante dans source et précédente dans destination sourceIndex = sourceIndex + 1 destinationIndex = destinationIndex - 1 Loop ' Mettre en forme le fichier destination et ajouter un bouton à chaque feuille For Each ws In destinationWorkbook.Sheets ' Centrage du contenu de la feuille ws.Cells.HorizontalAlignment = xlCenter ws.Cells.VerticalAlignment = xlCenter ws.Columns.AutoFit Next ws ' Enregistrer et fermer les classeurs destinationWorkbook.Close SaveChanges:=True sourceWorkbookNAS.Close SaveChanges:=False sourceWorkbookAcronis.Close SaveChanges:=False sourceWorkbookBootCatalog.Close SaveChanges:=False sourceWorkbookPRTG.Close SaveChanges:=False 'wbConfig.Close SaveChanges:=True 'Supprimer les fichiers sources Kill sourceFilePathNAS Kill sourceFilePathAcronis Kill sourceFilePathBootCatalog Kill sourceFilePathPRTG ' Libérer la mémoire Set sourceSheet = Nothing Set sourceWorkbookNAS = Nothing Set sourceWorkbookAcronis = Nothing Set sourceWorkbookBootCatalog = Nothing Set destinationSheet = Nothing Set destinationWorkbook = Nothing Set wbConfig = Nothing End Sub
Voici le code un peu plus organisé, je ne sais pas pourquoi la mise en page à sauté.
21 oct. 2024 à 12:55
Bonjour,
Mets cette macro dans un module standard et rattache-la au bouton :
Sub OuvrirConfig() Workbooks.Open Environ("USERPROFILE") & "\Documents\mail\config.xlsx" End Sub
Daniel
21 oct. 2024 à 16:42
Merci, mais je n'arrive tous de mêmes pas à créer le bouton via le code VBA est ensuite le relier à la macro afin de l'exécuter. J'ai rajouter ce code pour créer le bouton pour chaque feuille de mon classeur :
For Each ws In destinationWorkbook.Sheets ws.Buttons.Add(400, 10, 100, 30).OnAction = "OuvrirConfig" ws.Buttons(1).Characters.Text = "Ouvrir Config" Next ws
Mais lorsque je clique sur le bouton dans mon fichier excel, il me dit : "impossible d'exécuter la macro 'OuvrirConfig'. Il est possible qu'elle ne soit pas disponible dans ce classeur"
21 oct. 2024 à 16:51
Ca fonctionne ici. Il ne faut pas que "OuvrirConfig" soit défini comme "private". Il faut aussi qu'elle soit dans un module standard, pas dans un module feuille.
Daniel
21 oct. 2024 à 17:14
Je débute en VBA donc peut être que c'est tout bête et que je ne place juste pas bien les fichiers. Mais ma macro est 'Module1' et mon fichier avec le code est 'Module11', ci-joint l'image de l'architecture de mes fichiers
21 oct. 2024 à 17:48
Ca devrait fonctionner. Tu n'as pas laissé aussi la macro dans un module feuille ? Si tu ne trouves pas, partage ton classeur.
Daniel
22 oct. 2024 à 09:07
Bonjour,
Je n'ai pas trouvé, voici mon classeur https://www.cjoint.com/c/NJwhgbcQL2Y
Modifié le 22 oct. 2024 à 09:27
Bonjour,
Regarde le classeur :
https://www.cjoint.com/c/NJwhuXZCgT3
J'ai enregistré le classeur au format .xlsm (supportant les macros) et j'ai ajouté un module standard dans le quel j'ai mis OuvrirConfig.
Daniel
22 oct. 2024 à 10:55
Je ne savais pas qu'il fallait que le fichier soit en .xlsm pour utilisé les macros, merci.
Toutefois, j'ai toujours le problème :
Dans ma fonction qui crée le fichier "consolidated_report", j'ai fais en sorte qu'il se créer en .xlsm (sans soucis, lorsque je regarde les propriété de mon fichier il est dans le bon format). Mais la fonction qui crée le bouton et qui est censé lui affecter la macro :
' Créer un bouton pour ouvrir le fichier de config sur chaque feuille avec la fonction OuvrirConfig() en tant que macro For Each ws In destinationWorkbook.Sheets ws.Buttons.Add(400, 10, 100, 30).OnAction = "OuvrirConfig" ws.Buttons(1).Characters.Text = "Ouvrir Config" Next ws
Dans mon fichier de report lorsque je clique sur le bouton, il me dit toujours "Impossible d'exécuter la macro "OuvrirConfig". Il est possible qu'elle ne soit pas disponible dans ce classeur ou que toutes les macros soient désactivées". Je ne sais pas si ça a avoir avec le fais que c'est à partir de outlook que j'essaie de lui affecter la macro même si je ne comprendrai pas pourquoi.
Et ducoup, j'ai changer le format aussi dans la macro :
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionModifié le 22 oct. 2024 à 11:17
Je ne suis pas sûr de comprendre. Ce n'est pas le fichier config qui doit être au format .xlsm, c'est celui qui comprend les macros (à moins que ce soit le même ???). Dans tous les cas, partage les classeurs qui posent problème.
22 oct. 2024 à 11:22
Euh oui effectivement, le fichier de config n'as pas besoin d'être en .xlsm, je me suis complétement embrouiller... Par contre je vous fais parvenir mon classeur 'consolidated_report' qui lui est bien au format .xlsm mais n'as pas la macro que je lui affecte : https://www.cjoint.com/c/NJwjulA4Hyz
Modifié le 22 oct. 2024 à 11:47
"mais n'as pas la macro que je lui affecte " POURQUOI ???
https://www.cjoint.com/c/NJwjKusfRu3
Est-ce que le classeur à bien été créé par toi ? S'il provient d'internet, tu dois avoir ce bandeau rouge à l'ouverture du classeur (en français) :
il faut le débloquer dans les propriétés du fichier :
Daniel
22 oct. 2024 à 12:19
Oui je sais, mais non je n'ai pas ça car c'est bien moi qui l'ai crée
22 oct. 2024 à 12:54
Est-ce que tu as toujours le même problème que je t'ai retourné et qui fonctionne ici ?
Daniel
22 oct. 2024 à 13:07
Je suis pas sur d'avoir compris, si vous me demandez est ce que quand je télécharge le lien que vous m'avez renvoyé ça fonctionne, la réponse est oui sinon je n'ai pas compris la question
22 oct. 2024 à 14:59
Désolé, je pense plus vite que j'écris. C'est en effet incompréhensible. Je voulais donc dire :
Est-ce que tu as toujours le même problème avec le classeur que je t'ai retourné et qui fonctionne ici ?
Ca fonctionne donc chez toi. Le problème est donc résolu ?
Daniel
22 oct. 2024 à 15:24
Non, le problème n'est pas réglé. Le classeur que vous m'avez retourné, fonctionne effectivement, seulement je pense qu'on c'est pas exactement compris sur ce que je veux.
Pour faire simple, j'ai un code de plus de 1200 lignes sur outlook qui fait en sorte de lire différents rapports de mail. Il crée ensuite, à partir de ces mails, 4 excels (car j'ai quatre dossier différents contenant des rapports), je les "rassemble" en 1 seul fichier excel (nommé "dateDuJour_consolidated_report"). Et dans ce rapport 'final', je voudrais qu'il y est un bouton qui permettre d'ouvrir le fichier de config utilisé pour les différents excels de rapport.
En gros j'ai ça dans outlook :
Ensuite j'ai crée une icone qui lancer le 'module11' :
Et à la fin, j'obtiens mon classeur finale nommé "dateDuJour_consolidated_report" avec le bouton mais il ne contient pas la macro : https://www.cjoint.com/c/NJwnypDlBxY
22 oct. 2024 à 15:58
D'accord. A quoi sert la macro "Merge" qui semble être du code Excel ?
Daniel
22 oct. 2024 à 16:02
Elle sert justement à rassembler les 4 autres fichiers excel en un seul, c'est elle qui fait en sorte de "remplir" 'dateDuJour_consolidated_report'.
22 oct. 2024 à 16:11
Je pense avoir compris. Tu veux que la macro Merge ajoute la macro dans le classeur final ?
22 oct. 2024 à 16:13
Oui c'est ça, je veux qu'a la fin de Merge, il ajoute un bouton avec une macro associé permettant d'ouvrir le fichier de config
22 oct. 2024 à 16:45
Deux choses à régler au préalable :
1. Ouvre le classeur contenant la macro Merge. Clique sur Fichier, Options, Centre de gestion de la confidentialité, Paramètres du Centre de gestion de la confidentialité. Dans Paramètres des macros, coche la case "Accès approuvé au modèle d'objet du projet VBA. Valide. Enregistre le classeur.
2. Dans l'éditeur VBA, clique sur Outils, Références. Coche la case "Microsoft Visual Basic For Applications Extensibility 5.3". Valide. Enregistre le classeur.
J'ai ajouté ce code :
'*** ajout du module "Module9" dans le fichier destination '*** la référence "Microsoft Visual Basic For Applications Extensibility 5.3" doit être cochée Dim proj As VBIDE.VBProject Dim comp As VBIDE.VBComponent Set proj = destinationWorkbook.VBProject Set comp = proj.VBComponents.Add(vbext_ct_StdModule) comp.Name = "Module9" Set codeMod = comp.CodeModule With codeMod lineNum = .CountOfLines + 1 .InsertLines lineNum, "Sub OuvrirConfig()" lineNum = lineNum + 1 .InsertLines lineNum, " Workbooks.Open Environ(""USERPROFILE"") & ""\Documents\mail\config.xlsx""" lineNum = lineNum + 1 .InsertLines lineNum, "End Sub" End With
avant la ligne :
' Enregistrer et fermer les classeurs
Soit le code complet (il manque l'ajout des boutons) :
Sub Merge() Dim sourceWorkbookNAS As Workbook Dim sourceWorkbookAcronis As Workbook Dim sourceWorkbookBootCatalog As Workbook Dim sourceWorkbookPRTG As Workbook Dim destinationWorkbook As Workbook Dim sourceSheet As Worksheet Dim destinationSheet As Worksheet Dim sourceFilePathNAS As String Dim sourceFilePathAcronis As String Dim sourceFilePathBootCatalog As String Dim sourceFilePathPRTG As String Dim destinationFilePath As String Dim configFilePath As String Dim sourceIndex As Integer Dim destinationIndex As Integer Dim lastRow As Long Dim currentDate As Date Dim formatdate As String Dim ws As Worksheet ' Chemins des fichiers source et destination formatdate = Format(Date, "dd_MM_yyyy") sourceFilePathNAS = Environ("USERPROFILE") & "\Documents\mail\" & formatdate & "_checkup_NAS.xlsx" sourceFilePathAcronis = Environ("USERPROFILE") & "\Documents\mail\" & formatdate & "_checkup_Acronis.xlsx" sourceFilePathBootCatalog = Environ("USERPROFILE") & "\Documents\mail\" & formatdate & "_checkup_BootCatalog.xlsx" sourceFilePathPRTG = Environ("USERPROFILE") & "\Documents\mail\" & formatdate & "_checkup_PRTG.xlsx" destinationFilePath = Environ("USERPROFILE") & "\Documents\mail\" & formatdate & "_consolidated_report.xlsx" configFilePath = Environ("USERPROFILE") & "\Documents\mail\config.xlsx" ' Fichier Config pour gérer les noms des appareils ' Ouvrir les fichiers source et destination Set sourceWorkbookNAS = Workbooks.Open(sourceFilePathNAS) Set sourceWorkbookAcronis = Workbooks.Open(sourceFilePathAcronis) Set sourceWorkbookBootCatalog = Workbooks.Open(sourceFilePathBootCatalog) Set sourceWorkbookPRTG = Workbooks.Open(sourceFilePathPRTG) Set destinationWorkbook = Workbooks.Open(destinationFilePath) ' Initialiser les indices pour les feuilles sourceIndex = 1 destinationIndex = destinationWorkbook.Sheets.Count ' Commencer à la dernière feuille du destinationWorkbook ' ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ' ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ' ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ' Transférer les données NAS dynamiquement Do While sourceIndex <= sourceWorkbookNAS.Sheets.Count And destinationIndex >= 1 Set sourceSheet = sourceWorkbookNAS.Sheets(sourceIndex) Set destinationSheet = destinationWorkbook.Sheets(destinationIndex) ' Trouver la dernière ligne avec des données dans la feuille source lastRow = sourceSheet.Cells(sourceSheet.Rows.Count, "A").End(xlUp).Row ' Renommer la feuille de destination RenameSheet destinationSheet, sourceSheet.Range("A1").Value ' Utilisation de A1 pour la date du NAS ' Transférer les données dynamiques If lastRow >= 3 Then With sourceSheet ' Fusionner A6 et B6, et les définir égal à A1 du fichier source (date) With destinationSheet.Range("A6:B6") .Merge ' Fusionner les cellules A6 et B6 .Value = sourceSheet.Range("A2").Value ' Prendre la valeur de A2 du fichier source .Font.Size = 18 ' Taille de police 18 .Font.Bold = True ' Mettre en gras .Font.Color = RGB(255, 255, 255) ' Couleur du texte en blanc .Interior.Color = RGB(24, 50, 63) ' Fond égal à #18323F (converti en RGB) .HorizontalAlignment = xlCenter ' Centrer le texte horizontalement .VerticalAlignment = xlCenter ' Centrer le texte verticalement End With ' Mettre en place les en-têtes "Description" et "Statut" destinationSheet.Range("A7").Value = "Description" destinationSheet.Range("B7").Value = "Statut" ' Boucle dynamique pour transférer les données des NAS Dim i As Long For i = 3 To lastRow destinationSheet.Cells(5 + i, 1).Value = .Cells(i, 1).Value ' Colonne A (Nom NAS) destinationSheet.Cells(5 + i, 2).Value = .Cells(i, 2).Value ' Colonne B (Statut NAS) Next i End With ' Appliquer la couleur bleu clair aux cellules A8 jusqu'à la dernière ligne With destinationSheet.Range("A7:B" & (5 + lastRow)) .Interior.Color = RGB(173, 216, 230) ' Bleu clair End With ' Appliquer des bordures sur la plage A6:B(lastRow) With destinationSheet.Range("A6:B" & (5 + lastRow)).Borders .LineStyle = xlContinuous ' Style de ligne continu .Weight = xlThin ' Épaisseur de la bordure (fine) .ColorIndex = 0 ' Couleur noire par défaut End With ' Appliquer la mise en forme conditionnelle pour le statut des NAS si nécessaire ApplyConditionalFormattingNAS destinationSheet, lastRow End If ' Passer à la feuille suivante dans source et précédente dans destination sourceIndex = sourceIndex + 1 destinationIndex = destinationIndex - 1 Loop ' Réinitialiser les indices pour les feuilles Acronis sourceIndex = 1 destinationIndex = destinationWorkbook.Sheets.Count ' Recommencer à la dernière feuille du destinationWorkbook ' ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ' ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ' ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ' Transférer les données Acronis Do While sourceIndex <= sourceWorkbookAcronis.Sheets.Count And destinationIndex >= 1 Set sourceSheet = sourceWorkbookAcronis.Sheets(sourceIndex) Set destinationSheet = destinationWorkbook.Sheets(destinationIndex) ' Trouver la dernière ligne avec des données dans la feuille source lastRow = sourceSheet.Cells(sourceSheet.Rows.Count, "A").End(xlUp).Row ' Renommer la feuille de destination RenameSheet destinationSheet, sourceSheet.Range("A1").Value ' Utilisation de A1 pour la date d'Acronis ' Transférer les données dynamiques If lastRow >= 3 Then With sourceSheet ' Fusionner C6 et D6, et les définir égal à A2 et B2 du fichier source With destinationSheet.Range("C6:D6") .Merge ' Fusionner les cellules C6 et D6 .Value = sourceSheet.Range("A2").Value ' Prendre la valeur de A2 du fichier source .Font.Size = 18 ' Taille de police 18 .Font.Bold = True ' Mettre en gras .Font.Color = RGB(255, 255, 255) ' Couleur du texte en blanc .Interior.Color = RGB(24, 50, 63) ' Fond égal à #18323F (converti en RGB) .HorizontalAlignment = xlCenter ' Centrer le texte horizontalement .VerticalAlignment = xlCenter ' Centrer le texte verticalement End With destinationSheet.Range("C7").Value = "Description" destinationSheet.Range("D7").Value = .Range("B2").Value Dim j As Long For j = 3 To lastRow destinationSheet.Cells(5 + j, 3).Value = .Cells(j, 1).Value ' C column destinationSheet.Cells(5 + j, 4).Value = .Cells(j, 2).Value ' D column Next j End With ' Appliquer la couleur bleu clair aux cellules C8 jusqu'à la dernière ligne With destinationSheet.Range("C7:D" & (5 + lastRow)) .Interior.Color = RGB(173, 216, 230) ' Bleu clair End With ' Appliquer des bordures sur la plage C7:D11 With destinationSheet.Range("C6:D" & (5 + lastRow)).Borders .LineStyle = xlContinuous ' Style de ligne continu .Weight = xlThin ' Épaisseur de la bordure (fine) .ColorIndex = 0 ' Couleur noire par défaut End With ' Appliquer la couleur verte ou rouge selon la valeur des cellules D12 et D13 ApplyConditionalFormattingAcronis destinationSheet, lastRow End If ' Passer à la feuille suivante dans source et précédente dans destination sourceIndex = sourceIndex + 1 destinationIndex = destinationIndex - 1 Loop ' Réinitialiser les indices pour les feuilles PRTG sourceIndex = 1 destinationIndex = destinationWorkbook.Sheets.Count ' Recommencer à la dernière feuille du destinationWorkbook ' ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ' ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ' ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 'Appliquer la couleur #18323F de E6:E10 For Each ws In destinationWorkbook.Sheets ws.Range("E6:E10").Interior.Color = RGB(24, 50, 63) ' Fond égal à #18323F (converti en RGB) Next ws ' Transférer les données PRTG Do While sourceIndex <= sourceWorkbookPRTG.Sheets.Count And destinationIndex >= 1 Set sourceSheet = sourceWorkbookPRTG.Sheets(sourceIndex) Set destinationSheet = destinationWorkbook.Sheets(destinationIndex) ' Trouver la dernière ligne avec des données dans la feuille source lastRow = sourceSheet.Cells(sourceSheet.Rows.Count, "A").End(xlUp).Row ' Renommer la feuille de destination RenameSheet destinationSheet, sourceSheet.Range("A1").Value ' Utilisation de A1 pour la date de PRTG With sourceSheet ' Fusionner F6 et G6 With destinationSheet.Range("F6:G6") .Merge ' Fusionner les cellules F6 et G6 .Value = "PRTG" .Font.Size = 18 ' Taille de police 18 .Font.Bold = True ' Mettre en gras .Font.Color = RGB(255, 255, 255) ' Couleur du texte en blanc .Interior.Color = RGB(24, 50, 63) ' Fond égal à #18323F (converti en RGB) .HorizontalAlignment = xlCenter ' Centrer le texte horizontalement .VerticalAlignment = xlCenter ' Centrer le texte verticalement End With destinationSheet.Range("F7").Value = "Description" destinationSheet.Range("G7").Value = .Range("B2").Value Dim k As Long For k = 3 To lastRow destinationSheet.Cells(5 + k, 6).Value = .Cells(k, 1).Value ' F column destinationSheet.Cells(5 + k, 7).Value = .Cells(k, 2).Value ' G column Next k ' Appliquer la couleur bleu clair aux cellules F7 jusqu'à la dernière ligne With destinationSheet.Range("F7:G" & (5 + lastRow)) .Interior.Color = RGB(173, 216, 230) ' Bleu clair End With ' Appliquer des bordures sur la plage F7 jusqu'à la dernière ligne With destinationSheet.Range("F6:G" & (5 + lastRow)).Borders .LineStyle = xlContinuous ' Style de ligne continu .Weight = xlThin ' Épaisseur de la bordure (fine) .ColorIndex = 0 ' Couleur noire par défaut End With ' Appliquer la couleur verte ou rouge selon la valeur des cellules G13 et au-delà ApplyConditionalFormattingPRTG destinationSheet, lastRow End With ' Passer à la feuille suivante dans source et précédente dans destination sourceIndex = sourceIndex + 1 destinationIndex = destinationIndex - 1 Loop ' Réinitialiser les indices pour les feuilles Boot Catalog sourceIndex = 1 destinationIndex = destinationWorkbook.Sheets.Count ' Recommencer à la dernière feuille du destinationWorkbook ' ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ' ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ' ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ' Transférer les données Boot Catalog Do While sourceIndex <= sourceWorkbookBootCatalog.Sheets.Count And destinationIndex >= 1 Set sourceSheet = sourceWorkbookBootCatalog.Sheets(sourceIndex) Set destinationSheet = destinationWorkbook.Sheets(destinationIndex) ' Trouver la dernière ligne avec des données dans la feuille source lastRow = sourceSheet.Cells(sourceSheet.Rows.Count, "A").End(xlUp).Row ' Renommer la feuille de destination RenameSheet destinationSheet, sourceSheet.Range("A1").Value ' Utilisation de A1 pour la date de Boot Catalog ' Transférer les données dynamiques If lastRow >= 3 Then With sourceSheet destinationSheet.Range("U11").Value = .Range("A1").Value destinationSheet.Range("U12").Value = .Range("A2").Value destinationSheet.Range("V12").Value = .Range("B2").Value Dim l As Long For l = 3 To lastRow destinationSheet.Cells(10 + l, 21).Value = .Cells(l, 1).Value ' T column destinationSheet.Cells(10 + l, 22).Value = .Cells(l, 2).Value ' U column Next l End With ' Appliquer la couleur bleu clair aux cellules T12 et U12 With destinationSheet.Range("U12:U" & (10 + lastRow)) .Interior.Color = RGB(173, 216, 230) ' Bleu clair End With End If ' Passer à la feuille suivante dans source et précédente dans destination sourceIndex = sourceIndex + 1 destinationIndex = destinationIndex - 1 Loop ' Mettre en forme le fichier destination et ajouter un bouton à chaque feuille For Each ws In destinationWorkbook.Sheets ' Centrage du contenu de la feuille ws.Cells.HorizontalAlignment = xlCenter ws.Cells.VerticalAlignment = xlCenter ws.Columns.AutoFit Next ws '*** ajout du module "Module9" dans le fichier destination '*** la référence "Microsoft Visual Basic For Applications Extensibility 5.3" doit être cochée Dim proj As VBIDE.VBProject Dim comp As VBIDE.VBComponent Set proj = destinationWorkbook.VBProject Set comp = proj.VBComponents.Add(vbext_ct_StdModule) comp.Name = "Module9" Set codeMod = comp.CodeModule With codeMod lineNum = .CountOfLines + 1 .InsertLines lineNum, "Sub OuvrirConfig()" lineNum = lineNum + 1 .InsertLines lineNum, " Workbooks.Open Environ(""USERPROFILE"") & ""\Documents\mail\config.xlsx""" lineNum = lineNum + 1 .InsertLines lineNum, "End Sub" End With ' Enregistrer et fermer les classeurs destinationWorkbook.Close SaveChanges:=True sourceWorkbookNAS.Close SaveChanges:=False sourceWorkbookAcronis.Close SaveChanges:=False sourceWorkbookBootCatalog.Close SaveChanges:=False sourceWorkbookPRTG.Close SaveChanges:=False 'wbConfig.Close SaveChanges:=True 'Supprimer les fichiers sources Kill sourceFilePathNAS Kill sourceFilePathAcronis Kill sourceFilePathBootCatalog Kill sourceFilePathPRTG ' Libérer la mémoire Set sourceSheet = Nothing Set sourceWorkbookNAS = Nothing Set sourceWorkbookAcronis = Nothing Set sourceWorkbookBootCatalog = Nothing Set destinationSheet = Nothing Set destinationWorkbook = Nothing Set wbConfig = Nothing End Sub
Note : Tu peux ôter la macro OuvrirConfig du code Outlook.
Daniel
22 oct. 2024 à 16:51
On a encore un petit soucis, le soucis étant qu'enfaite je n'ai pas accès au classeur au préalable, enfaite Merge() est une fonction qui rassemble tous les excels en 1 seul puis après l'avoir fais, j'ai accès au classeur final. Seulement je voudrais que lorsque que j'y est accès, le bouton soit déjà paramétré avec la macro.
Je sais pas si c'est clair, mais en gros il faut retenir que je ne peux pas accéder au classeur, je gère absolument tout via le code. Ce que je voudrais c'est qu'a aucun moment je n'ai besoin d'ouvrir le classeur pour faire fonctionner la macro.
22 oct. 2024 à 16:59
Ce que je t'ai dit, c'est à faire une seule fois. Le point 1 doit être fait sur l'ordi qui exécute la macro Merge. C'est obligatoire.
Le point 2 doit être fait dans le classeur qui contient la macro Merge, une fois pour toutes. Je suppose que si tu peux modifier la macro, tu peu modifier les références ? A la limite, ce point peut être réglé via VBA.
Sinon, l'alternative serait de faire l'ajout à l'ouverture du classeur de destination. Reste que l'"Accès approuvé au modèle d'objet du projet VBA" devra être activé sur l'ordi qui ouvrira la classeur.
22 oct. 2024 à 16:46
J'ajoute les boutons ou tu le fais ?
Daniel
23 oct. 2024 à 09:08
J'ai ajouté les boutons et ça fonctionne parfaitement, je vous remercie !!
23 oct. 2024 à 09:57
Il n'y a plus de problème, alors ?