XL 2010 Mise en forme conditionnel [VBA] critères multiple

Nylream

XLDnaute Junior
Bonjour,

J'aimerais utiliser le VBA pour ma mise en forme conditionnel (je ne souhaite pas utiliser l'outil de base).
J'ai trois type de mise en forme pour mon tableau :
  1. Un mot à mettre en rouge si présent
  2. Doublon sur une même colonne : fond de la ligne à changer (prioritaire)
  3. le fond d'une ligne à changer, en fonction de deux cellule (F et G) sur cette même ligne
Concrètement:
  • Si deux fois le même nom en colone A, le fond de la ligne en rouge
  • Si (F= "Navy") + (G = "O-11", "O-10", "O-9") alors couleurs #xxxx
  • Si (F= "Marines") + (G = "O-11", "O-10", "O-9") alors couleurs #yyyy
  • le mot "Unkow" toujours en rouge
J'ai testé pour le mot "Unknow" en rouge, mais en vain, les autres étant plus complexe, je cale.

Code:
Sub ColorOnDouble()

    Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=$B2:$K="Unknow""
    ligne .Color = 255
   
End Sub

Merci d'avance pour votre aide,
 

Pièces jointes

  • Test_Tool - v3.2.xlsm
    117.8 KB · Affichages: 49

job75

XLDnaute Barbatruc
Re,

Au fichier (4) je viens d'ajouter dans la Worksheet_Change de "Members" :
Code:
'---met à jour la base du filtre si nécessaire---
AutoFilterMode = False: [A:K].AutoFilter
A savoir : pour le filtre comme pour le tri on peut utiliser des plages illimitées, Excel ajuste au UsedRange.

Concernant votre Edit du post #30 vous vous compliquez la vie !!!

Dans les feuilles "Dispatch" déverrouillez une fois pour toutes les cellules des tableaux (hors les en-têtes).

Et pour déplacer baptiste Smith de C6 à D5 :

- sélectionner C6:C7 => Copier

- sélectionner D5: D6 => Collage spécial-Valeurs

- sélectionner C6:C7 => effacer.

A+
 
Dernière édition:

Nylream

XLDnaute Junior
Re,
En fait, le besoin est pour une autre feuille (Orders) dans laquelle sera explicitement entré l'ancienne affectation ainsi que la nouvelle.
Si il était possible d'avoir en mémoire l'ancienne et la nouvelle affectation pour un même nom, le remplissage se ferait bien plus simplement qu'actuellement.
 

Nylream

XLDnaute Junior
Re,

Orders est un document contenant les détails d'une affectation pour un membre.
Dans ce document on retrouve entre autre, l'ancienne affectation, et la nouvelle.

Si on bouge un membre dans un des tableau, ou même d'au tableau vers un autre, récupérer sa nouvelle affectation ne posera pas de soucis, mais pour avoir l'ancienne, c'est là qu'une "mémoire", si c'est possible serait super.
Cela me permettrait de partir sur une feuille qui générerait le document en pdf.

Là encore, je ne sais pas si c'est de l'ordre du possible, mais si oui, ça répondrait à un besoin.

Encore merci à vous,
 

job75

XLDnaute Barbatruc
Re,

Tout est possible en VBA si le projet a été conçu correctement.

Peut-être faudra-t-il revoir la conception du vôtre si l'on veut éviter l'usine à gaz.

S'agissant d'un nouveau problème je vous conseille de créer une nouvelle discussion avec le fichier adéquat.

Bonne continuation.
 

Nylream

XLDnaute Junior
Re,

Pour ce qui est du projet, je fais un peu au fur et à mesure, n'ayant pas eu toutes les informations nécessaires dès le départ.
Je vais essayer d'avancer un peu sur le reste et je ferais un post pour cette autre demande ultérieurement.

Un grand merci pour toute l'aide que vous m'avez apporté,
 

Nylream

XLDnaute Junior
C'est risqué en effet,
Normalement, au fichier actuel, j'aurais la feuille Orders décrite plus haut, et une autre de gestion des time-zone, s'appuyant sur les données pays et time-zone de la feuille membre.
Celle ci ayant pour but de calculer la présence des membres sur certaines tranches horaires.
A ce jour, et à ma connaissance, il n'y a rien d'autre de prévue, mais c'est déjà bien assez pour ma caboche :(
 

job75

XLDnaute Barbatruc
Bonjour Nylream, le forum,

Je parlais d'usine à gaz, vos ComboBox en font partie.

Dans ce fichier (5) elles sont remplacées par des listes de validation, la liste étant créée par :
Code:
Dim d As Object 'variable mémorisée
'--------
Private Sub Worksheet_Deactivate()
If d Is Nothing Then Worksheet_Change [A2] 'lance la macro
With Feuil1 'CodeName
  .[A:A].Delete 'RAZ
  If d.Count = 0 Then Exit Sub
  With .[A1].Resize(d.Count)
    .Value = Application.Transpose(d.keys) 'maximum 65536 lignes
    .Sort .Cells(1), xlAscending, Header:=xlNo
    .Name = "Liste"
  End With
End With
End Sub
J'ai par ailleurs fait quelques modifications, en particulier mis des "noms propres" en colonne A.

Bonne journée.
 

Pièces jointes

  • Test_Tool - v3.0.8.2(5).xlsm
    100.5 KB · Affichages: 33

Nylream

XLDnaute Junior
Bonjour Job75, le forum,

