IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

test addition par rapport à la première valeur


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Mars 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 120
    Par défaut test addition par rapport à la première valeur
    Bonjour j'ai un petit soucis pour compléter mon code.

    J'aimerais réaliser un test qui détecte un écart de '1' entre deux valeurs de ma colonne, voici un exemple concret

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Donnée	Intensité
    2	4
    4	100
    8	2
    9	3	
    10	4
    11	5
    22	1
    Si l'utilisateur rentre un seuil de 1%, seul les valeurs ayant un écart de 1 seront conservé et ayant un seuil supérieur à l'intensité et ayant une précision de + ou - "precision".
    Les données deviendront:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    8	2    A
    9	3    A+1		
    10	4    A+2	
    11	5    A+3
    Si l'utilisateur rentre un seuil de 6%, seul les valeurs ayant un écart de 1 seront conservé et ayant un seuil supérieur à l'intensité et ayant une précision de + ou - "precision".

    Les données deviendront:

    Voici mon début de code que je n'arrive pas à compléter (je suis néophyte...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    Dim i As Integer
    Dim addition as double
    dim derniereligne as integer
    dim precision as double
    dim n as double
    dim seuil as integer
    dim intensite as double
     
     
     
    derniereligne = Sheets("Feuil1").Range("A65536").End(xlUp).Row '- 2
    addition=1
    precision=(n*addition)/100
    intensite=Sheets("Feuil").Cells(j,4)
    seuil=val(UserForm1.TextBox5.Value)
     
     
    for i=2 to derniereligne
    n=textbox1.value
    if cells(i,1).value+addition<cells(i+1,1).value+precision and cells(i,1).value+addition>cells(i+1,1).value-precision then
    			stocker les données
    	else if continuer
    	end if		
     
    	For j = i + 1 To derniereligne
            If intensite >= seuil Then
    			garder la valeur
    		else supprimer la valeur
    	next j		
    next i
    Merci par avance

  2. #2
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    Bonjour,
    Que veux tu faire des valeur trouevé (écart de 1 en tenant compte de la précision)? les copier? , les garder mais supprimer les autre?

    essaye ceci, je supprime directement les valeur qui ne corespondent pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    derniereligne = Sheets("Feuil1").Range("A65536").End(xlUp).Row '- 2
    addition = 1
     n = TextBox1.Value 'il faut donner une valeur a n avant de l'utiliser
    precision = (n * addition) / 100
     
    seuil = Val(UserForm1.TextBox5.Value)
     
     
    For i = 2 To derniereligne
     
        If Cells(i, 1).Value + addition < Cells(i + 1, 1).Value + precision And Cells(i, 1).Value + addition > Cells(i + 1, 1).Value - precision Then
         If intensite > seuil Then
            Rows(i).Delete
        End If  
       i=i+1
        Else
            Rows(i).Delete
        End If
    intensite = Sheets("Feuil").Cells(i, 4) 
        If intensite > seuil Then
            Rows(i).Delete
        End If
    Next i

  3. #3
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Mars 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 120
    Par défaut
    Bonjour, bonjour, je souhaiterais conserver les valeurs qui corresponde en écrivant à la colonne 6 (cells(i,6)) A pour la première valeur, A+1 pour la deuxième etc etc

    Comme ceci.

    8 A
    9 A+1
    10 A+2
    17 A
    18 A+1

    Merci

  4. #4
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    Bon j'ai une version pas très jolie qui fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    Dim i As Integer
    Dim addition As Double
    Dim derniereligne As Integer
    Dim precision As Double
    Dim n As Double
    Dim seuil As Integer
    Dim intensite As Double
     
     Dim na  As Integer
     
    derniereligne = Range("A65536").End(xlUp).Row '- 2
    addition = 1
    n = TextBox1.Value
    precision = (n * addition) / 100
    seuil = Val(UserForm1.TextBox5.Value)
     
     
     
    na = 0
    For i = 2 To derniereligne
    '   n = TextBox1.Value
        If Cells(i, 1).Value + addition < Cells(i + 1, 1).Value + precision And Cells(i, 1).Value + addition > Cells(i + 1, 1).Value - precision Then
            If na = 0 Then
                Cells(i, 6) = "A"
            Else
               Cells(i, 6) = "A+" & na
            End If
            na = na + 1
            i = i + 1
            Cells(i, 6) = "A+" & na
            na=na+1
        Else
            Rows(i).Delete
            If i <> derniereligne Then
            i = i - 1
            End If
        End If
        If Cells(i, 2) > seuil Then
            Rows(i).Delete
        End If
    Next i
    Si personne ne fait mieux j'essayerais de faire quelque chose de mieu ce week end

    edit : comme la dit ucfoutu il fadrait le parcourir a l'envers pour éviter les bidouille i=i-1

  5. #5
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Mars 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 120
    Par défaut
    Euh oui en effet, cette version bug en fait je n'arrive pas à l'arrêter
    Si quelqu'un à une autre soluce ça serait chouette.

    Merci

  6. #6
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    Effectivement. Ca pose vraiment bcp de problème de le faire dans ce sens Va faloir le parcourir a l'envers

    Edit : question tu veux dabord tester les différence ou dabord tester le seuil?

    avec un seuil de 2
    2 3
    3 1
    dans le premier cas on a
    3 1
    dans le deuxième rien

  7. #7
    Membre Expert
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Par défaut
    Bonjour à tous,

    personnellement je n'ai rien compris, car dans les données exemples
    les valeurs de la colonne Données et les Valeurs de la colonne Intensité repondent aux critères; en clair quelle colonne faut-il tester ?

    Faut-il récupérer les lignes pour lesquelles on-seulement l'intensité correpond au critère du seuil et pour lesquelles les valeurs en colonne Données sont successives ?
    D'après ce que je comprends la première ligne (données=2, Intensité=4) n'est pas prise en raison de l'écart avec la ligne suivante.
    C'est ça ?

    bon, je considère qu'il faut tester la colonne intensité et ne prendre que les lignes dont les données sont successives.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    FirstLigne=0 'Sert à conserver la dernière ligne correspondante
     
    For i=2 To DerniereLigne
      if cells(i,2)*(1+precision)=intensite or cells(i,2)*(1-precision)=intensite Then
         if firstLigne=0 then 
               FirstLigne=i
         else
            if cells(i,1)-cells(firstligne,1)=i-firstligne then
               cells(firstligne,6)="A"
                cells(i,6)="A+" & i-firstligne
            else
                firstligne=0
            endif 
         endif
      else
        firstLigne=0
      Endif
    Next

  8. #8
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    Merci ucfoutu c'était juste que j'avais un peu la flemme de revoir le test du coup ca ma fait perdre plus de temps quautre chose

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    Dim i As Integer
    Dim addition As Double
    Dim derniereligne As Integer
    Dim precision As Double
    Dim n As Double
    Dim seuil As Integer
    Dim intensite As Double
     
     Dim na  As Integer
     
    derniereligne = Range("A65536").End(xlUp).Row '- 2
    addition = 1
    n = TextBox1.Value
    precision = (n * addition) / 100
    seuil = Val(UserForm1.TextBox5.Value)
     
    'on supprime ceux qui n'atteigne pas le seuil
    For i = derniereligne To 3 Step -1
        If Cells(i, 2) > seuil Then
            Rows(i).Delete
        End If
    Next i
     
    'on teste les ecart avecv le précédent et le suivant
    For i = derniereligne To 3 Step -1
        If Cells(i, 1) - addition < Cells(i - 1, 1) + precision And Cells(i, 1) - addition > Cells(i - 1, 1) - precision _
        Or Cells(i, 1) + addition < Cells(i + 1, 1) + precision And Cells(i, 1) + addition > Cells(i + 1, 1) - precision Then
        Else
            Rows(i).Delete
        End If
    Next i
     
    'on met les A+
    derniereligne = Range("A65536").End(xlUp).Row
    For i = 2 To derniereligne
    If na = 0 Then
        Cells(i, 6) = "A"
    Else
       Cells(i, 6) = "A+" & na
    End If
    na = na + 1
    Next i
    Si tu veu tester l'écart entre les valeur avant de supprimer les données qui n'atteigne pas le seuil inverse les deux première boucle fo

  9. #9
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Mars 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 120
    Par défaut
    Euh merci merci pour vos réponses.

    Pour répondre à Ilank il faut en effet conserver uniquement les données supérieur au seuil et qui ont des données qui se suivent.
    Celles qui se suive doivent être identifié (la premiere par "A", la seconde "A+1" etc etc).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Données    Intensité
    11		5
    12		1	
    13		12
    17		1
    19		9
    21		5
    22		88
    Doit devenir à condition que l'intensité soit supérieur au seuil ( tout ce qui est inférieur au seuil on peut le supprimer)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Données		Intensité
    11		5		A
    12		1		A+1
    13		12		A+2
    21		5		A
    22		88		A+1
    Voilà voilà, j'ai essayé vos deux codes mais ça n'a pas l'air de fonctionner.


    Le dernier programme me supprime toutes les valeurs et n'en conservent aucune

  10. #10
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonjour,

    Ce que je ferais :

    1) trier le tableau (sur colonne "Donnée") par ordre croissant
    2) une boucle For de la dernière ligne vers la 1ère (step - 1) pour éviter les croche-pieds au Delete et :
    - faire mes tests entre les valeurs de la ligne i et celles de la ligne i-1 en vue de décider de la suppression ou non

  11. #11
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Citation Envoyé par ucfoutu Voir le message
    Bonjour,

    Ce que je ferais :

    1) trier le tableau (sur colonne "Donnée") par ordre croissant
    2) une boucle For de la dernière ligne vers la 1ère (step - 1) pour éviter les croche-pieds au Delete et :
    - faire mes tests entre les valeurs de la ligne i et celles de la ligne i-1 en vue de décider de la suppression ou non
    Ben oui... qu'il faut le trier...

  12. #12
    Membre Expert
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Par défaut
    Bonsoir,

    essaie en remplaçant cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If IsEmpty(.Cells(i, 3)) Then
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Len(.Cells(i, 3))=0 Then

  13. #13
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Mars 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 120
    Par défaut
    Euh non plus, je n'ai pas de suppression de ligne lorsque la valeur du textbox2 (seuil) est supérieur à la colonne 2 (intensité)

  14. #14
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 122
    Par défaut
    Salut
    Pour ce qui est du tri, je pense que c'est en effet incontournable.
    Mais il te faut travailler le fond avant la forme a mon avis, il reste toujours des points d'ombre, lié a la logic que tu souhaite mettre en place.

    Le fait de vouloir comparer chaque valeurs va poser problème rapidement, en effet, imagines une liste ou toutes les valeur tiennent dans le même écart sauf une! On pourrait se dire ben c simple, on la vire! Sauf que ca tu le fais avec ton cerveau et que reproduire ca c pas simple a mon avis.
    Il suffit que cette valeurs discordante se trouve en fin de liste et tu va supprimer toutes tes autre valeur une a une!!

    Ha mon sens les façons de t'en tirer sont
    soit de donner toi même les bornes a respecter pour l'écart (entre 5,6 et 12,2 par exemple)
    soit faire une moyenne de toutes les valeurs et faire jouer le % d'écart sur cette valeur comparait aux autres
    soit comparait avec les valeur précédente suivante a chaque fois, mais bon la encore beaucoup de valeur vont passer a la trappe.

    Essaies de vraiment définir la politique que tu veux mettre en place.

    A++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Activer un Select par rapport a la valeur d'un autre select.
    Par bullrot dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 12/11/2008, 13h17
  2. [MySQL] Requête de sélection par rapport à la première lettre d'un champ
    Par herve911 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 18/01/2008, 01h31
  3. Réponses: 8
    Dernier message: 23/11/2007, 17h46
  4. Afficher une valeur par rapport à une autre valeur
    Par alexiisme dans le forum Modélisation
    Réponses: 5
    Dernier message: 24/08/2007, 12h43
  5. [JSTL] Test dynamique par rapport à un paramètre
    Par cosmos38240 dans le forum Taglibs
    Réponses: 3
    Dernier message: 21/12/2005, 20h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo