Solution VBA effacer valeur d'1 cell.sans effacer la formule

Bonsoir à tous,

Je me permets au vu du nombre de personnes qui se sont intéressées à ma question VBA comment effacer la valeur d'une cellule sans en effacer la formule, d'exposer la solution que j'ai trouvée, sans prétention aucune, mais seulement au cas où celà pourrait servir.

J'ai une base de données EXCEL dans laquelle pour plusieurs onglets dont l'onglet "Deplacements", et ce afin d'éviter d'avoir un trop grand nombre d'enregistrements, je procédais via ThisWorkbook à un archivage automatique pour les déplacements datés de plus de 3 ans.

Auparavant, aucun problème, car je n'avais pas de formule dans cette feuille de calcul. Mais grâce à ce site, j'ai pu mettre dans cette feuille une liste qui permet de choisir un actif dans cette dernière et qui donne le numéro qui lui est affecté. Donc plus possible d'appliquer mon code VBA précédent sans écraser les formules.

La solution m'est venue en me rappelant une réflexion de l'un d'entre vous à une précédente question de ma part, et qui y répondait par un copier/coller.

Il a suffit de créer un onglet DeplacementsVierges "DV" contenant toutes les formules, et par le biais de copier et renommer cet onglet, ainsi que d'un couper/coller les enregistrements correspondants aux critères de date pour solutionner mon souci.

Je joint un fichier d'essai qui sera bien plus parlant.

En éxécutant la macro "archivagedeplacement", les 5 premiers enregistrement de D vont en SD, et les autres en D. Les feuilles D, TD gardant intactes leurs formules.

Désolé, mais le code "plante" en version antérieure à Excel 2007.

Voici le code VBA :

Sub ArchivageDeplacements()
' ArchivageDeplacements Macro
    Sheets("SD").Select
    Range("A6:J11").Select
    Selection.Clear
    Range("A6").Select
    Sheets("TD").Select
    Range("A6:J17").Select
    Selection.Clear
    Range("A6").Select
    Sheets("D").Select
    Range("A6:J10").Select
    Selection.Cut
    Sheets("SD").Select
    Range("A6").Select
    ActiveSheet.Paste
    Range("A6").Select
    Sheets("D").Select
    Range("A11:J14").Select
    Selection.Cut
    Sheets("TD").Select
    Range("A6").Select
    ActiveSheet.Paste
    Range("A6").Select
    Sheets("D").Select
    Application.DisplayAlerts = False
    ActiveWindow.SelectedSheets.Delete
    Application.DisplayAlerts = True
    Sheets("DV").Select
    Sheets("DV").Copy Before:=Sheets(7)
    Sheets("DV (2)").Select
    Sheets("DV (2)").Name = "D"
    Range("A6").Select
    Sheets("TD").Select
    Range("A6:J9").Select
    Selection.Cut
    Sheets("D").Select
    ActiveSheet.Paste
    Range("A6").Select
    Sheets("TD").Select
    Application.DisplayAlerts = False
    ActiveWindow.SelectedSheets.Delete
    Application.DisplayAlerts = True
    Sheets("DV").Select
    Sheets("DV").Copy After:=Sheets(8)
    Sheets("DV (2)").Select
    Sheets("DV (2)").Name = "TD"
    Range("A6").Select
    Sheets("D").Select
    Range("A6").Select
End Sub

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

Ceci prouvant une fois de plus que l'enrichissement vient du partage et du dialogue.

Cordialement

Joseph

Bonsoir,

même si cela plante, merci de mettre ton fichier au format excel 2003 ou inférieur.

De ce que j'ai compris essaie toutefois ce code

Sub ArchivageDeplacements()
' ArchivageDeplacements Macro
Sheets("SD").Range("A6:J11").Clear
Sheets("TD").Range("A6:J17").Clear
With Sheets("D")
    .Range("A6:J10").Cut Destination:=Sheets("SD").Range("A6")
    .Range("A11:J14").Cut Destination:=Sheets("TD").Range("A6")
    Application.DisplayAlerts = False
    .Delete
    Application.DisplayAlerts = True
