ma fonction retourne #VALEUR! lors de la suppression d'une ligne

oracle7

XLDnaute Nouveau
[Résolu] ma fonction retourne #VALEUR! lors de la suppression d'une ligne

Bonjour à tous,

Voici mon problème :
Contexte
Dans chaque cellule de la plage A1:A100 j'ai une formule personnelle écrite en VBA du type "=MaFonction (Bx)".
Dans la plage B1:B100, je saisi une valeur numérique X qui sert de donnée d'entrée à "MaFonction".
En entête du tableau j'ai deux boutons. Un pour insérer une ligne n'importe où dans la plage A1:B100. L'autre pour supprimer une ligne quelconque dans cette même plage.
Voici le code de ces 2 boutons :
Bouton "Insérer ligne"
Code:
Private Sub CommandButton1_Click()
    Dim iNoLigne As Integer
    
    Application.ScreenUpdating = False
    iNoLigne = ActiveCell.Row ' On récupère le N° de la ligne courante
    With Range("A" & iNoLigne & ":C" & iNoLigne)
        .Resize(1).EntireRow.Insert ' On insert une ligne vide
        ' On recopie les formats et formules de la ligne précédente
        .EntireRow.Copy .Offset(-1).Resize(1).EntireRow
        On Error Resume Next ' Au cas où il n'y ait pas de constantes
        ' On efface les valeurs constantes préentes dans la ligne
        .Offset(-1).Resize(1).EntireRow.SpecialCells(xlConstants).ClearContents
    End With
    Application.ScreenUpdating = True
    ActiveCell.Select
End Sub

Bouton "Supprimer Ligne"
Code:
Private Sub CommandButton2_Click()
    Dim iNoLigne As Integer
    
    Application.ScreenUpdating = False
    iNoLigne = ActiveCell.Row ' On récupère le N° de la ligne courante
    With Range("A" & iNoLigne & ":C" & iNoLigne)
        ' On supprime la ligne courante
        .Resize(1).EntireRow.Delete
    End With
    Application.ScreenUpdating = True
    ActiveCell.Select
End Sub

Mon Problème :
Lorsque je supprime une ligne, TOUTES les cellules contenant "MaFonction" perdent le résultat généré par "MaFonction" et affichent "#VALEUR!".
Pour mémoire, lorsque j'insére une ligne via le bouton "Insérer ligne", tout est OK, je ne perd pas l'affichage du résultat de calcul pour chaque ligne.

Quelqu'un peut-il me dire comment corriger ce problème.
D'avance MERCI.

Cordialement
oracle7 :):):)
 
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : ma fonction retourne #VALEUR! lors de la suppression d'une ligne

Re...
Vu !
Je crois avoir compris. Confirmez-le moi :
Si, dans la liste :
______ID_________________NIV
___1__SMP_________________1_
___2__SMP01_______________2_
___3__SMP02_______________2_
___4__SMP02AAA____________3_
___5__SMP02AAB____________3_
___6__SMP02AAB001_________4_
___7__SMP02AAB002_________4_
___8__SMP02AAC____________3_
___9__SMP02AAD____________3_
__10__SMP03_______________2_
__11__SMP03AAA____________3_
__12__SMP03AAA001_________4_
__13__SMP03AAA001AA_______5_
__14__SMP03AAA001AA01_____6_
__15__SMP03AAA001AA01AA___7_
__16__SMP03AAA001AA01AA1__8_
__17__SMP03AAA002_________4_
__18__SMP03AAB____________3_
__19__SMP03AAC____________3_
__20__SMP04_______________2_
je supprime les items 6 et 10, je dois obtenir la liste :
______ID_________________NIV
___1__SMP_________________1_
___2__SMP01_______________2_
___3__SMP02_______________2_
___4__SMP02AAA____________3_
___5__SMP02AAB____________3_
___6__SMP02AAB001_________4_
___7__SMP02AAC____________3_
___8__SMP02AAD____________3_
___9__SMP02AAE____________3_
__10__SMP02AAE001_________4_
__11__SMP02AAE001AA_______5_
__12__SMP02AAE001AA01_____6_
__13__SMP02AAE001AA01AA___7_
__14__SMP02AAE001AA01AA1__8_
__15__SMP02AAE002_________4_
__16__SMP02AAF____________3_
__17__SMP02AAG____________3_
__18__SMP03_______________2_
__19________________________
__20________________________
Autrement dit, la suppression d'un item impose le contrôle, et éventuellement la correction, de tous les items qui suivent.
Est-ce cela ?
ROGER2327
#2240
 

ROGER2327

XLDnaute Barbatruc
Re : ma fonction retourne #VALEUR! lors de la suppression d'une ligne

Suite...
Rien à voir avec le fond du problème, mais vous disiez plus haut :
Edit : Désolé la mise en forme n'est pas conservée et ce qui était aligné initialement, ne le reste pas !
C'est effectivement un problème qui ne facilite pas la lecture. Pour ma part, j'utilise la feuille que je joins pour préparer le code des tableaux à trois colonnes. C'est pratique, pourvu qu'on colle le code avec la police à espacement fixe "Courier New".​
ROGER2327
#2241
 

