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
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.
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
JB
Bonjour,
Sur les exemples ci joint, je modifie en VBA la source de Données/Validation/Liste
http://cjoint.com/?mniqoac0Kl
JB
Bonjour,
Sur les exemples ci joint, je modifie en VBA la source de
Données/Validation/Liste
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
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
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
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
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
=DECALER($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
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