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 Subhttps://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 SubJe 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 SubComme 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
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.