OVH Cloud OVH Cloud

liste Déroulante interactive avec du VBA

6 réponses
Avatar
clyver
Lorsque je veux saisir la Lettre B, C ou F

j'ai un PB car cellule B1, B2,C9,C10,C12...F1, F2, F3, F4 sont vides.

De + ma liste est incompl=E8te...

Quel serai la parade a ce pb?

=3DDECALER(Liste1;0;0;NBVAL(Liste))

=3DDECALER(ListeAlpha;0;0;1;NBVAL(ListeAlpha))

=3DDECALER(ListeName;0;0;NB.SI(ListeName;">"""))



PS : fichiers joint


http://cjoint.com/?mmkxJJUnVD

6 réponses

Avatar
PMO
Bonjour,

Une piste avec votre procédure évènementielle que
j'ai modifiée.
On oublie toute formule dans la colonne B de la
feuille "Base".
Faites un test pour voir si ça marche.

'**********
Private Sub Worksheet_Change(ByVal Target As Range)
Static IsOn As Boolean
If IsOn Then
IsOn = False
Exit Sub
End If
If Application.Intersect(Target, Range("Saisie")) Is Nothing Then Exit Sub
With Target
If .Rows.Count > 1 Or .Columns.Count > 1 Then Exit Sub
If .Value = "" Then Exit Sub
Range("A1").Value = .Value

'---- Ajout de PMO ----
Dim S As Worksheet
Dim R As Range
Dim var
Dim T()
Dim T2()
Dim i&
Dim j&
Set S = Sheets("Base")
Set R = S.Range("" & .Value & 2 & "")
Set R = R.Offset(0, 2)
Set R = R.Resize(S.UsedRange.Rows.Count)
var = R
For i& = 1 To UBound(var, 1)
If Not IsEmpty(var(i&, 1)) And _
var(i&, 1) > 0 Then
j& = j& + 1
ReDim Preserve T(1 To j&)
T(j&) = var(i&, 1)
End If
Next i&
ReDim T2(1 To UBound(T), 1 To 1)
For i& = 1 To UBound(T)
T2(i&, 1) = T(i&)
Next i&
S.Range("b2:b" & S.UsedRange.Rows.Count & "").ClearContents
S.Range("b2:b" & UBound(T2, 1) + 1) = T2
'---- Fin de PMO ----

With .Validation
.Modify Formula1:="=ListeNoms"
End With
End With
SendKeys "%{DOWN}", False
IsOn = True
End Sub
'**********

Cordialement.
--
PMO
Patrick Morange



Lorsque je veux saisir la Lettre B, C ou F

j'ai un PB car cellule B1, B2,C9,C10,C12...F1, F2, F3, F4 sont vides.

De + ma liste est incomplète...

Quel serai la parade a ce pb?

ÞCALER(Liste1;0;0;NBVAL(Liste))

ÞCALER(ListeAlpha;0;0;1;NBVAL(ListeAlpha))

ÞCALER(ListeName;0;0;NB.SI(ListeName;">"""))



PS : fichiers joint


http://cjoint.com/?mmkxJJUnVD




Avatar
JB
Bonjour,

Sur les exemples ci joint, je modifie en VBA la source de
Données/Validation/Liste


http://cjoint.com/?mniqoac0Kl

JB
Avatar
clyver
tres bien mais la la liste compressé ne fonctionne pas si la liste est
une liaison???
Avatar
clyver
http://cjoint.com/?mprvAne5dQ

voici mon le fichier modifié
Avatar
JB
Bonsoir,,,

Effectivement, ça ne fonctionne pas avec des formules.
Dans la version ci jointe, la liste bleu contient des formules:

http://cjoint.com/?mpuCyYrGn0

Maliste
aa
0
bb
cc
dd
kk
0
nn
0
0
0
qq

La liste déroulante n'est alimentée que par les cellules non vides et
différentes de zéros (à l'ouverture du classeur)
Si la liste doit varier pendant l'utilisation du classeur, on pourrait
faire sa MAJ avec l'événnement WorkSheet_Change()

Private Sub Workbook_Open()
RemplitListe Range("maliste"), "menu1"
End Sub

Sub RemplitListe(champ, m)
temp = ""
For i = 1 To champ.Count
If Not IsEmpty(champ(i)) And Not champ(i) = 0 Then
temp = temp & champ(i) & ","
End If
Next i
Range(m).Validation.Modify xlValidateList, Formula1:=Left(temp,
Len(temp) - 1)
End Sub

Cordialement JB
Avatar
JB
Bonjour,

Autre solution (Le menu déroulant est maj automatiquement si la liste
est modifiée):

http://cjoint.com/?mqfRJY4R8N

1-Créer une liste 'compressée' :
Sélectionner J2:J8
=sansvides(ListeDépart)
Valider vec Maj+ctrl+entrée

2-Dans Données/Validation/Liste

ÞCALER($D$5;;;NB.SI(ListeCompressée;"<>0"))

Dans un module:
Function SansVides(champ As Range)
Dim temp(1000, 1)
j = 0
For i = 1 To champ.Count
If Not IsEmpty(champ(i)) And Not champ(i) = 0 Then
temp(j, 0) = champ(i)
j = j + 1
End If
Next i
SansVides = temp
End Function

Cordialement JB