Pièces jointes

  • _tableau.zip
    7.2 KB · Affichages: 23

oracle7

XLDnaute Nouveau
Re : ma fonction retourne #VALEUR! lors de la suppression d'une ligne

@ ROGER 2327

Bonjour,

Désolé mais ce n'est pas tout à fait cela .

1 - dans le cas de la suppression de l'item 6 cela provoque un décalage vers le haut de toutes les lignes.
La liste initiale devient :
______ID_________________NIV
___1__SMP_________________1_
___2__SMP01_______________2_
___3__SMP02_______________2_
___4__SMP02AAA____________3_
___5__SMP02AAB____________3_
___6__SMP02AAB002_________4_
___7__SMP02AAC____________3_
___8__SMP02AAD____________3_
___9__SMP03_______________2_
__10__SMP03AAA____________3_
__11__SMP03AAA001_________4_
__12__SMP03AAA001AA_______5_
__13__SMP03AAA001AA01_____6_
__14__SMP03AAA001AA01AA___7_
__15__SMP03AAA001AA01AA1__8_
__16__SMP03AAA002_________4_
__17__SMP03AAB____________3_
__18__SMP03AAC____________3_
__19__SMP04_______________2



2 - dans le cas de la suppression de la ligne 10 alors tous les éléments dépendants de l'élément 10 de la ligne initiale (SMP03) doivent disparaitre.
La liste initiale devient :
______ID_________________NIV
___1__SMP_________________1_
___2__SMP01_______________2_
___3__SMP02_______________2_
___4__SMP02AAA____________3_
___5__SMP02AAB____________3_
___6__SMP02AAB001_________4_
___7__SMP02AAB002_________4_
___8__SMP02AAC____________3_
___9__SMP02AAD____________3_
__10__SMP04_______________2_


Pour mémoire, je ne l'avais pas dit précédemment, Tout identifiant attribué une fois ne peut être réattribué à un élément. Ce qui complique la procédure de calcul.

Est-ce plus clair maintement ?

Merci et bon courage pour la suite de l'analyse.

Cordialement
oracle7 :):):)

Ps : Désolé mais même avec l'usage de la police Courrier New, je n'arrive pas à aligner les valeurs (C/C depuis word). J'ai donc remplacer les "espaces" par des "_".
 

ROGER2327

XLDnaute Barbatruc
Re : ma fonction retourne #VALEUR! lors de la suppression d'une ligne

