Extraction suivant 3 critères

Bonjour à tous,

J'ai beau chercher sur les forums je ne trouve pas de sujets similaire au mien, je souhaite extraire les cellules sans doublons en fonction de 3 critères .

Ces critères se trouvent dans les A, B et F et je souhaiterais extraire les cellules de la colonne M sans doublons.

j'ai commencé à faire un début de macro, mais sa plante au moment ou il faut coller les résultats

Sub Test()

  Dim Lig     As Long
  Dim Col     As String
  Dim NbrLig  As Long
  Dim NumLig  As Long
  Sheets("feuil2").Activate ' feuille de destination
  ColA = "A" ' colonne données non vides à tester'
  ColB = "B"
  ColC = "F"
  ColM = "M"
  NumLig = 2          'alors là ca doit etre le N° de la 1er ligne de données en comptant la ligne 1 = 0 .... ? '
  With Sheets("feuil1")     ' feuille source'
  NbrLig = .Cells(65536, ColA).End(xlUp).Row
  For Lig = 2 To NbrLig             'n° de la 1ere ligne de données'
    If .Cells(Lig, ColA).Value = "Excel" And .Cells(Lig, ColB).Value = "2017" And .Cells(Lig, ColC).Value = "France" Then
      .Cells(Lig, ColM).Copy
      NumLig = NumLig + 1
      Sheets("feuil2").Cells(NumLig, 1).Insert Shift:=xlDown, Unique:=True 'ici pour insérer ou  .Paste pour coller'
    End If
  Next
  End With

End Sub

Merci à vous

14test.xlsm (15.74 Ko)

Bonjour,

tu ne veux extraire que les données de la colonne M, ou alors les lignes entières? (C'est très clair, mais dans le doute! )

Yann

Bonjour,

Je voudrais extraire que les valeurs de le colonnes M, pour par la suite pouvoir compter le nombre d’occurrence dans la colonne à coté "B" .

Tiens, à tester!

Sub Extraction()

Dim i As Long, j As Long, Nbligne As Long, nbligneSortie As Long, u As Long
Dim tabEntree() As Variant, tabsortie() As Variant

'Critères à faire evoluer en fonction des besoins
Const Crit1 As String = "Excel"
Const Crit2 As Long = 2017
Const Crit3 As String = "France"

'On compte le nombre de lignes sur la feuille 1
Nbligne = ThisWorkbook.Sheets("feuil1").Range("A65536").End(xlUp).Row
'On recupere les data
tabEntree = ThisWorkbook.Sheets("feuil1").Range(Cells(1, 1), Cells(Nbligne, 13)).Value
'On dimmensionne le tableau de sortie
ReDim tabsortie(Nbligne, 0) As Variant

'on va remplir le tableau de sortie
nbligneSortie = 0
'On verifie pour chaques lignes du tableau d'entree
For i = 1 To Nbligne
    'Si les cellules correspondent au criteres
    If tabEntree(i, 1) = Crit1 And tabEntree(i, 2) = Crit2 And tabEntree(i, 6) = Crit3 Then

        'On utilise u comme un capteur de doublon
        u = 0
        'On verifie chaques lignes du tableau de sortie
        For j = 0 To nbligneSortie
        'Si les cellules sont identiques on met u a 1
        If tabEntree(i, 13) = tabsortie(j, 0) Then u = 1: Exit For

        Next j
        'Si u = 0 (donc ce n'est pas un doublon) on copie la valeur sur la derniere ligne de tabsortie et on incrémente le nombre de valeur sur tabsortie
        If u = 0 Then tabsortie(nbligneSortie, 0) = tabEntree(i, 13): nbligneSortie = nbligneSortie + 1

    End If

Next i

'On colle colonne A feuille 2
ThisWorkbook.Sheets("feuil2").Range("A1:A" & nbligneSortie).Value = tabsortie

End Sub

Dit moi ce que ça donne de ton coté!

Bonjour Florian, Yann,

Il y a quand même des solutions plus simples à mettre en oeuvre avec excel, soit le TCD soit le filtre avancé comme ci-dessous

capture d ecran 100
10test.xlsx (11.30 Ko)

Bonjour Steelson!

Haha! J'avoue avoir le problème de penser VBA avant de penser Excel. Je savais même pas qu'on pouvais filtrer de cette manière sur Excel. Sympa comme méthode!

Yann

Hé oui, je l'ai découverte moi-même il n'y a pas très longtemps et je l'utilise pour la gestion des recettes/dépenses

Un truc à savoir : pour sélectionner des cellules vides, mettre '= (égal précédé d'une apostrophe)

On peut aussi mettre plusieurs lignes qui seront prises en charge en alternative (méthode OU)

Sinon, s'il s'agit ensuite de compter, le TCD pourrait être plus approprié.

Merci Yann, sa fonctionne impeccable .

Le TCD dans mon cas n'est pas possible car je vais extraire ces données sur une feuil qui n’existera pas avant l’exécution de la macro .

Merci encore a vous et bonne journée

Après utilisation la macro fonctionne bien, mais si il y a une différence d'écriture par exemple : "Excel" et "excel" il ne considère qu'il n'y a pas de doublons.

Faut t'il transformer la 1 ere lettre en majuscule de toute la colonne "M" pour pallier à ce problème ou y a t-il un autre moyen ?

Merci à vous

Bonjour,

De tète, la colonne qui contiens les "Excel" est la colonne 2.

Il faut que dans ton tableau les "Excel" soient tous écris de la même manière.

