VBA effacer la valeur d'une cellule sans effacer la formule

Bonjour tous,

Après que vous ayez hier résolu ma question concernant une liste dans une cellule, un nouveau problème se présente à moi.

Dans mon application, j'ai un onglet déplacements constitué ainsi :

N° actif _ Date_Intitulé_Nombre de kilomètres effectués

dans lequel je saisi pour chaque actif la nature et le nombre de kilomètres parcouru par date.

Tous les trois ans, afin de limiter la taille de cet onglet "Deplacements", je procède en début d'année à l'archivage des déplacements dont la date et > à l'année en cours -3.

Grâce à la résolution de ma précédente question, je vais changer mon fichier "Deplacements") en mettant : N°actif(qui contiendra une formule avec decaler)_Intitule actif(qui contiendra une liste)_Date_Inttulé_Nombre de kilométres parcourus.

Actuellement, je copie les déplacements répondants au critère de date dans un fichier "SwitchDeplacements", et ceux ne répondant pas au critère de date dans un onglet "Tempdeplacements". Pour initialiser le fichier "SwitchDeplacement" et l'onglet "TempDeplacements", j'utilise pour l'objet Range la fonction ClearContents qui efface la valeur de la cellule mais aussi malheureusement la formule qu'elle contient.

Pour finir je copie la feuille"TempDeplacements" avant la feuille "Deplacements", je supprime la feuille "Deplacements" puis je renomme la feuille "TempDeplacements" en "Deplacements"

En résumé, existe t-il une fonction pour l'objet Range qui puisse uniquement effacer la valeur de la cellule sans pour autant en effacer la formule?

Ou alors est ce que je fais entièrement fausse route et que la résolution de ce problème est toute autre ?!

A toutes fins utiles, voici le code de cette procédure qui se déroule dans ThisWorkbook.

Private Sub Workbook_Open()
Dim annee
Dim annee1
Dim nombdd As String
Dim nombdd1 As String
Dim nombdd2 As String
Dim compteurlignes As Long
Dim cpteur As Long
Dim cpteur1 As Long
Dim cpteur2 As Long
Dim nblignes As Variant

Application.ScreenUpdating = False

