[VBA]extraire valeur si unique
Répondre à la discussion
Affichage des résultats 1 à 12 sur 12

[VBA]extraire valeur si unique



  1. #1
    -maroon-

    [VBA]extraire valeur si unique


    ------

    Bonjour,
    Le titre n'est pas vraiment correcte ! En fait je n'arrive pas extraire la valeur des différents nombres dans une plage. Je m'explique:
    Si j'ai une colonne contenant les valeurs 1 1 1 4 4 4 4 3 8 8 8 alors j'aimerais avoir le résultat 1 4 3 8 stoker dans 4 variables de tel sorte que je puisse les utiliser.

    Avec la fonction countif j'obtiens le nombre de valeur différente mais moi je veux les valeurs!!

    Merci d'avance si quelqu'un peut m'aider!

    -----

  2. #2
    cherbe

    Re : [VBA]extraire valeur si unique

    Bonjour
    Si les données sont triées, c'est un exercice assez simple mais auparavant, tu es sûr d'avoir 4 valeurs à extraire ou ce nombre est une inconnue ?

  3. #3
    -maroon-

    Re : [VBA]extraire valeur si unique

    Bonjour!
    Non ce nombre n'est pas connu!

    Avec de l'aide j'ai obtenu le code suivant, il copie chaque valeur différente de la colonne 1 dans la colonne 2.

    Code:
    Sub macro4()
    Dim t, i As Integer
    data = Columns(1).SpecialCells(xlConstants)
    t = 1
    For i = 1 To UBound(data, 1)
      If WorksheetFunction.CountIf(Columns(2), data(i, 1)) = 0 Then
       Range("B" & t) = data(i, 1)
         t = t + 1
      End If
    Next
    End Sub
    Mais je n'arrive pas à comprendre comment stocker ces valeurs plutôt que les copier dans la nouvelle colonne. Car je ne veux pas les copier mais les utiliser dans une boucle when ou if je ne sais pas encore!
    J'essaye de comprendre la fonction scipting.dictionary...

  4. #4
    -maroon-

    Re : [VBA]extraire valeur si unique

    Lorsque je déclare la variable "data" le code bug à la ligne Range("B" & t) = data(i, 1). J'ai essayé avec range et string

  5. A voir en vidéo sur Futura
  6. #5
    cherbe

    Re : [VBA]extraire valeur si unique

    Citation Envoyé par -maroon- Voir le message
    Lorsque je déclare la variable "data" le code bug à la ligne Range("B" & t) = data(i, 1). J'ai essayé avec range et string
    Il manque :
    Code:
    Range("B" & t).value = data(i, 1)
    Mais je ne suis pas sûr que Range("B" & t) fonctionne.
    Si ce n'est pas le cas, met ceci :
    Code:
    tmp="B" & t
    Range(tmp).value = data(i, 1)

  7. #6
    cherbe

    Re : [VBA]extraire valeur si unique

    Citation Envoyé par -maroon- Voir le message
    Mais je n'arrive pas à comprendre comment stocker ces valeurs plutôt que les copier dans la nouvelle colonne.
    Il faut créer une variable de type array, c'est à dire un tableau (à une seule colonne).
    Code:
    dim matrice() as integer
    trouver=0
    puis dans la boucle, quand tu veux garder la valeur :
    Code:
    trouver=trouver+1
    redim preserve matrice(trouver)
    matrice(trouver)=data(i, 1)
    A la fin de la macro :
    Code:
    for i = 1 to trouver
       msgbox matrice(i)
    next i

  8. #7
    -maroon-

    Re : [VBA]extraire valeur si unique

    Désolé mais je ne comprends pas! Est-ce que c'est ce code:
    Code:
    Sub mac1()
    Dim t, i As Integer
    Dim matrice() As Integer
    trouver = 0
    Data = Columns(1).SpecialCells(xlConstants)
    t = 1
    For i = 1 To UBound(Data, 1)
      If WorksheetFunction.CountIf(Columns(2), Data(i, 1)) = 0 Then
       Range("B" & t) = Data(i, 1)
         t = t + 1
      End If
    Next
    For i = 1 To trouver
    MsgBox matrice(i)
    Next i
    End Sub
    Je ne veux pas l'afficher dans une msgbox mais pouvoir les utiliser pour autre chose!
    En fait mon but est d'appliquer des instructions sur chaque valeur trouvée et pas de les afficher dans une liste.


    J'ai essayé avec un Scripting.Dictionary :
    Code:
    Private Sub UserForm_Initialize()
      Set f = Sheets("feuil1")
      Set p = Sheets("feuil2")
      Set mondico = CreateObject("Scripting.Dictionary")
      a = f.Range("A2:A" & f.[A65000].End(xlUp).Row)     ' tableau a(n,1) pour rapidité
      For i = LBound(a) To UBound(a)
         If a(i, 1) <> "" Then mondico(a(i, 1)) = ""
        If mondico.keys = p.Range("A & i") Then Range("B & i") = p.Range("B & i")
      Next i
        End Sub
    mais c'est pareil j'arrive pas à manipuler les clé générées... Je m'explique:
    Si la 1ère clé générée correspond à une valeur qui se trouve dans la colonne A par exemple, alors copier sa valeur associée (qui se trouve dans la colonne B) dans la cellule (i,1) d'une autre feuille.

    C'est pourquoi j'ai essayé différents codes comme :

    Code:
     If mondico.keys = p.Range("A & i") Then Range("B & i") = p.Range("B & i")

    mais ça ne fonctionne pas! apparemment je peux pas les utiliser comme ça!

  9. #8
    cherbe

    Re : [VBA]extraire valeur si unique

    Citation Envoyé par -maroon- Voir le message
    Désolé mais je ne comprends pas! Est-ce que c'est ce code:
    Le problème avec toi c'est que tu ne lis que très partiellement les réponses. Dans mon message précédant, je disais que les 3 lignes :
    Code:
    trouver=trouver+1
    redim preserve matrice(trouver)
    matrice(trouver)=data(i, 1)
    devaient être insérées dans la boucle, sous entendu à la place de :
    Code:
    Range("B" & t) = Data(i, 1)
    Ensuite, la boucle avec les msgbox est là à titre didactique pour te montrer comment récupérer les valeurs stockées.

  10. #9
    -maroon-

    Re : [VBA]extraire valeur si unique

    Bon je crois que je ne vais pas y arrivé!
    Oui désolé j'avais pas bien compris!
    Mais au final je ne suis pas sûr que le code correspond à ce que je veux faire. J'ai mis une image pour expliquer parce que c'est compliqué.
    Nom : exemple.jpg