Tu as combien de ligne?

Actuellement 1450 mais s'est un fichier qui est alimenté tous les jours donc il pourra y avoir plus de lignes au fur à mesure des jours .

Ok!

Englobe la comparaison de tabentree(x,x) et de crit1 et crit3 avec Ucase(x) comme suis :

Ucase(tabentree(i,1)) = Ucase(crit1)

Etc..

Inutile de le faire pour le Crit2 et son élément de comparaison, ce sont des nombres!

ça devrait tourner correctement!

Merci pour ta réponse,

J'ai rentré le code comme ceci mais il fait toujours la différence:

Tu m'as fait un copier coller de ma ligne exemple pour le crit1. Sauf que tu l'as aussi copiée pour le crit3. ça ne devrais même plus fonctionner correctement la du coup.

 If tabEntree(i, 1) = Crit1 And tabEntree(i, 2) = Crit2 And tabEntree(i, 6) = Crit3 Then

A transformer en:

 If Ucase(tabEntree(i, 1)) = Ucase(Crit1) And tabEntree(i, 2) = Crit2 And Ucase(tabEntree(i, 6)) = Ucase(Crit3) Then

Désolé j'ai pas fait attention,

Merci à toi de ton aide, du coup je l'ai appliqué aussi à le colonne "M", voici le code:

Sub Extraction()

Dim i As Long, j As Long, Nbligne As Long, nbligneSortie As Long, u As Long
Dim tabEntree() As Variant, tabsortie() As Variant

'Critères à faire evoluer en fonction des besoins
Const Crit1 As String = "Excel"
Const Crit2 As Long = 2017
Const Crit3 As String = "France"

Worksheets(1).Activate
'On compte le nombre de lignes sur la feuille 1
Nbligne = ThisWorkbook.Sheets(1).Range("A65536").End(xlUp).Row
'On recupere les data
tabEntree = ThisWorkbook.Sheets(1).Range(Cells(1, 1), Cells(Nbligne, 13)).Value
'On dimmensionne le tableau de sortie
ReDim tabsortie(Nbligne, 0) As Variant

'on va remplir le tableau de sortie
nbligneSortie = 0
'On verifie pour chaques lignes du tableau d'entree
For i = 1 To Nbligne
    'Si les cellules correspondent au criteres
    If UCase(tabEntree(i, 1)) = UCase(Crit1) And tabEntree(i, 2) = Crit2 And UCase(tabEntree(i, 6)) = UCase(Crit3) Then

        'On utilise u comme un capteur de doublon
       u = 0
        'On verifie chaques lignes du tableau de sortie
       For j = 0 To nbligneSortie
        'Si les cellules sont identiques on met u a 1
       If UCase(tabEntree(i, 13)) = UCase(tabsortie(j, 0)) Then u = 1: Exit For

        Next j
        'Si u = 0 (donc ce n'est pas un doublon) on copie la valeur sur la derniere ligne de tabsortie et on incrémente le nombre de valeur sur tabsortie
       If u = 0 Then tabsortie(nbligneSortie, 0) = tabEntree(i, 13): nbligneSortie = nbligneSortie + 1

    End If

Next i

'On colle colonne A feuille 2
ThisWorkbook.Sheets("sept17").Range("B6:B" & nbligneSortie + 5).Value = tabsortie
Sheets("sept17").Range("C6:C" & nbligneSortie + 5).FormulaR1C1 = "=IF(RC[-1]="""","""",SUMPRODUCT((Date=R1C8)*(Pro=R3C8)*(TypeM=R2C8)*(Imp=RC2)*(Imp<>""APP"")))"
Sheets("sept17").Range("A6:A" & nbligneSortie + 5).FormulaR1C1 = "=IF(RC[1]="""","""",RANK(RC[3],R6C4:R90C4))"
Sheets("Prto Roma sept17").Range("I6:I" & nbligneSortie + 5).FormulaR1C1 = "=IF(RC[-7]="""","""",SUMPRODUCT((Date=R1C8)*(Pro=R3C8)*(TypeM=R2C8)*(Imp=RC2)*(nb<1000)*(Imp<>""APP"")))"
Sheets("sept17").Range("L6:L" & nbligneSortie + 5).FormulaR1C1 = "=IF(RC[-10]="""","""",IF((VLOOKUP(RC[-1],R6C1:R90C9,2,FALSE))=""NFF"","""",VLOOKUP(RC[-1],R6C1:R90C3,2,FALSE)))"
Sheets("sept17").Range("M6:M" & nbligneSortie + 5).FormulaR1C1 = "=IF(RC[-1]="""","""",IF((VLOOKUP(RC[-1],R6C2:R90C9,5,FALSE))="""","""",(VLOOKUP(RC[-1],R6C2:R90C9,5,FALSE))))"
Sheets("sept17").Range("N6:N" & nbligneSortie + 5).FormulaR1C1 = "=IF(RC[-2]="""","""",IF((VLOOKUP(RC[-2],R6C2:R90C9,6,FALSE))="""","""",(VLOOKUP(RC[-2],R6C2:R90C9,6,FALSE))))"
End Sub

Ok. Et alors ça fonctionne comme tu le voulais?

Oui sa fonctionne très bien, j'ai rajouter des lignes de codes a la fin de ton code afin de rajouter des formules seulement au lignes non vides.

C'est pas très classe à regarder mais sa fonctionne.

Merci à toi

Rechercher des sujets similaires à "extraction suivant criteres"