Re...
Pour mémoire, je ne l'avais pas dit précédemment, Tout identifiant attribué une fois ne peut être réattribué à un élément. Ce qui complique la procédure de calcul.
Ça complique sérieusement !
(Ce que j'avais proposé il y a quelque jours n'était pas un pis aller : c'était un hors sujet complet.)
Est-ce plus clair maintement ?
Oui. Mais il y a encore une incertitude.
Je reprends la situation de l'exemple précédent :
Code:
[COLOR="DarkSlateGray"][B]
LISTE A

[COLOR="White"]____[/COLOR][COLOR="White"]__[/COLOR]ID[COLOR="White"]__________________[/COLOR]NIV[COLOR="White"][/COLOR]
[COLOR="White"]___[/COLOR]1[COLOR="White"]__[/COLOR]SMP[COLOR="White"]_________________[/COLOR]1[COLOR="White"]__[/COLOR]
[COLOR="White"]___[/COLOR]2[COLOR="White"]__[/COLOR]SMP01[COLOR="White"]_______________[/COLOR]2[COLOR="White"]__[/COLOR]
[COLOR="White"]___[/COLOR]3[COLOR="White"]__[/COLOR]SMP02[COLOR="White"]_______________[/COLOR]2[COLOR="White"]__[/COLOR]
[COLOR="White"]___[/COLOR]4[COLOR="White"]__[/COLOR]SMP02AAA[COLOR="White"]____________[/COLOR]3[COLOR="White"]__[/COLOR]
[COLOR="White"]___[/COLOR]5[COLOR="White"]__[/COLOR]SMP02AAB[COLOR="White"]____________[/COLOR]3[COLOR="White"]__[/COLOR]
[COLOR="White"]___[/COLOR]6[COLOR="White"]__[/COLOR]SMP02AAB001[COLOR="White"]_________[/COLOR]4[COLOR="White"]__[/COLOR]
[COLOR="White"]___[/COLOR]7[COLOR="White"]__[/COLOR]SMP02AAB002[COLOR="White"]_________[/COLOR]4[COLOR="White"]__[/COLOR]
[COLOR="White"]___[/COLOR]8[COLOR="White"]__[/COLOR]SMP02AAC[COLOR="White"]____________[/COLOR]3[COLOR="White"]__[/COLOR]
[COLOR="White"]___[/COLOR]9[COLOR="White"]__[/COLOR]SMP02AAD[COLOR="White"]____________[/COLOR]3[COLOR="White"]__[/COLOR]
[COLOR="White"]__[/COLOR]10[COLOR="White"]__[/COLOR]SMP03[COLOR="White"]_______________[/COLOR]2[COLOR="White"]__[/COLOR]
[COLOR="White"]__[/COLOR]11[COLOR="White"]__[/COLOR]SMP03AAA[COLOR="White"]____________[/COLOR]3[COLOR="White"]__[/COLOR]
[COLOR="White"]__[/COLOR]12[COLOR="White"]__[/COLOR]SMP03AAA001[COLOR="White"]_________[/COLOR]4[COLOR="White"]__[/COLOR]
[COLOR="White"]__[/COLOR]13[COLOR="White"]__[/COLOR]SMP03AAA001AA[COLOR="White"]_______[/COLOR]5[COLOR="White"]__[/COLOR]
[COLOR="White"]__[/COLOR]14[COLOR="White"]__[/COLOR]SMP03AAA001AA01[COLOR="White"]_____[/COLOR]6[COLOR="White"]__[/COLOR]
[COLOR="White"]__[/COLOR]15[COLOR="White"]__[/COLOR]SMP03AAA001AA01AA[COLOR="White"]___[/COLOR]7[COLOR="White"]__[/COLOR]
[COLOR="White"]__[/COLOR]16[COLOR="White"]__[/COLOR]SMP03AAA001AA01AA1[COLOR="White"]__[/COLOR]8[COLOR="White"]__[/COLOR]
[COLOR="White"]__[/COLOR]17[COLOR="White"]__[/COLOR]SMP03AAA002[COLOR="White"]_________[/COLOR]4[COLOR="White"]__[/COLOR]
[COLOR="White"]__[/COLOR]18[COLOR="White"]__[/COLOR]SMP03AAB[COLOR="White"]____________[/COLOR]3[COLOR="White"]__[/COLOR]
[COLOR="White"]__[/COLOR]19[COLOR="White"]__[/COLOR]SMP03AAC[COLOR="White"]____________[/COLOR]3[COLOR="White"]__[/COLOR]
[COLOR="White"]__[/COLOR]20[COLOR="White"]__[/COLOR]SMP04[COLOR="White"]_______________[/COLOR]2[COLOR="White"]__[/COLOR][/B][/COLOR]
Je supprime les deux lignes 6 et 9. J'obtiens :
Code:
[COLOR="DarkSlateGray"][B]
LISTE B

[COLOR="White"]____[/COLOR][COLOR="White"]__[/COLOR]ID[COLOR="White"]__________________[/COLOR]NIV[COLOR="White"][/COLOR]
[COLOR="White"]___[/COLOR]1[COLOR="White"]__[/COLOR]SMP[COLOR="White"]_________________[/COLOR]1[COLOR="White"]__[/COLOR]
[COLOR="White"]___[/COLOR]2[COLOR="White"]__[/COLOR]SMP01[COLOR="White"]_______________[/COLOR]2[COLOR="White"]__[/COLOR]
[COLOR="White"]___[/COLOR]3[COLOR="White"]__[/COLOR]SMP02[COLOR="White"]_______________[/COLOR]2[COLOR="White"]__[/COLOR]
[COLOR="White"]___[/COLOR]4[COLOR="White"]__[/COLOR]SMP02AAA[COLOR="White"]____________[/COLOR]3[COLOR="White"]__[/COLOR]
[COLOR="White"]___[/COLOR]5[COLOR="White"]__[/COLOR]SMP02AAB[COLOR="White"]____________[/COLOR]3[COLOR="White"]__[/COLOR]
[COLOR="White"]___[/COLOR]6[COLOR="White"]__[/COLOR]SMP02AAB002[COLOR="White"]_________[/COLOR]4[COLOR="White"]__[/COLOR]
[COLOR="White"]___[/COLOR]7[COLOR="White"]__[/COLOR]SMP02AAC[COLOR="White"]____________[/COLOR]3[COLOR="White"]__[/COLOR]
[COLOR="White"]___[/COLOR]8[COLOR="White"]__[/COLOR]SMP02AAD[COLOR="White"]____________[/COLOR]3[COLOR="White"]__[/COLOR]
[COLOR="White"]___[/COLOR]9[COLOR="White"]__[/COLOR]SMP04[COLOR="White"]_______________[/COLOR]2[COLOR="White"]__[/COLOR]
[COLOR="White"]__[/COLOR]10[COLOR="White"]__[/COLOR][COLOR="White"]____________________[/COLOR][COLOR="White"]___[/COLOR]
[COLOR="White"]__[/COLOR]11[COLOR="White"]__[/COLOR][COLOR="White"]____________________[/COLOR][COLOR="White"]___[/COLOR][/B][/COLOR]
conformément au complément d'information de votre dernier message.
Jusque là tout va bien.
Maintenant, j'insère une ligne entre les lignes 8 et 9 de la liste B. Je mets 2 dans la colonne NIV :
Code:
[COLOR="DarkSlateGray"][B]
Liste C

[COLOR="White"]____[/COLOR][COLOR="White"]__[/COLOR]ID[COLOR="White"]__________________[/COLOR]NIV[COLOR="White"][/COLOR]
[COLOR="White"]___[/COLOR]1[COLOR="White"]__[/COLOR]SMP[COLOR="White"]_________________[/COLOR]1[COLOR="White"]__[/COLOR]
[COLOR="White"]___[/COLOR]2[COLOR="White"]__[/COLOR]SMP01[COLOR="White"]_______________[/COLOR]2[COLOR="White"]__[/COLOR]
[COLOR="White"]___[/COLOR]3[COLOR="White"]__[/COLOR]SMP02[COLOR="White"]_______________[/COLOR]2[COLOR="White"]__[/COLOR]
[COLOR="White"]___[/COLOR]4[COLOR="White"]__[/COLOR]SMP02AAA[COLOR="White"]____________[/COLOR]3[COLOR="White"]__[/COLOR]
[COLOR="White"]___[/COLOR]5[COLOR="White"]__[/COLOR]SMP02AAB[COLOR="White"]____________[/COLOR]3[COLOR="White"]__[/COLOR]
[COLOR="White"]___[/COLOR]6[COLOR="White"]__[/COLOR]SMP02AAB002[COLOR="White"]_________[/COLOR]4[COLOR="White"]__[/COLOR]
[COLOR="White"]___[/COLOR]7[COLOR="White"]__[/COLOR]SMP02AAC[COLOR="White"]____________[/COLOR]3[COLOR="White"]__[/COLOR]
[COLOR="White"]___[/COLOR]8[COLOR="White"]__[/COLOR]SMP02AAD[COLOR="White"]____________[/COLOR]3[COLOR="White"]__[/COLOR]
[COLOR="White"]___[/COLOR][COLOR="Red"]9[/COLOR][COLOR="White"]__[/COLOR][COLOR="White"]____________________[/COLOR][COLOR="Red"]2[/COLOR][COLOR="White"]__[/COLOR]
[COLOR="White"]__[/COLOR]10[COLOR="White"]__[/COLOR]SMP04[COLOR="White"]_______________[/COLOR]2[COLOR="White"]__[/COLOR]
[COLOR="White"]__[/COLOR]11[COLOR="White"]__[/COLOR][COLOR="White"]____________________[/COLOR][COLOR="White"]___[/COLOR][/B][/COLOR]
Ma question : Quelle est la ligne 9 correcte ?
Code:
[COLOR="DarkSlateGray"][B]1ère réponse :

[COLOR="White"]___[/COLOR]9[COLOR="White"]__[/COLOR]SMP0[COLOR="Red"][SIZE="4"]5[/SIZE][/COLOR][COLOR="White"]_______________[/COLOR]2[COLOR="White"]__[/COLOR][/B]

[B]Deuxième réponse :

[COLOR="White"]___[/COLOR]9[COLOR="White"]__[/COLOR]SMP0[COLOR="Red"][SIZE="4"]3[/SIZE][/COLOR][COLOR="White"]_______________[/COLOR]2[COLOR="White"]__[/COLOR][/B][/COLOR]
Si la règle de non réutilisation d'une valeur supprimée est stricte, on doit choisir la première solution puisque SMP03 a déjà été utilisée.
Au contraire, si la bonne réponse est la deuxième, la règle sur la non réutilisation d'une valeur supprimée n'est pas absolue et doit être précisée.

Cette question est essentielle : si la première réponse est la bonne, il est clair que les suppressions et insertions de lignes ne peuvent pas être gérées sur la base de l'état de la liste à l'instant où elles sont exécutées. Il faudra conserver un historique complet de l'évolution de la feuille depuis sa création. Faisable, mais il faudra être minutieux...
ROGER2327
#2243
 

Lii

XLDnaute Impliqué
Re : ma fonction retourne #VALEUR! lors de la suppression d'une ligne

Bonjour,

Gros problème que celui-ci !
Les fonction, fonctionnent-elles ?
Avec le premier fichier joint, on se retrouve avec un 0 dès la validation d'une saisie (ajout ou pas de ligne, suppression ou pas de ligne).
Dans les functions, après avoir fait le ménage, il y a quelques lignes pour lesquelles je ne comprends pas l'initialisation de variable.

En essayant de reconstruire les LCN, je tombe sur un détail qui n'ennuie :
Comment les suites doivent-elles être créées (non seulement nombre de caractères mais aussi leur logique)?
Pourquoi :
4 SMP02AAA 3 ? (à la première apparition du 3)
Je pensais qu'avec, code2 = Commence à "01" et fini à "ZZ", on aurait
4 SMP01AAA 3 ?
Pourquoi :
6 SMP02AAB001 4 ? (à la première apparition du 4)
Je pensais qu'on aurait
6 SMP01AAA001 4 ?

A moins qu'il y ait eu , auparavant, suppression de lignes sans mise à jour intégrale ?
Pour ne pas manquer d'aplomb, j'en suis arrivé au même questionnement que ROGER et je ne m'en sors pas :eek: !

 

oracle7

XLDnaute Nouveau
Re : ma fonction retourne #VALEUR! lors de la suppression d'une ligne

@ ROGER2327
Bonsoir,

Ma question : Quelle est la ligne 9 correcte ?


Code:
1ère réponse :

___9__SMP05_______________2__

Deuxième réponse :

___9__SMP03_______________2__


Effectivement la 1ère réponse est la bonne. Tu as parfaitement compris.
___9__SMP05_______________2__

Cette question est essentielle : si la première réponse est la bonne, il est clair que les suppressions et insertions de lignes ne peuvent pas être gérées sur la base de l'état de la liste à l'instant où elles sont exécutées. Il faudra conserver un historique complet de l'évolution de la feuille depuis sa création.

Je n'en suis pas sûr ! (pour la gestion d'un historique s'entend). Je m'explique :

1 - Dans le cas d'une insertion de ligne, l'état de la liste à l'instant "T" importe peu dans le sens où la fonction de calcul lors de la saisie d'un aplomb, va rechercher toutes les lignes correspondantes du même niveau d'aplomb pour prendre la plus grande valeur d'identifiant (LCN) trouvée, l'incrémenter et donc fournir le nouveau LCN. Ainsi je suis sûr de ne pas réaffecter donc réutiliser un "ancien" identifiant (LCN). J'incrémente systématiquement donc j'utilise forcément une nouvelle valeur.

2 - Dans le cas d'une suppression de ligne, à priori la seule raison (mais je peux me tromper !) qui voudrait que l'on conserve l'historique complet de l'évolution de la feuille depuis sa création, est celle-ci : pouvoir visualiser les lignes qui existaient avant suppression. Auquel cas ce n'est pas une suppression pure et dure qu'il faut faire mais un "marquage" de ces lignes pour les invalider. Le problème est alors que l'on risque de faire cohabiter l'une à coté de l'autre une ligne dite supprimée ou invalide avec la nouvelle version de cette ligne par exemple qui serait quelque peu différente. D'où, à l'exploitation globale des données (visualisation) un risque important de confusion . Je suis bien conscient de ce problème et je n'ai pas encore choisi la méthode finale à savoir la suppression i.e. l'effacement ou le marquage pour invalidation.
Pour l'heure, avant de m'attaquer à cet aspect du problème, j'essaie de traiter de façon générique la suppression d'une ligne.
Ce n'est pas gagné car d'entrée je rencontre le problème du "#VALEUR!" évoqué à l'origine du post. Si tu regardes bien le code de mon bouton supprimer, il ne supprime seulement qu'une ligne : "froidement" !
Lorsque ce point sera réglé alors je regarderai de plus près le processus de suppression/invalidation de lignes en commençant par supprimer/invalider les lignes de décomposition associées à l'élément que je souhaite supprimer/invalider. Pour reprendre ton exemple cela correspond à la suppression de la ligne 9 après la 6 dans la liste A pour obtenir effectivement la liste B.

3 - Je reviens sur une question que je t'avais posée précédemment. Comme ma fonction de calcul utilise la cellule active que cet usage provoque le "pata caisse" lorsqu'une modification est faite ailleurs dans la feuille, si dès l'entrée dans la fonction je contrôle la position de la cellule active et que si celle-ci se trouve ne pas être dans la plage de données correspondant aux niveaux d'aplomb, j'impose la sortie de la fonction, ne serait-ce pas finalement la solution ? En plus cela aurait le mérite de n'apporter qu'un minimum de modifications au code existant, non ?


@ Lii
Bonsoir,

Je vais essayer de répondre à tes interrogations :
Pourquoi :
4 SMP02AAA 3 ? (à la première apparition du 3)
Je pensais qu'avec, code2 = Commence à "01" et fini à "ZZ", on aurait
4 SMP01AAA 3 ?
Pourquoi :
6 SMP02AAB001 4 ? (à la première apparition du 4)
Je pensais qu'on aurait
6 SMP01AAA001 4 ?

Désolé, mais non : dans le premier cas, l'apparition du niveau 3 se fait pour le 2ème élément du niveau 2.Dans le second cas, l'apparition du niveau 4 se fait pour le 2ème élément du niveau 3 lui même appartenant au 2ème élément du niveau 2.
Je prend un exemple simple pour clarifier le raisonnement.

Le 1er élément (un père) est codé "SMP" --> niveau 1
Supposons que ce père ait 3 fils --> les fils constituent le niveau 2 de parenté
Chaque fils sera donc codé respectivement "SMP01", "SMP02" et "SMP03"
Supposons maintenant que le 2 ème fils ait lui aussi 3 enfants ces petits enfants du père constituent le niveau 3 de parenté
Chaque enfants du 2 ème fils du père sera alors codé telque "SMP02AAA", "SMP02AAB" et "SMP02AAC".

Pour représenter la famille de façon ainsi codifiée on aurait :

ID___________________Niveau___________Parenté
SMP___________________1_________________Père
SMP01_________________2_________________Fils_ainé
SMP02_________________2_________________Fils_cadet
SMP02AAA______________3______________________Fils_ainé_du_fils_cadet
SMP02AAB______________3______________________Fils_cadet_du_fils_cadet
SMP02AAC______________3______________________Fille_du_fils_cadet
SMP03_________________2_________________Fils_(petit_dernier)_du_père

Et ainsi de suite pour coder toute une descendance généalogique par exemple. (je ne traite pas des mariages ...)

Est-ce plus clair maintenant ?

Dans tous les cas MERCI à tous les deux de votre aimable coopération.
Cordialement
oracle7 :):):)
 

