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

Comment renvoyer "" au lieu de 0 avec fonction INDEX + EQUIV

Merinom

XLDnaute Junior
Bonjour le forum!

Me voici avec un petit soucis bien embêtant. On m'a fourni une macro permettant de faire un tirage au sort sur une liste de numéros, un paramètre permet de définir le pourcentage de numéro qu'on veut extraire. Le problème est que la liste de numéros je la récupère avec la fonction INDEX plus EQUIV sur une autre onglet du classeur. Or la liste de numéros peut varier (de 5 à 200) donc comme la formule se trouve sur les 200 lignes de la colonne, elle renvoi 0 quand il n'y a pas de valeur. Par contre la macro prend en compte ces cellules et le tirage au sort est donc faussé.
J'ai désactiver l'affichage des 0 avec l'option d'Excel mais la macro considère qu'il y une valeur tout de même. Je vous laisse le fichier pour que ce soit plus clair. La liste sur la colonne A de la feuille 2 extrait des liste sur la feuille 1 en fonction du "lot" introduit.

Merci beaucoup!!
 

Pièces jointes

  • Liste 1 - V2 - Copie.xlsm
    107.1 KB · Affichages: 54

CISCO

XLDnaute Barbatruc
Bonjour

Peut être avec
Code:
SI(INDEX(CND!$A$5:$CV$204;LIGNE();EQUIV(E$6;CND!$A$3:$CV$3;1))<>"";INDEX(CND!$A$5:$CV$204;LIGNE();EQUIV(E$6;CND!$A$3:$CV$3;1));"")

mais cela met "" dans les cellules à la place des 0.

@ plus
 

Merinom

XLDnaute Junior
Bonjour CISCO et merci pour ta réponse,

J'avais déjà essayé quelque chose du genre en rajoutant
Code:
=INDEX(CND!$A$5:$CV$204;LIGNE();EQUIV(E$6;CND!$A$3:$CV$3;1))&""
et ca ne marche pas, je crois que la macro prend en compte la cellule dès qu'il y a une formule .. je ne sais pas quoi faire
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour Merinom, CISCO,

Avec une réécriture de la macro :
VB:
Sub TiragePourcent()
Dim n&, tablo, i&, k$, aux, max&

  n = [=COUNTIF(A:A,">"" """)]
  tablo = Range("a1:a" & n).Value

  Randomize
  For i = 1 To n
    k = 1 + Int(Rnd * n)
    aux = tablo(i, 1): tablo(i, 1) = tablo(k, 1): tablo(k, 1) = aux
  Next i

  max = Round(n * Range("h6") / 100, 0)
  If max > n Then max = n
  Range(Cells(11, "e"), Cells(Rows.Count, "e")).ClearContents
  If max > 0 Then
    Cells(11, "e").Resize(max) = tablo
    ' le tri est optionnel
    Range("e11").Resize(max).Sort key1:=[e1], order1:=xlAscending, Header:=xlNo
  End If
End Sub
 

Pièces jointes

  • Merinom- Tri- v1.xlsm
    109.1 KB · Affichages: 45

Dranreb

XLDnaute Barbatruc
Bonjour.
Pourquoi votre macro ne part-elle pas des données source au lieu d'une copie par formules ?
VB:
Sub TiragePourcent()
Dim C&, T(), L&, P&, V
C = WorksheetFunction.Match(Feuil1.[E6].Value, Feuil8.Rows(3), 0)
T = Feuil8.Cells(5, C).Resize(Feuil8.Cells(&H100000, C).End(xlUp).Row - 4).Value
For L = UBound(T, 1) To 2 Step -1
   P = Int(Rnd * L) + 1: V = T(P, 1): T(P, 1) = T(L, 1): T(L, 1) = V: Next L
L = Int(UBound(T, 1) * Feuil1.[H6].Value / 100 + 0.5)
Feuil1.[E11:E300].ClearContents
Feuil1.[E11].Resize(L).Value = T
End Sub
 

Merinom

XLDnaute Junior
Woow encore mieux !! Par contre est ce que c'est possible que la macro envoie un MsgBox en cas où l'utilisateur essaye de lancer la macro avec un lot de moins de 3 tubes, ceci car ce fichier va être utiliser par des non spécialistes de VBA et ils pourraient faire une mauvaise manip et je veux pas qu'ils paniquent avec une erreur d'exécution 1004

Merci beaucoup à tous !! Ce forum est génial !
 
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…