2010-09-16 27 views
0

Voici mon problème avec l'exécution d'une formule Excel.Formule auto-référencée conditionnelle (exécuter uniquement si valeur de la cellule == "")

Ce sont les exigences:

  • J'ai plusieurs lignes dans une feuille Excel .
  • A la fin de chaque ligne se trouve un champ appelé "Mois".
  • Si quelqu'un entre de nouvelles valeurs dans cette ligne , le mois en cours doit être inséré.
  • Si les valeurs sont modifiées, le mois ne doit pas être modifié.

Pour inclure le mois en cours, j'utilise une formule comme ceci (A10 est juste un champ aléatoire qui sera rempli):

=IF(A10<>0; MONTH(NOW()); "") 

Maintenant, je besoin d'une condition pour vérifier si le champ contient une mois déjà, et si c'est le cas, ne faites rien. J'ai essayé les éléments suivants (A15 doit contenir le mois):

=IF(A15 <> ""; IF(A10<>0; MONTH(NOW()); "") ;) 

Pour décider si le champ doit être modifié par l'formular, je dois vérifier sa valeur actuelle. Le problème est que cela aboutira à une référence circulaire au champ lui-même.

Quelqu'un at-il une solution de travail pour ce genre de problèmes? J'essaie de ne pas utiliser de code VBA.

Répondre

5

Vous ne pouvez pas le faire avec des formules, vous devez utiliser VBA. La formule ne peut pas se référer à elle-même.

L'autre problème est que NOW va changer chaque fois que vous recalculez. Donc, même avec votre première formule, le mois ne restera pas statique.

Si vous décidez que vous pouvez vivre avec VBA, faites un clic droit sur l'onglet feuille et choisissez Afficher le code. Le code dont vous aurez besoin ressemblera à quelque chose comme ça

Private Sub Worksheet_Change(ByVal Target As Range) 

    'We only care if cells are changed in a certain range 
    If Not Intersect(Target, Me.Range("A1:G10")) Is Nothing Then 

     'Only do this if there's nothing in row 15 for whatever column 
     'was changed 
     If IsEmpty(Me.Cells(15, Target.Column).Value) Then 

      'Put the month in row 15 of the current column 
      Me.Cells(15, Target.Column).Value = Month(Now) 
     End If 
    End If 

End Sub 
+0

Il semble que je doive vivre avec VBA :-) Merci pour votre réponse! – echox

+0

Malheureusement, oui. Pour clarifier, ce n'est pas vraiment la nature autoréférentielle qui est en cause (nous pouvons contourner cela en utilisant des champs cachés, etc.) c'est plus que vous voulez que les formules évaluent seulement sous certaines conditions, alors qu'elles sont toutes réévaluées chaque fois que un champ qu'ils référencent est mis à jour, la feuille de calcul est chargée, et une centaine d'autres situations - vous n'avez donc aucun moyen de comparer avec les «anciennes» valeurs. – Basic