ROGER2327

XLDnaute Barbatruc
Re : ma fonction retourne #VALEUR! lors de la suppression d'une ligne

Re...
Une réponse rapide : merci pour les précisions.
Pour le point 1., pas de remarque particulière.
Pour le point 2., c'est plus délicat. Dans l'exemple d'hier, la bonne réponse était SMP05. Mais si après avoir effacé SMP03, on avait aussi effacé SMP04, à l'insertion suivante, il faudrait quand même mettre SMP05. Comment le savoir si [/B] SMP04 a disparu ?
Il faut donc conserver une trace des valeurs supprimées.
Pour le point 3., je ne vois pas (pour l'instant) comment s'en sortir avec une fonction répétée des milliers de fois dans la feuille...
Je n'ai pas eu beaucoup de temps pour y travailler, mais j'ai un classeur d'étude qui avance petit à petit. Il est encore trop brouillon pour être déposé ici, mais je pense pouvoir vous le communiquer dans quelques jours.
A suivre...​
ROGER2327
#2246
 
Dernière édition:

oracle7

XLDnaute Nouveau
Re : ma fonction retourne #VALEUR! lors de la suppression d'une ligne

@ ROGER2327

Bonjour,

1 - Finalement, après réflexion et aux vues de tes remarques qui m'ont "ouvert" les yeux , il se trouve que ma réponse relative au point 1 dans le précédent post ne tient plus. En effet, elle n'était valable que tant qu'il existait dans le tableau une valeur d'identifiant qui soit la valeur maximum attribuée.
Où cela ne marche plus, c'est quand on a déjà supprimé au par-avant la valeur maximum, eh bien cette dernière est aujourd'hui dans l'état, réattribuée par la formule de calcul.
Je m'explique avec un exemple :
- Supposons que pour le niveau 3 j'ai 3 éléments : SMP01AAA, SMP01AAB et SMP01AAC.
- Je supprime le dernier élément du niveau 3 soit SMP01AAC.
- Bien plus tard, je crée un nouvel élément pour le niveau 3 mais à la suite de ceux existant.​
En toute logique, cet élément devrait être codé SMP01AAD pour respecter la règle impérative de non réutilisation d'un identifiant déjà attribué. Mais aujourd'hui telle qu'est codée ma fonction en prenant la valeur maximum existante trouvée (SMP01AAB) et en l'incrémentant j'obtiens SMP01AAC. Ce qui ne respecte pas du tout la règle métier imposée.

Du coup, je m'excuse de t'avoir alors contre dit, tu avais complètement raison en disant qu'il faut gérer l'historique complet de l'évolution de la feuille depuis sa création pour obtenir les bonnes valeurs d'identifiant. Je n'avais pas assez poussé le raisonnement. De fait cela va compliquer sérieusement le processus de calcul ! Pas grave tant que je ne crée pas une "usine à gaz" !
Donc en mettant en place cette gestion d'historique cela répondrait aussi au besoin de suivi pour les suppressions de lignes.
Reste tout de même à choisir la manière de le faire. Laisser les lignes affichées mais marquées invalidées avec les risques de confusion déjà évoqués ou bien masquer à l'opérateur (si c'est possible ?) ces lignes invalides ou encore gérer ailleurs la liste des identifiants déjà attribués et marqués comme invalides ? Qu'en penses-tu ?

