Formule permanante si case vide

white-angel

XLDnaute Nouveau
Bonjour Forum.

Je viens à vous car je suis confronté à un sérieux problème qui, je pense, n'a pas vraiment de solution.
Je vous explique mon "problème".

J'ai une formule dans une case. Cette case est modifiable par l'utilisateur afin qu'il inscrive la donnée qu'il veut. OUI MAIS, du coup ma formule s'efface. Ce n'est pas grave puisque je veux que l'utilisateur puisse voir le résultat de ce qu'il a écrit. Par contre, s'il efface la case, je voudrais que ma formule réapparaisse (car ce tableau sera utilisé sur plusieurs mois et les données saisies à la main seront très occasionnelles).
J'ai près de 30 cases par tableau et presque 50 onglets dans un classeur.
J'ai pensé par macro à lancé une vérification sur chaque cellule après une entrée de donnée manuelle et si les cellules sont vides, alors la macro y colle la formule. Mais je pense que le temps d’exécution serai assez lourd.
Y aurait-il une autre solution?
Merci Forum !!

White-Angel
 

white-angel

XLDnaute Nouveau
Re : Formule permanante si case vide

Bonsoir, et merci de te pencher sur la question.

En PJ, un tout petit fichier.
Sur la feuille 1, j'ai ma base de donnée
Sur la feuille 2, j'ai les interrogations de ma base de donnée + ma question :)

J’espère que cela sera plus claire pour toi ... j'ai vraiment du mal à exprimer mon problème :)
Merci encore !!

JB
 

Pièces jointes

  • exemple.xlsx
    10 KB · Affichages: 35
  • exemple.xlsx
    10 KB · Affichages: 38
  • exemple.xlsx
    10 KB · Affichages: 40

white-angel

XLDnaute Nouveau
Re : Formule permanante si case vide

Re

merci pour ta réponse mais je voudrais que l'utilisateur puisse entrer ses données. Ds la cellule car exceptionnellement il doit y entrer ce qu'il veut. A partir du moment ou a1 est vide, b2 devrait reprendre sa formule initiale.
Merci :)
 

Staple1600

XLDnaute Barbatruc
Re : Formule permanante si case vide

Re

Sinon j'étais parti là-dessus
(à mettre dans le code de la feuille 2)
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Range("B2").HasFormula Then
Range("B2").FormulaR1C1 = "=IF(R[-1]C[-1]="""","""",VLOOKUP(R[-1]C[-1],Feuil1!R1:R4,3))"
End If
End Sub

Mais au vu de ton dernier message, cela risque de tiquer légèrement ;)

(Mais tu peux tester par toi-même pour t'en rendre compte ;))

EDITION: avec cette variante, on se rapproche (mais je crains des effets indésirables)
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Range("B2").HasFormula And Len(Range("A1")) > 0 Then
Range("B2").FormulaR1C1 = "=IF(R[-1]C[-1]="""","""",VLOOKUP(R[-1]C[-1],Feuil1!R1:R4,3))"
Else
'
End If
End Sub
 
Dernière édition:

white-angel

XLDnaute Nouveau
Re : Formule permanante si case vide

Re

Merci pour ces 2 bouts de codes.
Tout d'abord, qu'est ce que Hasformula? je vais rechercher sur google mais je ne trouve rien en Francais pour le moment ;)
Je suis preneur pour une explication.

On se rapproche effectivement mais malheureusement, je ne peux rien écrire d'autre dans ma cellule que la formule.
De plus, j'ai 252 cellules (très précisément) qui sont dans ce cas. Si elles sont vide et que A1 ne l'est pas, alors formule. Sinon, l'utilisateur aura le droit de mettre ce qu'il veut.
Ne penses tu pas que par macro, ca risque d'etre lourd une macro qui s'execute à chaque entrée de donnée ?
Merci de te pencher sur mon problème !!

JB

EDIT : Effectivement, c'est l'inverse de cette formule que j'aimerai.
Si A1 <> "" et que B2 = "", alors formule. Sinon la donnée utilisateur

EDIT 2 :

Donc, le code modifié donnerai :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Range("B2").HasFormula And Len(Range("A1")) = 0 Then
Range("B2").FormulaR1C1 = "=IF(R[-1]C[-1]="""","""",VLOOKUP(R[-1]C[-1],Feuil1!R1:R4,3))"
Else
'
End If
End Sub

