XL 2019 mise en forme conditionnelle, mais pas que...!!!

JPh2309

XLDnaute Junior
Bonjour,
J'ai cherché dans les différentes discussions mais les exemples trouvés bien qu'intéressants, ne collaient pas à mon cas.
À partir d'une macro de saisie dans la feuille 1, j'incrémente un tableau dans la feuille 2. Jusque là c'est rudimentaire pour vous mais je suis fier d'avoir réussi seul, ça fonctionne !
Là où ça se complique, c'est que je n'arrive pas à faire une mise en forme conditionnelle qui s'applique à un tableau qui évolue à chaque nouvelle entrée.
De plus, dans ce tableau j'ai une liste déroulante que je n'arrive pas à proposer aux nouvelles cellules ajoutées.
J'ai mis des commentaires dans mon fichier test pour vous aider à comprendre ma problématique.
Merci de votre aide !
 

Pièces jointes

  • saisie test.xlsm
    41.1 KB · Affichages: 10

JPh2309

XLDnaute Junior
Bonjour,

Tout comme le camarade sylvanu j'étais parti sur un TS, mais comme l'a magnifiquement montré job75 c'est effectivement sans grand intérêt (si ce n'est éventuellement pour avoir facilement une alternance de deux couleurs de lignes). :(

Du coup ça m'a donné quasiment le même résultat que sylvanu, mais vu que je l'ai fait, je le poste tout de même en pièce jointe.
Bonjour ToofatBoy,
Merci infiniment, ça fonctionne parfaitement.
Encore merci également à tous ceux qui ont contribué à cet échange et à sa résolution
 

JPh2309

XLDnaute Junior
Bonjour,

Le format "barré" ne peut pas être appliqué par MFC.

Un tableau structuré n'apporte rien de plus ici, voyez le fichier joint et utilisez cette macro :
VB:
Sub saisie()
With Sheets("Feuil2").[C4:F4]
    .Insert xlDown, xlFormatFromRightOrBelow 'formats du dessous
    .Rows(0).Resize(, 2) = [D5:E5].Value
End With
End Sub
La liste de validation en colonne F est copiée.

Et pour créer le format "barré" cette macro dans le code de Feuil2 :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
With Range("F4:F" & Cells.SpecialCells(xlCellTypeLastCell).Row)
    If Intersect(Target, Cells) Is Nothing Then Exit Sub
    Application.ScreenUpdating = False
    .Columns(-2).Resize(, 3).Font.Strikethrough = False 'RAZ
    For Each c In .Cells
        If LCase(c) = "oui" Then c(1, -2).Resize(, 3).Font.Strikethrough = True
    Next
End With
End Sub

A+
Merci Job
 

job75

XLDnaute Barbatruc
Dans la foulée je traite le 2ème fichier avec cette macro :
VB:
Sub Nouveau()
With Sheets("Données").[C7:U7]
    .Insert xlDown, xlFormatFromRightOrBelow 'formats du dessous
    .Rows(0).Resize(, 3) = Array([F7], [F9], [F11])
    .Parent.Activate 'facultatif
End With
End Sub
 

Pièces jointes

  • testJPG-2.xlsm
    133.9 KB · Affichages: 1

JPh2309

XLDnaute Junior
Re bonjour à tous,
Tout fonctionne merveilleusement bien, encore merci à tous pour votre aide.
Ce fichier a séduit pas mal de collègues. J'ai donc décidé de le partager dans un SharePoint et là..."le script a échoué"...tout est en anglais mais j'imagine que les lignes de codes sont différentes que l'on soit en partage O365 ou non...
Avez-vous une solution svp ?
 

Pièces jointes

  • erreur1.PNG
    erreur1.PNG
    20.6 KB · Affichages: 12
  • script.PNG
    script.PNG
    16.1 KB · Affichages: 12

JPh2309

XLDnaute Junior
Je ne suis pas certain que les macros fonctionnent en partage SharePoint.

Le but est-il de pouvoir travailler à plusieurs sur le même fichier ?
Bonjour,
Oui, le but est de travailler à plusieurs.
Des macros peuvent fonctionner en partage avec SharePoint (ils appellent ça "script") mais je pense que les lignes de programmations sont un peu différentes...mais comme c'est écrit en anglais, je ne sais pas ce qu'il faut changer...c'est pour ça que j'ai mis les captures d'écran des messages d'erreur.
 

TooFatBoy

XLDnaute Barbatruc
Des macros peuvent fonctionner en partage avec SharePoint (ils appellent ça "script")
Du coup je viens de faire une recherche, et d'après ce que j'ai trouvé chez Microsoft, les macros ne fonctionnent pas sous SharePoint.


Oui, le but est de travailler à plusieurs.
N'avez-vous pas un simple espace de stockage (un disque réseau) commun ?
 

JPh2309

XLDnaute Junior
Du coup je viens de faire une recherche, et d'après ce que j'ai trouvé chez Microsoft, les macros ne fonctionnent pas sous SharePoint.



N'avez-vous pas un simple espace de stockage (un disque réseau) commun ?
Je vais me renseigner...Comme la boite migre tout sous O365, il est vraisemblable qu'à terme tout disparaisse.
En revanche, avant que vous ne m'aidiez tous, j'avais réussi à faire ça en enregistrant la macro qui insère les données pas à pas (commencer l'enregistrement - arrêter l'enregistrement), directement dans le fichier Excel du Sharepoint.
Je ne sais pas si ça peut vous aider...

function main(workbook: ExcelScript.Workbook) {
let donn_es = workbook.getWorksheet("Données");
// Insert at range 7:7 on donn_es, move existing cells down
donn_es.getRange("7:7").insert(ExcelScript.InsertShiftDirection.down);
let selectedSheet = workbook.getActiveWorksheet();
// Paste to range C7 on donn_es from range F7:G7 on selectedSheet
donn_es.getRange("C7").copyFrom(selectedSheet.getRange("F7:G7"), ExcelScript.RangeCopyType.values, false, false);
// Paste to range D7 on donn_es from range F9 on selectedSheet
donn_es.getRange("D7").copyFrom(selectedSheet.getRange("F9"), ExcelScript.RangeCopyType.values, false, false);
// Paste to range E7 on donn_es from range F11:M11 on selectedSheet
donn_es.getRange("E7").copyFrom(selectedSheet.getRange("F11:M11"), ExcelScript.RangeCopyType.values, false, false);
// Clear ExcelScript.ClearApplyTo.contents from range F11:M11 on selectedSheet
selectedSheet.getRange("F11:M11").clear(ExcelScript.ClearApplyTo.contents);
// Clear ExcelScript.ClearApplyTo.contents from range F9 on selectedSheet
selectedSheet.getRange("F9").clear(ExcelScript.ClearApplyTo.contents);
// Clear ExcelScript.ClearApplyTo.contents from range F7:G7 on selectedSheet
selectedSheet.getRange("F7:G7").clear(ExcelScript.ClearApplyTo.contents);
 

JPh2309

XLDnaute Junior
Bonjour à tous,
Encore un grand merci et un grand bravo à tous les contributeurs pour l'amélioration que vous avez réussi à apporter à mon fichier.
j'ai besoin d'une dernière évolution de mise en forme conditionnelle.
En pièce jointe, le fichier sur lequel vous avez déjà travaillé. Dans l'onglet "données" j'ai mis des exemples du résultat que j'aimerais obtenir. J'ai essayé avec la formule =$...=aujourd'hui() mais sans succès.
Merci pour votre aide
 

Pièces jointes

  • testJPG-4.xlsm
    135.1 KB · Affichages: 3

job75

XLDnaute Barbatruc
Bonjour JPh2309,

Voyez le fichier joint et cette macro dans le code de la feuille "Données" :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
Application.EnableEvents = False 'désactive les évènements
For Each c In Range("M7", Range("M" & Rows.Count).End(xlUp))
    If IsDate(c) Then
        If Date >= c Then
            If c(1, 3) <> "Terminé" Then c(1, 3) = "Hors délai"
        Else
            If c(1, 3) = "Hors délai" Then c(1, 3) = "En cours"
        End If
    End If
Next
Application.EnableEvents = True 'réactive les évènements
End Sub
Elle se déclenche quand on modifie ou valide une cellule quelconque.

Ainsi qu'à l'ouverture du fichier avec dans ThisWorkbook :
VB:
Private Sub Workbook_Open()
Sheets("Données").[A1] = Sheets("Données").[A1].Formula 'lance la macro Worksheet_Change
Me.Saved = True 'évite l'invite à la fermeture si aucune modification
End Sub

Voyez aussi les diverses MFC sur les plages C6:N11 et O6:O11.

A+
 

Pièces jointes

  • testJPG-4.xlsm
    138.1 KB · Affichages: 2

JPh2309

XLDnaute Junior
Bonjour JPh2309,

Voyez le fichier joint et cette macro dans le code de la feuille "Données" :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
Application.EnableEvents = False 'désactive les évènements
For Each c In Range("M7", Range("M" & Rows.Count).End(xlUp))
    If IsDate(c) Then
        If Date >= c Then
            If c(1, 3) <> "Terminé" Then c(1, 3) = "Hors délai"
        Else
            If c(1, 3) = "Hors délai" Then c(1, 3) = "En cours"
        End If
    End If
Next
Application.EnableEvents = True 'réactive les évènements
End Sub
Elle se déclenche quand on modifie ou valide une cellule quelconque.

Ainsi qu'à l'ouverture du fichier avec dans ThisWorkbook :
VB:
Private Sub Workbook_Open()
Sheets("Données").[A1] = Sheets("Données").[A1].Formula 'lance la macro Worksheet_Change
Me.Saved = True 'évite l'invite à la fermeture si aucune modification
End Sub

Voyez aussi les diverses MFC sur les plages C6:N11 et O6:O11.

A+
Bonjour JOB78,
Un immense merci, c'est exactement ça...!!!
Je suis admiratif devant la rapidité et l'efficacité avec laquelle tu as résolu mon problème.
Bonne journée
 

Statistiques des forums

Discussions
312 084
Messages
2 085 194
Membres
102 813
dernier inscrit
kaiyi