annee = Year(Date)
annee1 = annee - 3
cpteur = 0
cpteur1 = 0
cpteur2 = 0
compteurlignes = 0
nblignes = 0
'Si l'année du 1er enregistrement est inférieure ou égale à l'année en cours -3
'Pour rappel : la feuille ("Deplacements") est triée par date en quittant Directeur.xlsm
nombdd = ("C:\TutelSoft\Trajets\") & annee1 & (".xlsm")
If Dir(nombdd) <> vbNullString Then
   Sheets("Deplacements").Select
    If Year(Range("B6").Value) <= annee1 Then
    Sheets("PAccueil").Select
    MsgBox ("Le programme a détecté un ou plusieurs déplacements datés de ") & annee1 & (" ,ou d'une année antérieure, alors que ces déplacements ont déjà été archivés. Veuillez rectifier cette erreur !"), vbInformation
    Else
    Workbooks("Directeur.xlsm").Activate
    Sheets("Deplacements").Select
    Range("A5").Select
    Range(Selection, Selection.End(xlDown)).Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Sort key1:=Range("A6"), order1:=xlAscending, key2:=Range("B6"), order1:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal
'-------------------------------------------------------------------------------------------------------------------------------
    Sheets("PAccueil").Select
    Exit Sub
    End If
Else
'Ouverture du classeur "SwitchDepl.xls"

UFArchivTrajet.Show 0
DoEvents

    nombdd1 = ("C:\TutelSoft\SwitchDepl.xlsm")
    Workbooks.Open Filename:=nombdd1
    Range("A6").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents
    Range("B6").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents
    Range("C6").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents
    Range("D6").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents
    Range("E6").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents
'Détermination du nombre de lignes dans la feuille ("Deplacements")
    Workbooks("Directeur.xlsm").Activate
    Sheets("Deplacements").Select
    Sheets("Deplacements").Unprotect ("ElPasoTx67110")
    nblignes = Range("A6").End(xlDown).Address
    nblignes = Range(nblignes).Row
    nblignes = nblignes - 5
    Range("A6").Select
    compteurlignes = 1

    cpteur = 6
    cpteur1 = 6
    cpteur2 = 6

    Sheets("Deplacements").Select
    Range("B6").Select

    Workbooks("Directeur.xlsm").Activate
    Sheets("TempDeplacements").Select
    Range("A6").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents
    Range("B6").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents
    Range("C6").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents
    Range("D6").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents
    Range("E6").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents

Dim macellule As Variant

Workbooks("Directeur.xlsm").Activate
Worksheets("Deplacements").Select
'Début de la boucle du nombre de lignes
    Do
    compteurlignes = compteurlignes
    macellule = Range(("B") & (cpteur)).Value
        If Year(macellule) = annee1 Then
        Range(("A") & cpteur).Select
        nuprotege = ActiveCell.Value
        dateprotege = ActiveCell.Offset(0, 1).Value
        trajet = ActiveCell.Offset(0, 2).Value
        objetdepl = ActiveCell.Offset(0, 3).Value
        km = ActiveCell.Offset(0, 4).Value

        Workbooks("SwitchDepl.xlsm").Activate
        Range("A6").Select
            If Range("A6").Value = Empty Then
            Range("A6").Select
            Range("A6").Value = nuprotege
            Range("B6").Value = dateprotege
            Range("C6").Value = trajet
            Range("D6").Value = objetdepl
            Range("E6").Value = km
            Else
            cpteur1 = cpteur1 + 1
            Range(("A") & (cpteur1)).Value = nuprotege
            Range(("B") & (cpteur1)).Value = dateprotege
            Range(("C") & (cpteur1)).Value = trajet
            Range(("D") & (cpteur1)).Value = objetdepl
            Range(("E") & (cpteur1)).Value = km
            End If
        Else
        nuprotege = ActiveCell.Value
        Range(("A") & cpteur).Select
        dateprotege = ActiveCell.Offset(0, 1).Value
        trajet = ActiveCell.Offset(0, 2).Value
        objetdepl = ActiveCell.Offset(0, 3).Value
        km = ActiveCell.Offset(0, 4).Value
        Workbooks("Directeur.xlsm").Activate
        Sheets("TempDeplacements").Select
        Range("A6").Select
            If Range("A6").Value = Empty Then
            Range("A6").Select
            Range("A6").Value = nuprotege
            Range("B6").Value = dateprotege
            Range("C6").Value = trajet
            Range("D6").Value = objetdepl
            Range("E6").Value = km
            Else
            cpteur2 = cpteur2 + 1
            Range(("A") & (cpteur2)).Value = nuprotege
            Range(("B") & (cpteur2)).Value = dateprotege
            Range(("C") & (cpteur2)).Value = trajet
            Range(("D") & (cpteur2)).Value = objetdepl
            Range(("E") & (cpteur2)).Value = km
            End If
        End If
        Workbooks("Directeur.xlsm").Activate
        Worksheets("Deplacements").Select
        cpteur = cpteur + 1
        compteurlignes = compteurlignes + 1
        ActiveCell.Offset(1, 0).Select

    Loop Until compteurlignes = nblignes + 1
    Workbooks("SwitchDepl.xlsm").Save
    Workbooks("SwitchDepl.xlsm").Close
    FileCopy ("C:\TutelSoft\SwitchDepl.xlsm"), ("C:\TutelSoft\Trajets\") & annee1 & (".xlsm")
    Application.DisplayAlerts = False
    Worksheets("Deplacements").Delete
    Application.DisplayAlerts = True
    Worksheets("TempDeplacements").Copy before:=Worksheets(6)
    Worksheets(6).Name = ("Deplacements")

Unload UFArchivTrajet

    Sheets("PAccueil").Select
    Exit Sub
End If
End Sub

Cette problématique se présentera également pour d'autres onglets que je vais devoir archiver tous les 4 ou 5 ans.

J'espère ne pas abuser de votre temps et de votre patience....

Merci à vous

Cordialement

Joseph

bonjour Joseph,

En résumé, existe t-il une fonction pour l'objet Range qui puisse uniquement effacer la valeur de la cellule sans pour autant en effacer la formule?

Ou alors est ce que je fais entièrement fausse route et que la résolution de ce problème est toute autre ?!

Je ne connais pas grand chose (plutôt rien...) en vba ,mais effacer la valeur d'une cellule sans effacer sa formule ?

D'ailleurs , je serai tenter de dire que la valeur de la cellule est la formule elle-même.Je pense que ce sont les valeurs des "antécédents" qu'il faut effacer.

exemple: si on a en A2 :"=A1"

pour effacer la valeur en A2 ,on supprime la valeur de A1.

Si tu veux archiver des données ,il faudrait plutot que tu copies les cellules que tu veux archiver ,faire un "collage spécial";"valeurs"sur ta feuille d'archive.Ensuite tu effaces les "antécédents" sur ta feuille de calcul.Tes formules seront toujours là.

Espérant d'avoir aidé.

Amicalement

Bonjour tous,

Bonjour haonv,

Merci de ta réponse.

Je joint un petit fichier simplifié pour permettre de faire des essais et pour servir de support à ma demande.

L'énoncé du problème restant le même: au bout de 2,3 ou 4 ans, tout dépendant de l'onglet en question, je souhaite archiver afin de ne pas avoir de fichiers trop volumineux. Dans ma base de données EXCEL, c'est un traitement automatisé qui se déroule dans ThisWorkbook. Mais depuis que j'ai une liste déroulante et des formules dans les onglets concernés, je ne peux plus procéder comme avant, CF. le code VBA du message précédant car celà reviendrait à effacer les formules des feuilles de calcul concernées.

Dans le fichier joint, celà revient à prendre l'onglet "Deplacements", et archiver les trajets de 2008 dans "SwitchDeplacements" qui n'a pas besoin de reprendre les formules de l'onglet "Deplacements", puisqu'il me servira uniquement pour consultation.

Dans l'exemple, l'onglet "Deplacements" fait 50 lignes de saisie. Après avoir copié les trajets de 2008 dans "SwitchDeplacements", je souhaite donc retrouver dans "Deplacements" mes 50 lignes avec leurs formules en colonne A et B (FORMULES DONNEES PAR CE SITE, JE LE SOULIGNE ET VOUS EN REMERCIE ENCORE); et les 4 trajets de 2009 qui subsistent aux 4 premières positions soit de la ligne A6 à A9

Tout cela par VBA.

Je farfouille encore dans l'aide EXCEL, mais c'est loin d'être évident !

Peut-être en réussissant à déterminer le nombre d'enregistrements < à 2009, puis faire un copier/coller via VBA vers "SwithDeplacements", mais ensuite, comment mettre les 4 enregistrements de 2009 aux 4 premières places, et surtout garder les formules intactes.

Si quelqu'un avait une idée.

Je nécessite vraiment votre aide.

Merci haonv - toute réponse est bonne à recevoir, on se sent moins désemparé!

Merci à tous.

Cordialement

Joseph

https://www.excel-pratique.com/~files/doc2/ArchivageDeplacements.xls

41compteparmois.xlsm (10.81 Ko)
Rechercher des sujets similaires à "vba effacer valeur formule"