2 - Pour le point 3, effectivement ce n'est pas simple, j'ai émis cette idée mais il y a surement une autre solution. Laissons "murir" je pense que cela viendra tout seul de fil en aiguille ...

Sur ce je te laisse travailler. MERCI encore vivement de ton aide efficace.
Bon WE
Cordialement
oracle7 :):):)
 

ROGER2327

XLDnaute Barbatruc
Re : ma fonction retourne #VALEUR! lors de la suppression d'une ligne

Re...
@ ROGER2327(...)
il faut gérer l'historique complet de l'évolution de la feuille depuis sa création pour obtenir les bonnes valeurs d'identifiant. Je n'avais pas assez poussé le raisonnement. De fait cela va compliquer sérieusement le processus de calcul ! Pas grave tant que je ne crée pas une "usine à gaz" !
Donc en mettant en place cette gestion d'historique cela répondrait aussi au besoin de suivi pour les suppressions de lignes.
Reste tout de même à choisir la manière de le faire. Laisser les lignes affichées mais marquées invalidées avec les risques de confusion déjà évoqués ou bien masquer à l'opérateur (si c'est possible ?) ces lignes invalides ou encore gérer ailleurs la liste des identifiants déjà attribués et marqués comme invalides ? Qu'en penses-tu ?
(...)
Bonjour,
Je travaille sur une solution utilisant une feuille supplémentaire dans laquelle je conserve les identifiants effacés de la feuille de travail. Je voudrais savoir si c'est possible, c'est-à-dire s'il n'y a de contrainte sur la structure de votre classeur réel qui interdirait d'y ajouter une feuille.
S'il existe une telle contrainte, il est inutile que je poursuive dans cette voie.
Au contraire, s'il n'y a pas de contrainte de ce genre, mon idée est, pour des raisons d'encombrement, de conserver dans cette feuille non pas tous les identifiants mais seulement les valeurs effacées. Dès lors, à la création d'un identifiant, il suffira de tenir compte des valeurs effectivement présentes dans la feuille principale et de celles conservées dans la feuille auxiliaire.
Que pensez-vous de cela ?
@ ROGER2327(...)
Laissons "murir" je pense que cela viendra tout seul de fil en aiguille ...
(...)
Ce serait trop beau ! Mais on y arrivera...
A bientôt.​
ROGER2327
#2251
 

