Effacer le contenu d'une cellule SANS toucher aux Formules

Bonjour à tous , je suis un peu dans la panade , je m'explique :

J'ai creé un fichier d'accueil , j'ai rentrer des formules pour automatisé le fichier :

Quand je rentre le nom de la personne tout son pédigré s'affiche automatiquement ( prénom , date de validité de plusieurs docs etc ) puisque j'ai une base de donnée à jour .

Le problème est le suivant : Je veux pouvoir mettre manuellement tout ces paramètres si la personne n'est pas dans la base de donnée puisque certaines ne sont pas connues à l'avance et sont donc accueillis inopinément , mais si je le fais , mes formules s'effacent

Y'a t'il une solution ?

Bonjour,

pas de soucis !

il faut que les modifications soient répercutées sur la base de données et les formules réactivées par macro

je peux fournir un exemple, mais le mieux serait que tu donnes un bout de fichier anonymisé

Bonjour,

pas de soucis !

il faut que les modifications soient répercutées sur la base de données et les formules réactivées par macro

je peux fournir un exemple, mais le mieux serait que tu donnes un bout de fichier anonymisé

Voici le fichier

Onglet CHECKLIST

ok

je regarde demain à la fraîche !

ok

je regarde demain à la fraîche !

Ok super , merci beaucoup à l’avance car là je sèche ...

Bonjour,

@ Steelson

A la fraîche de fraîche alors !...

Démarre avec un bon café et un petit rhum de Barbencourt !...

Bonnes fêtes de fin d'année...

Cdlt.

