[RESOLU] Formule pour Première ligne d'une zone avec 2 critères

  • Initiateur de la discussion Compte Supprimé 979
  • Date de début
C

Compte Supprimé 979

Guest
Bonjour à tous,

J'essaie de trouver une formule adaptable en VBA
qui me donnerait la première ligne d'une zone comprenant 2 critères
Semaine = 14
Equipe = TOTO

Voir fichier joint pour une meilleur compréhension :eek:

Merci d'avance pour vos réponses ;)

Ci-dessous le fichier avec la solution
 

Pièces jointes

  • PremièreLigneSemaineEquipe.xls
    25.5 KB · Affichages: 46
  • PremièreLigneSemaineEquipe.xls
    25.5 KB · Affichages: 49
  • PremièreLigneSemaineEquipe.xls
    25.5 KB · Affichages: 46
Dernière modification par un modérateur:

mememe

XLDnaute Nouveau
Re : Formule pour Première ligne d'une zone avec 2 critères

On a le droit à une petite boucle VBA?

Edit: Oups, j'avais mal lu.
Plus qu'à ajouter un bouton et lui affecter le code à adapter...
 

Pièces jointes

  • PremièreLigneSemaineEquipe.xls
    24 KB · Affichages: 50
  • PremièreLigneSemaineEquipe.xls
    24 KB · Affichages: 48
  • PremièreLigneSemaineEquipe.xls
    24 KB · Affichages: 49
Dernière édition:

Modeste

XLDnaute Barbatruc
Re : Formule pour Première ligne d'une zone avec 2 critères

Salut Bruno, bonsoir mememe,

Peut-être avec
Code:
=MIN(SI((B2:B41="toto")*(A2:A41=14);LIGNE(B2:B41)))

... Ou même
Code:
=EQUIV(14&"toto";A1:A41&B1:B41;0)
A valider avec Ctrl+Shift+Enter ... toutes les deux!
 
Dernière édition:

klin89

XLDnaute Accro
Re : Formule pour Première ligne d'une zone avec 2 critères

Bonsoir à tous,
Bonsoir Bruno,

Dans le lien ci-dessous Post #5#, la macro FindMultiCritères de Boisgontier doit répondre à ta demande.

https://www.excel-downloads.com/threads/recherche-avec-find-selon-deux-criteres.140971/

J'ai repris le code de Boisgontier à tester :
VB:
Sub FindMultiCritères()
  n = "14"
  p = "Toto"
  Set c = [A2:A41].Find(n, LookIn:=xlValues, LookAt:=xlWhole)
  If Not c Is Nothing Then
    premier = c.Address
    Set temp = c.Offset(, 1)
    Do
      Set temp = Union(temp, c.Offset(, 1))
      Set c = [A2:A41].FindNext(c)
    Loop While Not c Is Nothing And c.Address <> premier
   End If
   '--  recherche prénom
   Set c = temp.Find(p, LookIn:=xlValues, LookAt:=xlWhole)
   If Not c Is Nothing Then c.Select Else MsgBox "non trouvé"
End Sub

Klin89
Edit : après test ça ne donne pas le résultat escompté
 
Dernière édition:
C

Compte Supprimé 979

Guest
Re : Formule pour Première ligne d'une zone avec 2 critères

Messieurs, bonsoir

Petit complément à mon petit "jeu" :)

1) Je ne veux pas de boucle ... ben oui je sais c'est dommage ;)
2) une formule donc, mais qui peut être traduite en VBA
@Modeste le CTRL+SHIFT+ENTER dans l'éditeur VBA ça ne marche pas trop bien :eek:

J'ai beau me creuser les méninges .. je n'y arrive pô :(

A+
 

david84

XLDnaute Barbatruc
Re : Formule pour Première ligne d'une zone avec 2 critères

Bonsoir tout le monde,
une autre possibilité que les excellentes propositions de Modeste:) :
Code:
=EQUIV(1;(A1:A41=14)*(B1:B41="TOTO");0)
Validation matricielle.
A+
 

david84

XLDnaute Barbatruc
Re : Formule pour Première ligne d'une zone avec 2 critères

Re
Quelle type de méthode veux-tu utiliser ?
Par le biais d'une worksheetFunction, par Evaluate, par une formulaLocale, une formula array en passant par l'enregistreur de macro ?
En fait tu veux cette formule écrite en VBA ? Dans quel cadre et pour l'inclure dans quel type de code ?
A+
 
Dernière édition:

david84

XLDnaute Barbatruc
Re : Formule pour Première ligne d'une zone avec 2 critères

Re re,
La formule de Modeste retranscrite via l'enregistreur de macro donne :
Code:
"=MIN(IF((R[-6]C[-3]:R[33]C[-3]=""toto"")*(R[-6]C[-4]:R[33]C[-4]=14),ROW(R[-6]C[-3]:R[33]C[-3])))"
Traduite en utilisant Evaluate :
Code:
Sub FormuleEvaluate()
  Résultat = [MIN(if((B2:B41="TOTO")*(A2:A41=14),row(B2:B41)))]
  MsgBox Résultat