Mais 252 cases !!! :(
 
Dernière édition:

white-angel

XLDnaute Nouveau
Re : Formule permanante si case vide

Ah yes...javais pas pensé a F1 :s
du coup effectivement c'est pas mal de vérifier si la cellule contient une formule ou pas et d y ajouter la condition que la A1 soit vide.
C'est donc parfait. Reste donc a vérifié chaque cellule devant contenir une formule ou pas. 252 cells a se faire a la main avec une procédure ultra longue :s
 

Staple1600

XLDnaute Barbatruc
Re : Formule permanante si case vide

Re

Avec 252 cellules et avec le code VBA tel quel alors mes craintes vont devenir réalité ;)
(mais je crains des effets indésirables)

C'est là qu'il faudrait sortir
Y aurait-il une autre solution?
Autre solution qui serait de repenser le mode de fonctionnement du classeur.
Car si une cellule doit contenir une formule pourquoi diable pourrait-elle contenir autre chose qu'une formule ;)
 

CISCO

XLDnaute Barbatruc
Re : Formule permanante si case vide

Bonjour

Plutot que de relancer la macro à chaque modif, ne serait-il pas possible de mettre un bouton avec un texte du style "Voulez-vous réinitialiser les cellules vides du tableau avec la formule... ?"

@ plus
 

white-angel

XLDnaute Nouveau
Re : Formule permanante si case vide

Merci de vos réponse.

La nuit porte conseil :)
Je pense avoir trouvé une solution viable grâce à Staple1600.
CISCO, j'ai aussi cette fonction dans le tableur mais je ne voudrais pas que l'utilisateur soit obligé de cliquer sur un bouton.
Je vous refais un exemple plus concret qui expliquerai la question de Staple1600, à savoir : "pourquoi diable pourrait-elle contenir autre chose qu'une formule"
J'essaye donc de mettre le code à jour dans un fichier exemple et je vous poste le tout. :)
A toute à l'heure :)
JB

EDIT :

voilà, ca ressemble à peu près à ça. Disons que le résultat voulu est obtenu. Je pense que mon code n'est pas "propre". Je suis preneur de vos suggestions. j'ai rajouter un cell activate qui ne sers à rien du tout, c'était juste pour validé la suite de ma macro et comprendre l'utilisation... mais cette ligne ne sert à rien ;)
Dans l'exemple donc, j'ai un lundi, et un mardi.
La plus part du temps, mes magasins ouvrent et ferment toujours à la même heure. Sauf ce Mardi. J'ai donc pu changer l'horaire (en effaçant la formule par remplacement evidemment).
Mais Le mois d’après, je dois réutiliser ce tableau. Et changer de magasin. Donc la donnée manuelle doit disparaitre pour laisser place à la formule par défaut.
autre hypothèse, je me suis trompé dans le jour pour le changement d'horaire, je supprime juste le nom de magasin, pour le remettre et mes horaires apparaissent seules.
J'ai juste un soucis sur le rapprochement des données entre ma BDD et ce qui s'affiche ... Je n'arrive pas à comprendre pourquoi ... J'ai besoin donc de vos lumières la dessus et sur la propreté de la macro.
J'ai rajouté une condition (si l<>2) c'est juste pour moi pour la suite car mon tableau est un peu plus complexe :)
Merci aux experts :D :p

JB
 

Pièces jointes

  • exemple.xlsm
    16.5 KB · Affichages: 31
  • exemple.xlsm
    16.5 KB · Affichages: 30
  • exemple.xlsm
    16.5 KB · Affichages: 28
Dernière édition:

white-angel

XLDnaute Nouveau
Re : Formule permanante si case vide

Bonjour à tous.
Pour finalement répondre aux besoins de mon tableau, j'ai modifié le code :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
l = ActiveCell.Row
r = ActiveCell.Column
If l = 6 Or l = 33 Or l = 60 Or l = 87 Or l = 114 Or l = 141 Then GoTo matin Else
If l = 12 Or l = 39 Or l = 66 Or l = 93 Or l = 120 Or l = 147 Then GoTo apres_midi Else
If l = 18 Or l = 45 Or l = 72 Or l = 99 Or l = 126 Or l = 153 Then GoTo extra Else

Exit Sub
matin:
If Not ActiveSheet.Cells(l + 1, r).HasFormula And Len(ActiveCell) = 0 Then
ActiveSheet.Cells(l + 1, r).FormulaR1C1 = "=IF(R[-1]C="""","""",VLOOKUP(R[-1]C,Etablissements!R1:R1048576,2))"
Else
If Not ActiveSheet.Cells(l + 1, r + 3).HasFormula And Len(ActiveCell) = 0 Then
ActiveSheet.Cells(l + 1, r + 3).Activate
ActiveSheet.Cells(l + 1, r + 3).FormulaR1C1 = "=IF(R[-1]C[-3]="""","""",VLOOKUP(R[-1]C[-3],Etablissements!R1:R1048576,3))"
Else
End If
Exit Sub