Affichages : 1106
Taille : 51,5 Ko
    Il y a donc une liste de valeurs dans la feuil1 et je crée une liste sans doublon (dans la mémoire vive). Ensuite je compare chaque valeur de la liste sans doublon à celle de la feuil2 et pour chacun deux je récupère la valeur associée et je la copie dans une feuil3 quelconque.


    Est-ce que c'est bien ce que tu as compris? J'ai essayé avec ton aide mais il y a des bug. J'ai essayé aussi avec le dictionnaire mais j'y arrive pas!

    Je regarde encore comment je peux faire mais je crois que j'ai besoin d'aide!

  11. #10
    fregoli

    Re : [VBA]extraire valeur si unique

    Recopie cela dans un module puis fait F5 quand le curseur est dans la sub "copieUnique"

    Code:
    Option Explicit
    
    Dim tRes() As Variant
    
    '
    '   sub créant une table de valeur unique issue de Feuil1
    '
    Public Sub copieUnique()
    Dim I As Integer
    Dim J As Integer
    Dim lu As Variant           ' nb: je mets variant car je ne connais de manière certaine pas le type des données
    Dim trouve As Boolean
    
        ReDim tRes(0)
        I = 1
        lu = Range("Feuil1!A" & Trim(Str(I))).Value
        Do While lu <> ""
            trouve = False
            For J = 1 To UBound(tRes)
                If tRes(J) = lu Then
                    trouve = True
                    Exit For
                End If
            Next J
            If Not trouve Then
                ReDim Preserve tRes(UBound(tRes) + 1)
                tRes(UBound(tRes)) = lu
            End If
            I = I + 1
            lu = Range("Feuil1!A" & Trim(Str(I))).Value
        Loop
        recopieUnique
    End Sub
    
    Private Sub recopieUnique()
    Dim I As Integer
    Dim J As Integer
    Dim lu As Variant
    Dim K As Integer        ' pour écrire dans feuil3
    
        K = 1
        For I = 1 To UBound(tRes)                              ' balayage de toutes les valeurs trouvées dans Feuil1
            J = 1
            lu = Range("Feuil2!A" & Trim(Str(J))).Value
            Do While lu <> tRes(I) And lu <> ""
                J = J + 1
                lu = Range("Feuil2!A" & Trim(Str(J))).Value
            Loop
            If lu = "" Then
                MsgBox "valeur " & tRes(I) & " non trouvée dans Feuil2..."
                End
            End If
            Range("Feuil3!A" & Trim(Str(K))).Value = Range("Feuil2!B" & Trim(Str(J))).Value     ' recopie la valeur de la colonne B correspondante dans la case de feuil3
            K = K + 1
        Next I
    End Sub
    ça doit faire ce que tu expliques.


    quelques explications:

    J'ai supposé que ton tableau dans feuil2 n'était pas forcément trié, et tu peux optimiser la sub "recopieUnique" si c'est bien le cas, mais si peu de valeurs, cela n'a pas un gros intérêt...
    Trim(Str(x)) permet de supprimer le caractères "espace" que str ajoute à gauche du nombre x
    Dernière modification par fregoli ; 09/05/2016 à 11h21. Motif: quelques explications
    Une allumette peut aussi faire déborder le vase...

  12. #11
    fregoli

    Re : [VBA]extraire valeur si unique

    NB: je n'ai pas essayé de corriger ton code car il y a trop d'erreurs.

    Quelques conseils:
    • Ne jamais utiliser de variables avec des types par défaut (ce sera variant qui est toujours consommateur de CPU) et toujours les déclarer soit en global, soit local à une procédure (ou fonction) avec le bon type. Cela oblige à se poser des questions sur les objets qu'on manipule et comment on y accède.
    • vérifier dans l'aide de excel, les types d'objets qu'on utilise (ici tu utilises l'objet Range par exemple) afin de comprendre exactement ce que c'est et quelles en sont les propriétés et méthodes disponibles. Exemple: "Range" est objet qui regroupe un tableau de cellules, et pas un objet qui regroupe un tableau de valeurs, donc pour accéder à la valeur d'un élément, il faut utiliser la méthode "value" de l'objet "Range" indexé.
    • Quand on utilise des objets complexes (ici le dictionary), il faut bien savoir comment on le manipule et comment on accède à ses propriétés ou aux propriétés des objets qu'il inclus, sinon on écrira un code qui au mieux ne fonctionnera jamais, au pire fera n'importe quoi.

    Enfin, cherches sur Internet des cours sur excel, il y en a des très bien faits voir par exemple : http://www.developpez.com/ ou encore http://codes-sources.commentcamarche.net/
    Une allumette peut aussi faire déborder le vase...

  13. #12
    -maroon-

    Re : [VBA]extraire valeur si unique

    Re,

    Merci beaucoup pour cette aide!! Je suis encore entrain de regarder tout ça!
    Effectivement je dois encore bcp lire sur vba donc merci pour les liens! Je vais aussi sur http://forum.excel-pratique.com/excel/

    Merci encore

Discussions similaires

  1. Réponses: 16
    Dernier message: 26/05/2015, 20h17
  2. Réponses: 5
    Dernier message: 28/03/2015, 17h03
  3. suite admettant une unique valeur d'adhérence
    Par art17 dans le forum Mathématiques du supérieur
    Réponses: 2
    Dernier message: 12/06/2011, 21h13
  4. Extraire données d'une valeur BCD
    Par Seitech dans le forum Électronique
    Réponses: 6
    Dernier message: 19/05/2010, 06h40
  5. Unique valeur propre
    Par invite0387e752 dans le forum Mathématiques du supérieur
    Réponses: 2
    Dernier message: 26/04/2008, 17h48