Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

valeur proche dans ligne

sri75

XLDnaute Occasionnel
Bonjour, j'ai un tableau excel avec plus de 100 ligne et je cherche une macro pour recherche une valeur proche dans chaque ligne.

dans mon exemple j'ai en A10 la valeur 2.8 et je recherche la valeur la plus proche sur chaque ligne de mon classeur.

Quand le trouve la valeur la plus proche, je mets la cellule en rouge.

En fouillant dans les fils j'ai trouvé quelques modèles mais malheureusement je n'arrive pas à les adapter; merci à tous pour votre aide et suggestions.

Bonne journée

Stephane
 

Pièces jointes

  • valeur proche.xls
    27.5 KB · Affichages: 31
  • valeur proche.xls
    27.5 KB · Affichages: 38

Robert

XLDnaute Barbatruc
Repose en paix
Re : valeur proche dans ligne

Bonjour le fil, bonjour le forum,

En pièce jointe la V3 à laquelle il ne manque que la fourchette.


Si j'ai bien compris, tu ne voudras plus la valeur proche mais les valeurs comprises dans la fourchette ?
 

Pièces jointes

  • Sri_v03.xls
    41 KB · Affichages: 31
  • Sri_v03.xls
    41 KB · Affichages: 31

sri75

XLDnaute Occasionnel
Re : valeur proche dans ligne

Merci ça fonctionne parfaitement.

ce que je cherche est la valeur la plus proche dans une fourchette.

par exemple je cherche 30 avec une fourchette de + ou - 10

en dessous de 20 ou au delà de 40 il ne trouve rien

Entre 20 et 40 il signale la valeur la plus proche.

la difficulté est de mettre en variable la fourchette.

Merci
 

CISCO

XLDnaute Barbatruc
Re : valeur proche dans ligne

Bonjour à tous, bonjour Robert

En reprenant le code proposé par Robert. Cela semble fonctionner, sauf que cela met en évidence 3,3 lorsqu'on choisit 3 dans A10. Normalement, le test 3,3 <3,3 devraient renvoyer FAUX, et les cellules contenant 3,3 ne devrait pas être mise en évidence.

@ plus
 

Pièces jointes

  • Sri_v03modifié.xls
    59 KB · Affichages: 18

sri75

XLDnaute Occasionnel
Re : valeur proche dans ligne


Bonjour, ce ne me choque pas puisque l'on recherche une valeur approchante. Sur la ligne 2; 3,3 est bien la valeur la plus proche de 3.

je ne vois pas la différence dans la version corrigée; 3,3 reste sélectionné.

A+
 

CISCO

XLDnaute Barbatruc
Re : valeur proche dans ligne

Bonjour

Bonjour,

je ne vois pas la différence dans la version corrigée; 3,3 reste sélectionné.