End Sub
Après on peut encore faire autrement mais je ne connais pas la procédure dans laquelle tu veux l'inclure.
A+
 
C

Compte Supprimé 979

Guest
Re : Formule pour Première ligne d'une zone avec 2 critères

Bonjour à tous,

Désolé d'avoir laché un peu le fil ... mais je suis vraiment overbooké :(

@David84, merci pour tes réponses :eek: ... il va falloir que je teste
Ce que je voudrais c'est intégrer dans mon code VBA, le calcul de la ligne à trouver

Voici un bout de mon code pour peut-être mieux comprendre
Code:
' Initialisation variable objet
  Set ShtDS = Sheets("Détail Semaine")
  Set ShtDP = Sheets("Détail Planning")
  Set ShtP = Sheets("PLANNING")
  ' Initialisation des variables
  NomEq = Param("ChoixEquipe")
  NSem = ShtDS.Range("NumSemaine").Value
  VSem = "S" & Format(NSem, "00")
  ' Vérifier si n'existe pas un détail
  DLigDp = ShtDP.Range("A" & Rows.Count).End(xlUp).Row
  For LigDP = 2 To DLigDp
    If ShtDP.Range("A" & LigDP).Value = ShtDS.Range("NumSemaine").Value _
      And ShtDP.Range("B" & LigDP).Value = NomEq Then
      FlgDP = True
      Exit For
    End If
  Next LigDP
Ce que je voudrais arriver à éviter c'est la fameuse boucle
For LigDP = 2 To DLigDP ... Next LigDP


Je pensais plus à une formule matricielle avec SOMMERPOD()
qui n'a pas besoin d'être validée par CTRL+SHIFT+ENTER car elle doit être tranfomée en VBA

Tant que le détail du planning n'est pas trop grand, ça peut aller, mais ensuite ça ce corse :p

A+
 
Dernière modification par un modérateur:

Tibo

XLDnaute Barbatruc
Re : Formule pour Première ligne d'une zone avec 2 critères

Bonjour le fil, salut Bruno,

Un essai capillotracté :

On suppose que les données sont triées sur le n° de semaine :

Code:
=EQUIV("TOTO";DECALER($B$1;SOMMEPROD((B2:B41="TOTO")*(A2:A41<14))+1;;99);0)+SOMMEPROD((B2:B41="TOTO")*(A2:A41<14))+1

Pas fait de tests grandeur nature.

@+
 

néné06

XLDnaute Accro
Re : Formule pour Première ligne d'une zone avec 2 critères

Peut e^tre dans ce style

semaine = 14
Set X = Sheets("Feuil1").Range("A:A").Find(semaine, LookIn:=xlValues, lookat:=xlWhole)
If Not X Is Nothing Then
deb = (X.Row)
End If

equipe = "TOTO"
Set Y = Sheets("Feuil1").Range(Cells(deb, 2), Cells(2000, 2)).Find(equipe, LookIn:=xlValues, lookat:=xlWhole)
If Not Y Is Nothing Then
Fin = (Y.Row)
End If

A+
 
C

Compte Supprimé 979

Guest
Re : Formule pour Première ligne d'une zone avec 2 critères

Merci beaucoup à tous ;)
Et surtout merci à toi néné06

Grace à toi, j'ai trouvé la solution
VB:
Function LigDebSemEq(VSem As Integer, NomEq As String) As Long
  Dim Rng As Range, LigDebSem As Long, Dlig As Long
  ' Initialiser la ligne de début de semaine pour l'equipe
  LigDebSemEq = 0
  ' En cas d'erreur on continue sans message
  On Error Resume Next
  ' Avec la feuille Détail Semaines
  With Sheets("DétailSemaines")
    ' Récupérer la dernière ligne de la feuille
    Dlig = .Range("A" & Rows.Count).End(xlUp).Row
    ' Chercher la première ligne de la plage du numéro de semaine
    Set Rng = .Range("A:A").Find(VSem, LookIn:=xlValues, lookat:=xlWhole)
    If Not Rng Is Nothing Then LigDebSem = Rng.Row
    ' Chercher la première ligne de la plage semaine contenant le nom d'équipe
    Set Rng = .Range(.Cells(LigDebSem - 1, 2), .Cells(Dlig, 2)).Find(NomEq, LookIn:=xlValues, lookat:=xlWhole)
    If Not Rng Is Nothing Then LigDebSemEq = Rng.Row
  End With
  On Error GoTo 0 ' Réinitialiser les erreurs
End Function

Fonction que j'appele avec
Code:
  ' Vérifier si n'existe pas un détail
  LigDP = LigDebSemEq(NSem, NomEq)

Voili, voilà :D

Je vais pouvoir continuer sereinement :p

A+
 
Dernière modification par un modérateur:

Discussions similaires

Statistiques des forums

Discussions
312 545
Messages
2 089 479
Membres
104 178
dernier inscrit
Lampalator