oracle7

XLDnaute Nouveau
Re : ma fonction retourne #VALEUR! lors de la suppression d'une ligne

@ ROGER2327

Bonjour,

Au contraire, s'il n'y a pas de contrainte de ce genre, mon idée est, pour des raisons d'encombrement, de conserver dans cette feuille non pas tous les identifiants mais seulement les valeurs effacées. Dès lors, à la création d'un identifiant, il suffira de tenir compte des valeurs effectivement présentes dans la feuille principale et de celles conservées dans la feuille auxiliaire.
Que pensez-vous de cela ?

1 - AUCUN PROBLÈME ! ROGER2327, l'idée est intéressante et je t'invite chaleureusement à poursuivre ta réflexion dans ce sens.
Personnellement, je l'avais écartée initialement pour faire au plus simple (je suis un peu fainéant parfois !), mais au fil de nos échanges je constate qu'il n'y a pas vraiment le choix et que c'est la meilleure solution à mettre en œuvre. Alors Banco !
Je me me permettrais peut être , si tu le veux bien, d'y ajouter une petite restriction : c'est juste pour éviter que l'utilisateur final vienne mettre "son nez" si je puis dire, dans le contenu de cette feuille d'historique.
En clair y-a-t-il moyen de la masquer ou à défaut de lui en interdire l'accès ? Seul l'administrateur aurait ce pouvoir. Car sinon on est pas à l'abri d'apprentis sorciers ...
Ce n'est qu'une suggestion, si ce n'est pas possible ne t'embarrasse pas avec cette demande de protection, alors je fixerais une règle métier dans ce sens.