A+
Dans le code de Robert, j'ai :
* mis un A10 à la place d'un A1
* mis un test pour ne pas prendre en compte les valeurs en dehors de la fourchette ]0,9*valeur ; valeur*1,1[
* et une ou deux lignes en plus pour que cela tourne

et effectivement, 3,3 ne devrait pas être sélectionné lorsque la valeur est 3.
@ plus
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : valeur proche dans ligne

Re,

Heu... Une valeur proche d'une fourchette, ça me parait un peu farfelu... Je te propose donc, dans la v04, les valeurs à l'intérieur de la fourchette.

Le code :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim LD As Byte 'déclare la variable LD (Ligne du Début)
Dim TV As Variant 'déclare la variable TV (Tavleu des valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Byte 'déclare la variable J (incrément)
Dim TD() As Variant 'déclare la variable TD (Tableau des Différences)
Dim TA() As Variant 'déclare la variable TA (Tableau des Adresses)
Dim K As Integer 'déclare la variable I (Incrément)
Dim F As Variant 'déclare la variable F (Fourchette)
Dim VFI As Double 'déclare la variable VFI (Valeur Fourchette Inférieure)
Dim VFS As Double 'déclare la variable VFS (Valeur Fourchette Supérieure)

Cells.Interior.ColorIndex = xlNone 'enleve les éventuelles couleurs
LD = Range("A4").Value 'définit la ligne du début LD
If Target.Address <> "$A$1" Then Exit Sub 'si le changement a lieu ailleurs qu'en A10, sort de la procédure
If Target.Value = "" Then Application.Union(Range("D1"), Range("F1")).ClearContents: Exit Sub 'si A10 est effacée, efface D1, F1 et sort de la procédure
F = Application.InputBox("Indiquez la valeur de la fouchette !", "VALEUR", Type:=1) 'définit la boîte d'entrée F
If F = False Then Application.Union(Range("D1"), Range("F1")).ClearContents: Exit Sub ''si bouton "Annuler", efface D1, F1 et sort de la procédures
VFI = Target.Value - F 'définit la valeur de la fourchette inférieure VFI
VFS = Target.Value + F 'définit la valeur de la fourchette supérieure VFI
MsgBox "La fouchette est  de " & VFI & " à " & VFS
Range("D1") = VFI 'renvoie la valeur de la fouchette inférieure en D1
Range("F1") = VFS 'renvoie la valeur de la fouchette supérieure en F1
TV = Range("C" & LD).CurrentRegion 'définit le tableau des valeurs TV
For I = 2 To UBound(TV, 1) 'boucle 1 : sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
  K = 0: Erase TA: 'initialise K, vide le tableau TA
    For J = 2 To UBound(TV, 2) 'boucle 2 : sur toutes les colonnes J du tableau des valeurs TV (en partant de la seconde)
        If IsNumeric(TV(I, J)) Then 'condition 1 : si TV(I,J) est une valeur numérique
            If TV(I, J) >= VFI And TV(I, J) <= VFS Then 'condition 2 : si TV(I,J) est compris dans la fourchette
                ReDim Preserve TA(1, K) 'redimensionne le tableau des adresses TA (à deux entrées)
                TA(0, K) = I + LD - 1 'récupère la ligne du tableau des valeurs TV
                TA(1, K) = J + 2 'récupère la colonne (plus deux) du tableau des valeurs TV
                K = K + 1 'incrémente K
            End If 'fin de la condition 2
        End If 'fin de la condition 1
    Next J 'prochaine colonne de la boucle 2
    If K > 0 Then 'condition : si K est supérieur à zéro
        For K = 0 To UBound(TA, 2) 'boucle sur toutes les différences u tableau TD
            'si la valeur TD(K) est égale à la valeur minimale des valeurs de ce tableau, colore la cellule correspondante de rouge
            Cells(TA(0, K), TA(1, K)).Interior.ColorIndex = 3
        Next K 'prochaine différence de la boucle
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle 1
End Sub

le fichier :
 

Pièces jointes

  • Sri_v04.xls
    46.5 KB · Affichages: 16

sri75

XLDnaute Occasionnel
Re : valeur proche dans ligne

Merci c'est ce que je recherchais.

J'ai voulu adapter la macro de la façon suivante :

J'ai enlevé la référence de colonne de départ tout se faisant maintenant en C1 et j'ai enlevé la ligne de code qui inscrivait les valeurs de la plage en D1 et F1. ( voir fichier joint )

Depuis j'ai un bug , la macro sélectionne des zones alphabétiques.

merci de m'indiquer les corrections à faire.

Après ça ce sera exactement ce que j'attendais.

Merci beaucoup
 

Pièces jointes

  • Sri_v04 bis.xls
    39.5 KB · Affichages: 17

CISCO

XLDnaute Barbatruc
Re : valeur proche dans ligne

Bonjour à tous

Robert, il y a une petite faute de frappe là
If Target.Address <> "$A$1" Then Exit Sub 'si le changement a lieu ailleurs qu'en A10

@ plus
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : valeur proche dans ligne

Re,

Tu as juste oublié de modifier la ligne :

Code:
TA(0, K) = I + LD - 1 'récupère la ligne du tableau des valeurs TV
par :
Code:
TA(0, K) = I 'récupère la ligne du tableau des valeurs TV

Le code complet :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim TV As Variant 'déclare la variable TV (Tavleu des valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Byte 'déclare la variable J (incrément)
Dim TD() As Variant 'déclare la variable TD (Tableau des Différences)
Dim TA() As Variant 'déclare la variable TA (Tableau des Adresses)
Dim K As Integer 'déclare la variable I (Incrément)
Dim F As Variant 'déclare la variable F (Fourchette)
Dim VFI As Double 'déclare la variable VFI (Valeur Fourchette Inférieure)
Dim VFS As Double 'déclare la variable VFS (Valeur Fourchette Supérieure)

Cells.Interior.ColorIndex = xlNone 'enleve les éventuelles couleurs
If Target.Address <> "$A$1" Then Exit Sub 'si le changement a lieu ailleurs qu'en A10, sort de la procédure
If Target.Value = "" Then Exit Sub 'si A10 est effacée, efface D1, F1 et sort de la procédure
F = Application.InputBox("Indiquez la valeur de la fouchette !", "VALEUR", Type:=1) 'définit la boîte d'entrée F
If F = False Then Exit Sub ''si bouton "Annuler", efface D1, F1 et sort de la procédures
VFI = Target.Value - F 'définit la valeur de la fourchette inférieure VFI
VFS = Target.Value + F 'définit la valeur de la fourchette supérieure VFI
TV = Range("C1").CurrentRegion 'définit le tableau des valeurs TV
For I = 2 To UBound(TV, 1) 'boucle 1 : sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
  K = 0: Erase TA: 'initialise K, vide le tableau TA
    For J = 2 To UBound(TV, 2) 'boucle 2 : sur toutes les colonnes J du tableau des valeurs TV (en partant de la seconde)
        If IsNumeric(TV(I, J)) Then 'condition 1 : si TV(I,J) est une valeur numérique
            If TV(I, J) >= VFI And TV(I, J) <= VFS Then 'condition 2 : si TV(I,J) est compris dans la fourchette
                ReDim Preserve TA(1, K) 'redimensionne le tableau des adresses TA (à deux entrées)
                TA(0, K) = I 'récupère la ligne du tableau des valeurs TV
                TA(1, K) = J + 2 'récupère la colonne (plus deux) du tableau des valeurs TV
                K = K + 1 'incrémente K
            End If 'fin de la condition 2
        End If 'fin de la condition 1
    Next J 'prochaine colonne de la boucle 2
    If K > 0 Then 'condition : si K est supérieur à zéro
        For K = 0 To UBound(TA, 2) 'boucle sur toutes les différences u tableau TD
            'si la valeur TD(K) est égale à la valeur minimale des valeurs de ce tableau, colore la cellule correspondante de rouge
            Cells(TA(0, K), TA(1, K)).Interior.ColorIndex = 3
        Next K 'prochaine différence de la boucle
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle 1
End Sub

Je ne comprends pas pourquoi tu nous a pris la tête avec la valeur en A4 du début du tableau pour finalement laisser tomber...

La v05 :

[Édition]
@Cisco
Oui tu as raison mais ce n'est pas bien grave car la faute est dans le commentaire et pas dans le code car c'est bien de A1 qu'il s'agit...
 

Pièces jointes

  • Sri_v05.xls
    39.5 KB · Affichages: 20
Dernière édition:

sri75

XLDnaute Occasionnel
Re : valeur proche dans ligne

Merci beaucoup, ça fonctionne nickel.

Pour la valeur en A4 c'était au cas où il ne serait pas possible de gérer le non numérique, mon tableau ayant des identifiants alphabétiques dans les premières colonnes. j'aurais gardé ces colonnes à titre d'identification, puis inséré une colonne vierge pour séparer mes plages alpha et numériques.

Comme vous avez été très performants vous avez géré les cas au delà de mes espérances.

Merci beaucoup à tous pour votre aide précieuse sans laquelle je n'y serais pas arrivé.

Bonne journée
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…