Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.
  • Initiateur de la discussion Initiateur de la discussion JJ1
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

J

JJ1

Guest
Bonjour,

J'ai tenté de faire une MFC pour colorier des nombres en décalage de + ou - 1 ligne (au moins 2 fois ou plus) mais la fonction ne me permettait que de faire les permutations de 2 nombres (mon tableau est grand, de Z8 à BY70 ) et ce n'est pas possible.
Est-il possible de le réaliser via une fonction personnalisée? j'ai mis plusieurs couleurs dans l'exemple mais une couleur suffit.
Merci à vous.

Je vous souhaite un joyeux réveillon de Noël à tous.
 

Pièces jointes

Dernière modification par un modérateur:
Re : MFC decaler()-

Bonjour Roger, le Forum,

Merci pour ce code qui fonctionne bien dans l'exemple joint.
Quand je l'applique, j'ai 'incompatibilité de type' je ne vois pas où est l'erreur, ce sont des nombres?

ps: où se trouve dans le code le nombre de fois où se trouve le décalage (si je veux mettre au moins 2 fois par exemple?)
merci


BON NOEL !
 

Pièces jointes

  • S6.zip
    S6.zip
    36.6 KB · Affichages: 33
Re : MFC decaler()-

Re...


Cas typique de problème posé sans rapport avec le problème à résoudre :
Vous demandez de traiter un tableau contenant soit des cellules vides, soit des cellules au contenu numérique, à l'exclusion de tout autre type de contenu.
Ce qui est fait.

Dans le nouveau problème que vous posez, il s'agit de traiter un tableau ne contenant aucune cellule vide. Il est raisonnablement probable que la procédure qui répond au premier problème ne réponde pas au second.

Pourquoi ne pas avoir posé le véritable problème à résoudre d'entrée de jeu ?

Je proposerai sous peu une procédure permettant de traiter un tableau contenant :
  1. des cellules vides ;
  2. des chaînes de longueur nulle ;
  3. des chaines de caractères de longueur non nulle à contenu quelconque ;
  4. des chaines de caractères de longueur non nulle à contenu exclusivement numérique ;
  5. des nombres ;
  6. rien d'autre.

Si, par hasard, le tableau à traiter devait contenir d'autres types de données, merci de le faire savoir.

À propos de ceci :​
(...) où se trouve dans le code le nombre de fois où se trouve le décalage (si je veux mettre au moins 2 fois par exemple?) (...)
Le réglage se fait ici :​
Code:
        If UBound(z(i)) > 0 Then
Si l'on veut repérer les cas comportant au moins N occurrences, il faut remplacer 0 par N-2.​


À bientôt pour la suite...


ROGER2327
#6329


Mercredi 25 Sable 140 (Nativité d’Archæoptéryx - fête Suprême Tierce)
5 Nivôse An CCXXI, 7,4408h - chien
2012-W52-2T17:51:29Z
 
Re : MFC decaler()-

Suite...


Nouvelle version du code légèrement modifié. Voyez si c'est plus convenable...​


Bonne nuit.


ROGER2327
#6330


Mercredi 25 Sable 140 (Nativité d’Archæoptéryx - fête Suprême Tierce)
5 Nivôse An CCXXI, 9,2286h - chien
2012-W52-2T22:08:55Z
 

Pièces jointes

Re : MFC decaler()-

Bonjour JJ, Roger, le forum,

La macro de mon post #5 ne valait pas grand'chose, j'annule ce post.

Voici une fonction macro, rapide car elle utilise l'objet Dictionary et un tableau VBA :

Code:
Function MFC(cel As Range, plage As Range) As Boolean
If Not IsNumeric(CStr(cel)) Then Exit Function
Dim n1#, lig&, tablo, u1&, u2%, lig1&, lig2&, d As Object
Dim i&, k%, n2#, t$, flag As Boolean, j&
n1 = CDbl(cel)
lig = cel.Row - plage.Row + 1
tablo = plage 'matrice plus rapide
u1 = UBound(tablo)
u2 = UBound(tablo, 2)
lig1 = IIf(lig = 1, 2, lig - 1)
lig2 = lig1 + IIf(lig = 1 Or lig = u1, 0, 2)
'---création de Dictionary---
Set d = CreateObject("Scripting.Dictionary")
For i = lig1 To lig2 Step 2
  For k = 1 To u2
    If IsNumeric(CStr(tablo(i, k))) Then
      n2 = CDbl(tablo(i, k))
      t = Application.Min(n1, n2) & " " & Application.Max(n1, n2)
      d(t) = t
    End If
  Next
Next
'---test avec Dictionary---
For i = 1 To u1
  If i <> lig Then
    flag = False
    For k = 1 To u2
      If IsNumeric(CStr(tablo(i, k))) Then
        If CDbl(tablo(i, k)) = n1 Then flag = True: Exit For
      End If
    Next
    If flag Then
      lig1 = IIf(i = 1, 2, i - 1)
      lig2 = lig1 + IIf(i = 1 Or i = u1, 0, 2)
      For j = lig1 To lig2 Step 2
        For k = 1 To u2
          If IsNumeric(CStr(tablo(j, k))) Then
            n2 = CDbl(tablo(j, k))
            t = Application.Min(n1, n2) & " " & Application.Max(n1, n2)
            If d.Exists(d(t)) Then MFC = True: Exit Function
          End If
        Next
      Next
    End If
  End If
Next
End Function
Bien entendu cette fonction est utilisée par la MFC.

Fichiers joints.

Notez que sur le gros fichier tous les nombres sont colorés sauf 33 en AG71...

A+
 

Pièces jointes

Dernière édition:
Re : MFC decaler()-

Re,

Si l'on veut colorer par un bouton, utiliser cette macro :

Code:
Sub Colorer()
Dim plage As Range, c As Range, test As Boolean
Set plage = [Z8:AE25]
plage.Interior.ColorIndex = 20 'bleu
For Each c In plage
  test = MFC(c, plage)
  If test Then c.Interior.ColorIndex = 6
Next
End Sub
Fichiers joints.

A+
 

Pièces jointes

Dernière édition:
Re : MFC decaler()-

Bonjour le fil, le forum,

J'utilisais les variables n1 et n2 As Double.

Il vaut mieux travailler sur des String c'est plus rapide.

Par ailleurs ce calcul était tout à fait inutile :

Code:
t = Application.Min(n1, n2) & " " & Application.Max(n1, n2)
Sur le gros fichier la MFC se recalcule en 0,20 s au lieu de 0,30 s précédemment.

Fichiers (2).

A+
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

Réponses
2
Affichages
166
Réponses
7
Affichages
299
Réponses
13
Affichages
420
Réponses
5
Affichages
665
W
Réponses
34
Affichages
2 K
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…