J'imagine que les "combobox" en recherche intuitive sont "lourdes", dans la version du fichier joint dans le post #39 cela permet d'éviter les erreurs de saisie, mais en revanche, cela n'aide aucunement à la recherche.

Le problème c'est que le fichier montera environ à 600 noms.
Pouvoir filtrer avec "ce dont on se souvient" aiderait énormément, surtout avec des noms ayant des origines et orthographes très variés. Rechercher un nom dans une liste, lorsqu'on pas parfaitement certains de l'orthographe peut vite devenir frustrant.
Après, je n'ai trouvé que cette version mais si il existe un moyen plus simple ou plus léger de trouver des noms complexe + éviter toute erreur de saisie, je suis preneur :)

Merci pour votre aide,
 

job75

XLDnaute Barbatruc
Re,

Je ne vois pas ce que vous voulez dire.

Dans les listes de validations triées, même avec 600 noms, trouver un nom est très rapide.

Et pour changer une affectation un Copier/Collage spécial-Valeur est une solution très simple.

Bien sûr ne pas oublier d'effacer la cellule source.

A+
 

Nylream

XLDnaute Junior
Re,

Ce que je veux dire c'est que lorsque la personne rechercher s'appelle par exemple Estor Mc'Neil et que au quotidien vous l'appelez Neil, vous le chercherez un moment sur une liste de 600 noms, et quand c'est répétitif, ça en devient rébarbatif.
Ce qui était parfait avec la saisie intuitive, c'est qu'on pouvait aussi bien saisir Mc, ou Estor ou Neil, peu importe, la liste se réduira toujours très rapidement, et ce après les trois premiers caractères.
En revanche, il est vrai que le copier coller n'était pas aussi facile.

Concrètement, quel est le risque à conserver ce code ? Des lenteurs, ou carrément rendre le fichier inexploitable ?

Pour ce qui est de changer en copier collant, ça ne répond pas au besoin de conserver l'ancienne valeur en mémoire pour auto-compléter un document.

Bonne soirée :)
 

job75

XLDnaute Barbatruc
Re,

En général dans un fichier correct un nom commence par le nom de famille, pas par le prénom.

C'est un nom officiel, à rechercher sans abréviation.

Mais j'avais compris que vous aimez vous compliquer la vie.

Edit : si dans de rares cas le nom n'est pas trouvé aller sur "Members" et touches Ctrl+F.

A+
 
Dernière édition:

Nylream

XLDnaute Junior
Bonjour Job75, le forum,

Si j'étais l'utilisateur final, et si je pouvais modifier / imposer certaines choses, ce serait sans doute mon choix. Le fait est que ce n'est pas moi mais plusieurs personnes, de langues et cultures différentes qui utiliseront ce fichier.
Le fait que la recherche puisse être effectué autrement que par le nom propre répond à un besoin contextuel difficile à expliquer, mais réel.
Ce n'est pas un choix délibérer de ma part.

Pour le moment, l'utilisation de la saisie intuitive semble stable, et répond au besoin qui m'a été exprimé.
 

job75

XLDnaute Barbatruc
Bonsoir Nylream,

Pour les ComboBox vous faites ce que vous voulez puisque vous aimez les usines à gaz.

Pour votre problème de "mémorisation" j'ai créé un historique avec la feuille "POSTING".

Elle est alimentée par cette macro dans ThisWorkbook :
Code:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal r As Range)
If Not Sh.Name Like "*_Dispatch*" Then Exit Sub
Dim nom$, post$, i As Variant, j%
With Feuil10 'CodeName de la feuille POSTING, à adapter
  For Each r In r 'si entrées/effacements multiples
    nom = Application.Trim(r) 'SUPPRESPACE, sécurité
    post = r(2 - r.Row) & " / " & r(1, 2 - r.Column)
    If nom = "" Then 'effacement
      For i = 2 To .UsedRange.Rows.Count
        j = .Cells(i, .Columns.Count).End(xlToLeft).Column 'dernière cellule à droite
        If .Cells(i, j) = post Then
          .Cells(i, j) = ""
          If j = 2 Then .Cells(i, 1) = ""
          Exit For
        End If
      Next i
    Else
      i = Application.Match(nom, .Columns(1), 0)
      If IsError(i) Then i = Application.CountA(.Columns(1)) + 1
      .Cells(i, 1) = nom
      j = .Cells(i, .Columns.Count).End(xlToLeft).Column 'dernière cellule à droite
      If .Cells(i, j) <> post Then .Cells(i, j + 1) = post: .Cells(1, j + 1) = "POSTING " & j
    End If
  Next r
  With .UsedRange
    .WrapText = False
    .Columns.AutoFit 'ajustement largeur
    .Sort .Cells(1), xlAscending, Header:=xlYes 'tri
  End With
End With
End Sub
Par sécurité j'ai ajouté Option Compare Text en haut mais c'est inutile si l'on a bien des "noms propres".

J'ai aussi ajouté dans la Worksheet_Change de "Members" :
Code:
    If CStr(r.Cells(1)) <> Application.Trim(CStr(r.Cells(1))) Then r.Cells(1) = Application.Trim(r.Cells(1)) 'SUPPRESPACE
Fichier (6).

A+
 

Pièces jointes

  • Test_Tool - v3.0.8.2(6).xlsm
    105.4 KB · Affichages: 29

Discussions similaires

Statistiques des forums

Discussions
312 047
Messages
2 084 864
Membres
102 690
dernier inscrit
souleymaane