Bonjour Jean-Eric ... voici (et le café n'est même pas encore avalé !).

J'explique un peu en détail la démarche.

D'abord, je fais appel à une procédure événementielle Private Sub Worksheet_Change(ByVal Target As Range) qui va réagir à chaque changement apporté à la feuille

Ensuite, il faut bien identifier les zones qui sont modifiables, j'ai opté pour cette convention : COND_N avec N le numéro de la colonne de la base de données à modifier

capture d ecran 335

La logique est donc la suivante :

  • si le nom de la zone modifiée (target) commence par COND_
  • alors je cherche la ligne concernée dans la BDD
  • si non trouvée je la rajoute
  • je mets à jour la colonne concernée
  • et enfin je régénère la formule (attention, il faut doubler les guillemets
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Trouve As Range, ligne As Long, colonne As Integer

    If Target.CountLarge > 1 Then Exit Sub ' une cellule à la fois
    On Error GoTo fin ' il n'y a pas de nom attribué à la cellule modifiée

    If Left(Target.Name.Name, 5) = "COND_" Then
        colonne = Mid(Target.Name.Name, 6, 99)
        Set Trouve = Sheets("BDD COND").Range("A:A").Find(what:=Range("B15"), LookAt:=xlWhole)
        If Trouve Is Nothing Then
            ligne = Sheets("BDD COND").Cells(Rows.Count, 1).End(xlUp).Row + 1
            Sheets("BDD COND").Cells(ligne, 1) = Range("B15")
            MsgBox "Création d'un nouvel enregistrement !"
        Else
            ligne = Trouve.Row
        End If
        Application.EnableEvents = False
        ' renseignement de la base de données
        Sheets("BDD COND").Cells(ligne, colonne) = Target.Value
        ' re-création de la formule de recheche
        Target.FormulaLocal = _
            "=SI($B$15="""";"""";SI(RECHERCHEV($B$15;'BDD COND'!$A$5:$H$10000;" & colonne & ";FAUX)="""";"""";RECHERCHEV($B$15;'BDD COND'!$A$5:$H$10000;" & colonne & ";FAUX)))"
        Application.EnableEvents = True
    End If

fin: Exit Sub
End Sub

https://www.cjoint.com/c/HLBdHcHFCow

Au passage, je suis surpris de prendre comme référence le nom du conducteur (attention aux homonymes).

Par ailleurs, tes formules sont basées sur 5000 lignes, le fait d'organiser tes données en tableau aurait permis de limiter au strict nécessaire et s'adapter à la taille de la BdD.

Mais je n'ai rien changé sur le reste de ton application déjà bien fournie.

@ Steelson

A la fraîche de fraîche alors !...

Démarre avec un bon café et un petit rhum de Barbencourt !...

café avalé, même pas "chargé" !

bonne journée

Bonjour Jean-Eric ... voici (et le café n'est même pas encore avalé !).

J'explique un peu en détail la démarche.

D'abord, je fais appel à une procédure événementielle Private Sub Worksheet_Change(ByVal Target As Range) qui va réagir à chaque changement apporté à la feuille

Ensuite, il faut bien identifier les zones qui sont modifiables, j'ai opté pour cette convention : COND_N avec N le numéro de la colonne de la base de données à modifier

Capture d’écran (335).png

La logique est donc la suivante :

  • si le nom de la zone modifiée (target) commence par COND_
  • alors je cherche la ligne concernée dans la BDD
  • si non trouvée je la rajoute
  • je mets à jour la colonne concernée
  • et enfin je régénère la formule (attention, il faut doubler les guillemets
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Trouve As Range, ligne As Long, colonne As Integer

    If Target.CountLarge > 1 Then Exit Sub ' une cellule à la fois
    On Error GoTo fin ' il n'y a pas de nom attribué à la cellule modifiée

    If Left(Target.Name.Name, 5) = "COND_" Then
        colonne = Mid(Target.Name.Name, 6, 99)
        Set Trouve = Sheets("BDD COND").Range("A:A").Find(what:=Range("B15"), LookAt:=xlWhole)
        If Trouve Is Nothing Then
            ligne = Sheets("BDD COND").Cells(Rows.Count, 1).End(xlUp).Row + 1
            Sheets("BDD COND").Cells(ligne, 1) = Range("B15")
            MsgBox "Création d'un nouvel enregistrement !"
        Else
            ligne = Trouve.Row
        End If
        Application.EnableEvents = False
        ' renseignement de la base de données
        Sheets("BDD COND").Cells(ligne, colonne) = Target.Value
        ' re-création de la formule de recheche
        Target.FormulaLocal = _
            "=SI($B$15="""";"""";SI(RECHERCHEV($B$15;'BDD COND'!$A$5:$H$10000;" & colonne & ";FAUX)="""";"""";RECHERCHEV($B$15;'BDD COND'!$A$5:$H$10000;" & colonne & ";FAUX)))"
        Application.EnableEvents = True
    End If

fin: Exit Sub
End Sub

https://www.cjoint.com/c/HLBdHcHFCow

Au passage, je suis surpris de prendre comme référence le nom du conducteur (attention aux homonymes).

Par ailleurs, tes formules sont basées sur 5000 lignes, le fait d'organiser tes données en tableau aurait permis de limiter au strict nécessaire et s'adapter à la taille de la BdD.

Mais je n'ai rien changé sur le reste de ton application déjà bien fournie.

Bonjour Steelson , problème à l'ouverture du fichier , comprend pas .

12doc1.docx (160.66 Ko)

Reprends le chargement, chez moi il s'ouvre correctement (y compris en le rechargeant) !

Reprends le chargement, chez moi il s'ouvre correctement (y compris en le rechargeant) !

Rien à y faire , ça ne veut pas , toujours le même message d'erreur .

Je viens de tenter encore .

Je te le renvoie sous cjoint sur un nouveau lien

https://www.cjoint.com/c/HLBr41lpFHw

Si le fichier n'arrive pas à se charger correctement, tu as l'intégralité de l'explication ici :

https://forum.excel-pratique.com/viewtopic.php?p=719447#p719447

Nomme les cellules et colle la macro dans la feuille CHECKLIST.

Cette Macro je la colle en VBA dans la feuille Checklist c'est ça ?

oui

après avoir donné les noms des cellules comme sur la photo

oui

après avoir donné les noms des cellules comme sur la photo

Ok j'ai nommé les cellules comme sur la photo et intégré la formule dans VBA sur la feuille "CHECKLIST"

le Rendu est le suivant et confirme moi si je me trompe :

Quand je sélectionne le Nom dans mon menu déroulant , tout le pédigré s'affiche automatiquement , jusque la pas de changement par rapport à avant .

Si j'efface un des paramètres , ça me l'efface dans la base de donnée nommée BDD COND

( Il ne faut pas )

Ensuite si j'écris un nom qui n'est pas dans la base de donnée et également qui n'a pas de pédigré , il me creé un nouvel enregistrement

( Il ne faut pas ) , à la rigueur par le biais d'un bouton avec mot de passe ( ça je sais le faire )

il faudrait que :

Si le nom est dans la base de donnée , tout s'affiche ( comme initialement )

si on efface un des paramètres ( prénom , date etc ) que ça n'efface rien dans la base de donnée

si on efface un des paramètres ( prénom , date etc ) que ça ne touche pas aux formules dans les cellules

Si le nom n'est pas dans la base de donnée , que l'on puisse tout rentrer manuellement ( sans que ça touche aux formules etc ) même si on efface la cellule .

Et qu'à la rigueur je fasse un bouton ( avec MDP ) d'enregistrement d'un nouveau conducteur qui enregistre tout dans ma base de donnée avec cette fameuse macro VBA que tu m'as donner .

Si après c'est trop complexe ou trop contraignant , dit moi ...

Bonjour,

il faudrait que :

Si le nom est dans la base de donnée , tout s'affiche ( comme initialement )

si on efface un des paramètres ( prénom , date etc ) que ça n'efface rien dans la base de donnée

si on efface un des paramètres ( prénom , date etc ) que ça ne touche pas aux formules dans les cellules

ok, voir ci-après l'évolution de la macro
        ' renseignement de la base de données
        If Target.Value <> "" Then Sheets("BDD COND").Cells(ligne, colonne) = Target.Value

je rappelle néanmoins le titre de ton topic :

Effacer le contenu d'une cellule SANS toucher aux Formules


Si le nom n'est pas dans la base de donnée , que l'on puisse tout rentrer manuellement ( sans que ça touche aux formules etc ) même si on efface la cellule .

Et qu'à la rigueur je fasse un bouton ( avec MDP ) d'enregistrement d'un nouveau conducteur qui enregistre tout dans ma base de donnée

il faudrait restreindre alors la validation des données en B15 par :
=DECALER('BDD COND'!$A$4;1;;NBVAL('BDD COND'!$A:$A)-1)

dans ce cas cela bloque de nouveaux chauffeurs ... mais je pensais que ...

Je veux pouvoir mettre manuellement tout ces paramètres si la personne n'est pas dans la base de donnée puisque certaines ne sont pas connues à l'avance et sont donc accueillis inopinément

tu peux créer un formulaire avec mot de passe mais ce n'est plus le même sujet (et ce n'est pas ma tasse de thé).
Rechercher des sujets similaires à "effacer contenu toucher formules"