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

  • Initiateur de la discussion Initiateur de la discussion Merinom
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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

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
 
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
 
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

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
 
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 !
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
2
Affichages
48
Retour