2 -
Envoyé par ROGER2327
@ oracle7(...)
Ce serait trop beau ! Mais on y arrivera...
(...)

C'est vraiment SUPER de rencontrer ici qq'un d'aussi optimiste et qui a manifestement envie de solutionner le problème en question.

A bientôt de te lire et bon courage !
Cordialement
oracle7:):):)
 

ROGER2327

XLDnaute Barbatruc
Re : ma fonction retourne #VALEUR! lors de la suppression d'une ligne

Re...
@ ROGER2327(...)
1 - AUCUN PROBLÈME ! ROGER2327, l'idée est intéressante
(...)
...donc je poursuis dans cette voie.
(...)
une petite restriction : c'est juste pour éviter que l'utilisateur final vienne mettre "son nez" si je puis dire, dans le contenu de cette feuille d'historique.
En clair y-a-t-il moyen de la masquer ou à défaut de lui en interdire l'accès ?
(...)
Un masquage de la feuille annexe, voire une protection, n'est pas un gros obstacle.
Je n'y travaillerai pas beaucoup dans les deux ou trois jours qui viennent, mais je devrais pouvoir vous proposer quelque chose vers le milieu ou la fin de la semaine prochaine.
A suivre donc...
ROGER2327
#2256
 

ROGER2327

XLDnaute Barbatruc
Re : ma fonction retourne #VALEUR! lors de la suppression d'une ligne

Bonsoir
Voici une proposition. Voyez si le fonctionnement correspond à votre attente.
Il s'agit d'une version de travail qui peut être améliorée. Pour l'instant, j'utilise des plages nommées. On pourra s'en passer en fignolant le code si nécessaire.
Conformément à nos conclusions communes, il y a une feuille cachée (SERVICE) pour gérer les suppressions d'entrées. Si on veut réinitialiser le projet, il faut démasquer cette feuille et la vider entièrement (sans supprimer ou même modifier les plages nommées qu'elle contient). Il y a certainement des choses à corriger ici ou là. Voyez si le fonctionnement correspond à peu près à vos attentes et faites moi part de vos remarques.​
A bientôt.
ROGER2327
#2301

_
_
Pièce jointe supprimée. Voir le message suivant.
_
_
 
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : ma fonction retourne #VALEUR! lors de la suppression d'une ligne

Suite...
Après une série de tests, j'ai apporté quelques modifications.
L'une pour corriger une erreur dans l'engendrement des identifiants.
Les autres pour augmenter la vitesse d'insertion d'un identifiant, la version d'hier étant beaucoup trop lente dès lors que le tableau comporte quelques milliers de lignes.
Je joins cette nouvelle version et supprime celle d'hier.​
ROGER2327
#2310
 

Pièces jointes

  • VBA_BAR_F_Calcul_Arbo_2310.zip
    13.2 KB · Affichages: 14

oracle7

XLDnaute Nouveau
Re : ma fonction retourne #VALEUR! lors de la suppression d'une ligne

@ ROGER 2327

Bonsoir,

Désolé de ne pas avoir répondu plus tôt, mais j'ai pris mon temps pour analyser à fond ta proposition.