End With
Sheets("DV").Copy Before:=Sheets(Sheets.Count)
ActiveSheet.Name = "D"
With Sheets("TD")
    .Range("A6:J9").Cut Destination:=Sheets("D").Range("A6")
    Application.DisplayAlerts = False
    .Delete
Application.DisplayAlerts = True
End With
Sheets("DV").Copy After:=Sheets(sheets.count)
ActiveSheet.Name = "TD"
Sheets("D").Select
End Sub

Je n'ai pas trop compris le pourquoi de la suppression de la feuille D pour la recréer ensuite

Amicalement

Dan

Bonjour à tous,

Bonjour Dan, ravi de te relire à nouveau.

Je joint mon fichier avec ton code VBA qui fonctionne parfaitement, sans "planter" comme le mien.

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

Je récapitule le tout.

J'ai les déplacements saisis en feuille D avec en colonne B une liste et en colonne A une formule INDEX/EQUIV qui viennent d'ailleurs de toi si je ne me trompes pas.

Pour éviter avec le temps d'avoir des feuilles trop grandes, j'archive tous les ans les déplacements de l'année N-3.

Dans le fichier joint qui me sert pour expérimenter, celà revient à couper les enregistrements de 2008 pour les mettre dans SD, puis ceux de 2009 pour les mettre en TD. Comme je me retrouve ensuite avec ma feuille de déplacements D sans aucune formule, il faut que je recopie les enregistrements de TD vers D, et je me sers de DV qui est une feuille sans enregistrements mais avec les formules pour recréer D.

C'est sûrement compliqué, mais j'avoue ne pas avoir les compétences nécéssaires pour envisager une autre solution. J'aimerais effectivement pouvoir garder D sans l'annuler pour le recréer tout de suite après.

Aurais-tu une idée là dessus ? Parce ce que moi je pédale dans la choucroute. (cà tombe bien, je suis alsacien!!!)

Si je peux me permettre, pour transposer ce que j'ai appris avec ce fichier exemple dans ma base de données EXCEL il faudrait encore que je puisse déterminer dans VBA combien d'enregistrements compte la feuille D, et combien de ces derniers sont de 2008.

Actuellement dans ma base de données, voici ce que je fait :

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.xls
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
    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
    Sheets("PAccueil").Protect
    Exit Sub
End If
End Sub

Comme tu peux le constater, la feuille SD du fichier joint correspont à SwitchDeplacements que j'utilise dans le code VBA, et là aussi, je supprime ma feuille Deplacements renomme ma feuille TempDeplacements (TD) en D.

Pour ce qu'il en est des enregistrements, pour séparer ceux de 2008 de ceux de 2009, je pense qu'il est possible après avoir déterminé le nombre total d'enregistrements de la feuille Deplacements, de rajouter un compteur et de relire ces enregistrements et avec une condition d'incrémenter ce compteur à chaque enregistrement daté de 2008 pour connaitre les zones à copier.

Je ne voudrais pas abuser, mais pourrais-tu aussi jeter un coup d'oeil là-dessus.

Si ça ne te dérange pas, bien sûr.

Enfin pour finir (là c'est sûr, j'abuse!), je cherche depuis un bout de temps un truc qui doit être bête comme choux. Pour sélectionner tous les fichiers de type xls, il faut bien écrire .xls*.

Amicalement

Joseph

PS : nous avons tous deux répondu à une question concernant une formule si. Malheureusement j'ai répondu avant toi. J'avais un peu honte en comparant les deux réponses! Je crois que j'attendrait un peu d'avoir plus de "bouteille" bien que ma réponse fonctionnait.

Merci beaucoup et à plus.

Rechercher des sujets similaires à "solution vba effacer valeur formule"