apres_midi:
If Not ActiveSheet.Cells(l + 1, r).HasFormula And Len(ActiveCell) = 0 Then
ActiveSheet.Cells(l + 1, r).FormulaR1C1 = "=IF(R[-1]C="""","""",VLOOKUP(R[-1]C,Etablissements!R1:R1048576,4))"
Else
If Not ActiveSheet.Cells(l + 1, r + 3).HasFormula And Len(ActiveCell) = 0 Then
ActiveSheet.Cells(l + 1, r + 3).Activate
ActiveSheet.Cells(l + 1, r + 3).FormulaR1C1 = "=IF(R[-1]C[-3]="""","""",VLOOKUP(R[-1]C[-3],Etablissements!R1:R1048576,5))"
Else
End If
Exit Sub


extra:
If Not ActiveSheet.Cells(l + 1, r).HasFormula And Len(ActiveCell) = 0 Then
ActiveSheet.Cells(l + 1, r).FormulaR1C1 = "=IF(R[-1]C="""","""",VLOOKUP(R[-1]C,Etablissements!R1:R1048576,6))"
Else
If Not ActiveSheet.Cells(l + 1, r + 3).HasFormula And Len(ActiveCell) = 0 Then
ActiveSheet.Cells(l + 1, r + 3).Activate
ActiveSheet.Cells(l + 1, r + 3).FormulaR1C1 = "=IF(R[-1]C[-3]="""","""",VLOOKUP(R[-1]C[-3],Etablissements!R1:R1048576,7))"
Else
End If
Exit Sub

End If
End If
End If
End Sub

Je suis tout de même preneur de vos suggestions sur d'éventuelles erreurs.
Je clôturerai le sujet dans 1 semaine :)
 

Staple1600

XLDnaute Barbatruc
Re : Formule permanante si case vide

Bonsoir à tous

Je suis tout de même preneur de vos suggestions sur d'éventuelles erreurs.
Je clôturerai le sujet dans 1 semaine :)
Voici une ébauche de suggestion d'allégement de code
(Ci-dessous c'est juste une version illustrative que je te laisse adapter sur ton propre classeur)

Code:
Sub Tests()
Dim ligs, cols, i, j, x$
ligs = Array(6, 33, 60, 87, 144, 141)
cols = Array(Array(2, 3), Array(4, 5), Array(6, 7))
x = ",Etablissements!R1:R1048576,"
For i = LBound(ligs) To UBound(ligs)
For j = 0 To 2
Cells(ligs(i) + (j * 6), "A") = "=IF(R[-1]C="""","""",VLOOKUP(R[-1]C" & x & cols(j)(0) & "))"
Cells(ligs(i) + (j * 6), "F") = "=IF(R[-1]C[-3]="""","""",VLOOKUP(R[-1]C[-3]" & x & cols(j)(1) & "))"
Next
Next
End Sub
Cela a pour but d'éviter les morceaux de code qui se répètent (c'est à dire ce bloc-ci)
If Not ActiveSheet.Cells(l + 1, r).HasFormula And Len(ActiveCell) = 0 Then
ActiveSheet.Cells(l + 1, r).FormulaR1C1 = "=IF(R[-1]C="""","""",VLOOKUP(R[-1]C,Etablissements!R1:R1048576,2))"
Else
If Not ActiveSheet.Cells(l + 1, r + 3).HasFormula And Len(ActiveCell) = 0 Then
ActiveSheet.Cells(l + 1, r + 3).Activate
ActiveSheet.Cells(l + 1, r + 3).FormulaR1C1 = "=IF(R[-1]C[-3]="""","""",VLOOKUP(R[-1]C[-3],Etablissements!R1:R1048576,3))"
Else
End If
Exit Sub

Je te laisse donc faire les nécessaires réécriture et tests de cette suggestion (si jamais tu y trouves intérêt ou curiosité ;) )
 
Dernière édition:

white-angel

XLDnaute Nouveau
Re : Formule permanante si case vide

Merci JM,
Je décode et adapte demain.
Je vous dirai si j'ai pu adapter ;)

A demain donc. ET ENCORE MERCI !!!


EDIT :

JM,

La macro proposée passe automatiquement sur chaque cellule de la colonne A et F (si j'ai bien compris le code).
La mienne ne vérifie que la cellule en cours d'utilisation par l'utilisateur (avec le activecell)
Je vais donc regarder pour adapter mais ... je crains de ne pouvoir.
A demain forum génialissime :)

JB
 
Dernière édition:

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 472
Messages
2 088 709
Membres
103 928
dernier inscrit
MIKETUAU