1 - Tout d'abord, je tiens à te remercier pour l'excellent travail que tu as produit. A son examen, je mesure pleinement le fossé qui nous sépare en termes de connaissance et maitrise du langage VBA. Je ne suis qu'un "noob" en la matière. Cela dit c'est extrêmement enrichissant pour moi car je découvre dans ton code des aspects et techniques que je n'imaginais pas encore. Ma programmation en VBA était vraiment "basique" en comparaison. Du coup cela m'ouvre les yeux et m'inspire dans ma réflexion pour d'autres sujets que j'ai sous le coude aujourd'hui. Je suis aussi agréablement étonné de la compacité du code que tu as généré. Moi qui en avait des pages ... comme quoi on peut aussi faire court et compact !

2 - Même si c'est une version de travail et comme tu le dis "qui pourrait être fignolée", elle répond quasiment à mon besoin ou tout du moins tu y es presque.
Mais rassures-toi, ce qui manque n'est pas rédhibitoire.
Donc après examen du code, voici mes commentaires :

a) Globalement le processus fait ce qu'il faut faire selon ce que je t'ai transmis comme explications et aux vues de mon code initial que tu as du déchiffrer pour en comprendre les tenants et aboutissants.

b) Le 1er point qui semble incomplet réside dans la gestion des valeurs admissibles en saisie pour un niveau, notamment suite à une insertion de ligne. Mais là , je conçois que n'ayant pas en tête toutes les règles métier, tu ne pouvais pas forcément les deviner ou les anticiper. Comme il s'agit d'un descriptif de décomposition fonctionnelle de système, il y a une logique d'agencement à respecter. La fonction d'insertion ne doit pas permettre d'insérer n'importe quelle valeur à un point donné. La logique de décomposition doit rester cohérente. Tout comme la suppression d'une ligne doit s'accompagner de la suppression de toutes les lignes "filles". Mais cela tu le réalises impeccablement du moins pour les tests que j'ai effectués.

Par exemple :
- on ne peut insérer une ligne de niveau 1 que si et seulement si il n'existe pas déjà une ligne de ce niveau pour un bigramme donné. En clair : un niveau 1 pour un bigramme et un seul. Sinon aujourd'hui le code tel qu'il est accepte une telle insertion et lorsqu'on supprime cette nouvelle ligne de niveau 1 introduite, c'est l'ensemble des valeurs de LCN calculées qui sont supprimées donc inacceptable.

- lorsque l'on insère une ligne avec un nouveau niveau W entre 2 lignes de niveau X et Y (avec X=Y ou (X<>Y et X<Y)), il faut que la valeur W saisie respecte les conditions suivantes (j'essaie de traduire celles-ci en pseudo code) sinon on ne doit pas la prendre en compte :

si W>=Y alors
___ si W>=X alors
______ si W-X>1 alors
_________ Erreur on rejette la valeur saisie W
______ sinon
_________ OK la valeur est acceptée
______ fsi
___ sinon
______ OK la valeur est acceptée
___ fsi
sinon
___ Erreur qq soit W par rapport à X on rejette W
fsi​

c) le second point qui m'interroge : je n'ai pas encore testé tout le processus d'incrémentation mais d'ors et déjà j'ai une crainte quant à sa bonne exécution. Mais je peux me tromper (je l'espère !).
Donc à la vue de ton code, je ne suis pas sûr que l'incrémentation soit correcte notamment lors du passage d'une séquence num vers alpha et inversement.

Voici donc ci-dessous le séquencement qui m'est imposé :
NIV 1 : constante : "S"
NIV 2 : Alphabétique : Bigramme : "XX"
NIV 3 : Numérique : 01... 99, 0A... 0Z, 1A, 1B... 9A... 9Z, AA... AZ, BA... BZ... ZZ soit 915 combinaisons
NIV 4 : Alphanumérique : AAA... ZZZ, A0A... A9A... Z0Z... Z9Z soit 19584 combinaisons
NIV 5 : NumériqueAlpha : 001... 999, 0A0... 0A9... 0Z0... 9Z9 soit 3399 combinaisons
NIV 6 : Alphabétique : AA... AZ, BA... BZ... ZZ, A0... A9... Z0... Z9, 00... 99 soit 916 combinaisons
NIV 7 : Numérique : 01... 99, 0A... 0Z, 1A, 1B... 9A... 9Z, AA... AZ, BA... BZ... ZZ soit 915 combinaisons
NIV 8 : Alphabétique : AA... AZ, BA... BZ... ZZ, A0... A9... Z0... Z9, 00... 99 soit 916 combinaisons
NIV 9 : Numérique : 1... 9, A... Z soit 33 combinaisons

AVEC DANS TOUS LES CAS LES LETTRES "I" et "O" EXCLUES DES SÉQUENCES

Je suis bien conscient que cela complique forcément les choses compte-tenu de la méthode que tu as retenue dans ton code à ce jour. Vois ce que tu peux faire sinon j'essaierai de le faire moi même mais cela va pas être facile ...

Voilà donc le résultat de mon analyse. A part le pb du processus d'incrémentation qui est plus complexe que prévu, c'est bon. Encore une fois félicitations pour ton travail.

Dans l'attente de te lire et de répondre à d'éventuelles autres questions.
A bientôt et encore MERCI
Cordialement
oracle7 :):):)
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 215
Messages
2 086 332
Membres
103 188
dernier inscrit
evebar