XL 2016 Vba + formule actualisation

frazenbe1976

XLDnaute Nouveau
Bonjour à toutes et tous,

J'ai un problème pour actualiser un script par rapport au résultat d'une formule.
Je m'explique

J'extrais la date d'une chaine de caractère via cette formule :

=DATEVALUE(MID(I2;SEARCH("??/??/*";I2);10))

Ensuite, j'utilise un script qui me permet de sauvegarder l'ancienne date :

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count = 9 Then Exit Sub
If Cel = "" Then Exit Sub
Application.EnableEvents = False
Target.Offset(0, 3) = Cel
Target.Offset(0, 4) = Date
Application.EnableEvents = True
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Cel = Target.Value
End Sub

Sauf que lorsque la date de la formule change, le script ne met pas à jour les données.

Pourriez-vous m'aiguiller sur la solution

Merci d'avance

je mets un exemple d'une ligne de ma table


WOORIGINASSETPARENTLIMITATIONSPRIOSTATUSMRCDESCRIPTIONWODATELAST UPDATEDate sauvegardéeDate vérif
48841349XXXXXX93022A-E40QU-93022AE403WX02Q4===== 9602186 (user =*******) at 28/08/2026 13:48:25 ===== contact ce jour avec armement +
12/10/2021​
28/08/2026​
14/08/4789​
23/07/2024​
 

frazenbe1976

XLDnaute Nouveau
Bonjour @frazenbe1976

C'est logique et normal, l'évènement "Change" n'est activé que lorsque l'utilisateur fait une modification dans une cellule, si c'est une formule qui fait ça... rien ne peut se produire
Bonjour @wDog66

Ok, je commence à comprendre l'évènement Change, mais par quoi je pourrai le remplacer ?
Je suis novice, et j'ai un peu de mal avec les évènements VBA

Merci d'avance
 

Dudu2

XLDnaute Barbatruc
Bonjour,
Je dirais qu'il faut que tu trouves un moyen de faire un fonction personnalisée qui fait référence à la cellule que tu modifies.
Je n'ai pas compris ce que tu fais précisément (quelle cellule est modifiée, quelle cellule reçoit l'ancienne date ni à quoi sert le formule) donc je ne peux rien proposer.
 

frazenbe1976

XLDnaute Nouveau
Bonjour,
Je dirais qu'il faut que tu trouves un moyen de faire un fonction personnalisée qui fait référence à la cellule que tu modifies.
Je n'ai pas compris ce que tu fais précisément (quelle cellule est modifiée, quelle cellule reçoit l'ancienne date ni à quoi sert le formule) donc je ne peux rien proposer.
Bonjour @Dudu2 ,

La colonne Last update est mise à jour suivant la formule ( qui va rechercher la date dans Description )
Date Sauvergardée fait référence à la date ( Qui se trouve dans Last Update si Last Update est modifiée via la formule )
Date Vérif ( la date du jour si modification )

J'espère avoir été clair :)

Bernard
 

Dudu2

XLDnaute Barbatruc
Je suppose aussi que ton fichier contient plusieurs lignes du type de celle que tu as copiée dans ton 1er post et que le même problème se pose pour toutes ces lignes.
Mais sans fichier difficile de savoir.
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Avec en L2 -> =SetPreviousUpdateDate(K2) et étirer ou copier sur les lignes suivantes.
VB:
Option Explicit

Private TabLastUpdateDate() As Variant
Private TabPreviousUpdateDate() As Variant
Private Const LastUpdateDateColumn = "K"
Private Const PreviousUpdateDateColumn = "L"
Private Const WorksheetNumber = 1

Function SetPreviousUpdateDate(Cell As Range) As Date
    Dim NewLastUpdateDate As Date

    With ThisWorkbook.Worksheets(WorksheetNumber)
        NewLastUpdateDate = Cell.Value
     
        If Not CDate(TabLastUpdateDate(Cell.Row, 1)) = NewLastUpdateDate Then
            TabPreviousUpdateDate(Cell.Row, 1) = TabLastUpdateDate(Cell.Row, 1)
            TabLastUpdateDate(Cell.Row, 1) = Cell.Value
        End If
     
        SetPreviousUpdateDate = CDate(TabPreviousUpdateDate(Cell.Row, 1))
    End With
End Function

Sub LoadInitialDateValues()
    With ThisWorkbook.Worksheets(WorksheetNumber)
        TabLastUpdateDate = Intersect(.UsedRange, .Columns(LastUpdateDateColumn)).Value
        TabPreviousUpdateDate = Intersect(.UsedRange, .Columns(PreviousUpdateDateColumn)).Value
    End With
End Sub

Sub auto_open()
    Call LoadInitialDateValues
End Sub

Et si des suppressions ou insertions de lignes sont à prévoir:
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    'In case of delete or insert lines
    Call LoadInitialDateValues
End Sub
 
Dernière édition:

frazenbe1976

XLDnaute Nouveau
Avec en L2 -> =SetPreviousUpdateDate(K2) et étirer ou copier sur les lignes suivantes.
VB:
Option Explicit

Private TabLastUpdateDate() As Variant
Private TabPreviousUpdateDate() As Variant
Private Const LastUpdateDateColumn = "K"
Private Const PreviousUpdateDateColumn = "L"
Private Const WorksheetNumber = 1

Function SetPreviousUpdateDate(Cell As Range) As Date
    Dim NewLastUpdateDate As Date

    With ThisWorkbook.Worksheets(WorksheetNumber)
        NewLastUpdateDate = Cell.Value
    
        If Not CDate(TabLastUpdateDate(Cell.Row, 1)) = NewLastUpdateDate Then
            TabPreviousUpdateDate(Cell.Row, 1) = TabLastUpdateDate(Cell.Row, 1)
            TabLastUpdateDate(Cell.Row, 1) = Cell.Value
        End If
    
        SetPreviousUpdateDate = CDate(TabPreviousUpdateDate(Cell.Row, 1))
    End With
End Function

Sub LoadInitialDateValues()
    With ThisWorkbook.Worksheets(WorksheetNumber)
        TabLastUpdateDate = Intersect(.UsedRange, .Columns(LastUpdateDateColumn)).Value
        TabPreviousUpdateDate = Intersect(.UsedRange, .Columns(PreviousUpdateDateColumn)).Value
    End With
End Sub

Sub auto_open()
    Call LoadInitialDateValues
End Sub

Et si des suppressions ou insertions de lignes sont à prévoir:
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    'In case of delete or insert lines
    Call LoadInitialDateValues
End Sub
Merci @Dudu2

Je teste et je te dis quoi

Bon w-e

Bernard
 

Dudu2

XLDnaute Barbatruc
Si tu fais des changements dans le code ou toute autre action qui ré-initialise le projet, pense à exécuter Auto Open() ou LoadInitialDateValues(() avant tout test sinon les tables des valeurs initiales ne seront pas chargées et ça donnera une erreur.
 
Dernière édition:

Discussions similaires

  • Résolu(e)
Microsoft 365 pb formule vba
Réponses
15
Affichages
1 K

Membres actuellement en ligne

Statistiques des forums

Discussions
314 708
Messages
2 112 090
Membres
111 416
dernier inscrit
philipperoy83