Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 12/03/2010, 12h08   #1
Invité régulier
 
Inscription : octobre 2008
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 23
Points : 9
Points : 9
Par défaut Interdire saisie "vide" "" dans liste de choix

Bonjour,

Dans un classeur Excel, (Excel 2003 (11.8237.8221) SP3

Sur une sheet Excel (pour l’exemple, Colonne E à J, ligne 18 à 37) j’ai une liste de choix qui est (0, D, I, R, NA, NS) pour certaines cellules.
Le choix est défini par 5 critères.
Toutes les cases de la liste de choix sont grisé interior.Color (Grise)
La valeur initiale est 0 plus les Choix D I R NA NS
Définie par données / validation / liste / Source : =Delivrable_status
« Ignorer si vide » activée
« Liste déroulante dans la cellule » activée
« Appliquer ces modification aux cellules de paramètres identiques » désactivée

Dans le cas d’une saisie (vide) "" j’utilise le code ci-dessous pour remettre la valeur initiale (zéro).

Avec certaine manip à la souris ou clavier ( Supp, <- , Enter, ….) J’ai le code ci-dessous qui boucle avec lancement du débugger via la touche Echap.

Avez-vous une autre solution pour interdire dans ces cellules un choix différent de (0, D, I, R, NA, NS) ?


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Long
   Dim j As Long
    If Application.Intersect(Target, Range("E18:J37")) Is Nothing Then
    Else
        For i = 18 To 37
        For j = 5 To 10
        If ActiveSheet.Cells(i, j).Interior.Color = 12632256 And ActiveSheet.Cells(i, j) = "" Then
        ActiveCell = 0
        End If
        Next j
        Next i
    End If
End Sub
pasclaire est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2010, 13h11   #2
Membre Expert
 
Inscription : juillet 2007
Messages : 2 134
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 2 134
Points : 2 154
Points : 2 154
Salut pasclaire et le forum
Sans chercher plus loin (on aimerait bien savoir quelles manips te coincent), Tu utilises Activecell, alors que la cellule modifiée est target !
Ce n'est qu'à la validation de ta cellule par Enter que la macro _Change se lance, c'est-à-dire quand la cellule active change.

Ensuite, pourquoi revérifier toute ta plage à chaque changement d'une seule cellule ?
Code :
1
2
3
4
5
6
7
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cel As Range
If Intersect(Target, Range("E18:J37")) Is Nothing Then Exit Sub
For Each Cel In Intersect(Target, Range("E18:J37"))
    If Cel.Interior.Color = 12632256 And Cel = "" Then Cel = 0
Next Cel
End Sub
Attention, pas testée.
D'autres remarques
- Si tu veux tester la non condition, pas la peine de passer par else
"If condition = False" ou "If Not Condition" marche aussi bien, en rendant le code plus lisible.
- Dans le même ordre d'idée, l'indentation doit être là pour rendre le code plus lisible, pas "pour faire joli"
- Utiliser .Color n'est pas forcément la meilleure solution. Regarde à .ColorIndex

Mais si tu utilises les listes de validation, pourquoi refaire une telle macro ?
A+
Gorfael est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2010, 13h37   #3
Invité régulier
 
Inscription : octobre 2008
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 23
Points : 9
Points : 9
Bonjour Gorfael,

Ce code est tel qu'il est par ignorance de ma part pour ce type de test que j'ai très peu utilisé dans mes macros.

Merci pour tes explications, j'ai modifié mon code en conséquence.
Je n'ai pas provoqué la mise en boucle de ton code
J’ai suivie ton conseil en utilisant .ColorIndex qui est plus facile à utiliser.

(*) Une liste de diffusion est utilisé pour plusieurs cellules,
Pour ces cellules,Il est possible supprimer le contenu de la cellule ce qui donne la valeur "" à la cellule soit different de (0, D, I, R, NA, NS)
C'est pour cette raison que je test cette manipulation pour remettre la valeur initial.

J'ai un indicateur ou je compte les cellules <> de ""
Ci les cellules (*) son à "" le calcul est faut.


Merci encore pour ton aide.

Dernière modification par pasclaire ; 12/03/2010 à 15h58.
pasclaire est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 06h40.


 
 
 
 
Partenaires

Hébergement Web