Effacer une valeur en préservant la formule (VBA)
Bonjour
Une fois de plus je viens faire appel à vos lumières
Je travaille sur une macro et je cherche un code qui pourrait remplacer mon : Range("").ClearContents
Car celui-ci efface la formule à l’intérieur de ma cellule (et ce pour plusieurs cellules).
Merci d'avance pour votre aide
Bonjour Max0490 le forum
bah là ???? par définition si tu as une valeur dans la cellule qui comporte une formule, c'est que le résultat de ta formule donne JUSTEMENT un Résultat !!!
alors si tu veux effacer le résultat là moi je ne comprend pas trop ta demande
de deux choses l'une ou tu effaces la formule, ou tu auras le résultat de ta formule.
a+
Papou
Ma macro fait plusieurs boucles et dans chaque boucle j'ai mes cellules qui sont calculées (jusqu'ici rien d'anormal)
A chaque fin de boucle les valeurs calculées sont imprimées, mais en changeant de boucle les valeurs calculées précédemment induisent en erreur les nouveaux calculs car certaines cellules sont dépendantes des autres suivant leurs résultat... (d'où le fait que je veuille faire seulement disparaître les valeurs pour pouvoir obtenir des calculs propres)
J’espère avoir été assez clair...
J'ai pensé à changer le range.clear par un range.value = "" mais je ne sais pas si cela sera correct.
Je viens d'essayer Range.value = "" ... Il efface la cellule aussi
Sub essai()
Dim DLig As Long, Lig As Long
Dim ShtS As Worksheet
Dim a As Integer
Dim PT As PivotTable
Dim PF As PivotField
Dim PI As PivotItem
Dim Societe As String
Societe = Sheets("TCD Perso").Range("B3").Value
Set PT = Sheets("TCD Perso").PivotTables("Tableau croisé dynamique3")
Set PF = PT.PivotFields("Agence")
' Définir la feuille source = TCD Perso
Set ShtS = Worksheets("TCD Perso")
' Récupérer la dernière ligne des noms
DLig = ShtS.Range("A" & Rows.Count).End(xlUp).Row
' Vérifier qu'il s'agit du total
If InStr(1, ShtS.Range("A" & DLig).Value, "Total", vbTextCompare) > 0 Then
' si oui, dernière ligne = -1
DLig = DLig - 1
End If
For Each PI In PF.PivotItems
a = 0
Sheets("TCD Perso").Range("B4") = PI
If Not IsEmpty(Sheets("TCD Perso").Range("A9").Value) Then
' Avec la feuille à imprimer
With Sheets("Diagramme")
' Vider les cellules des noms
Sheets("Diagramme").Range("B22").ClearContents
' Sheets("Diagramme").Range("D23").ClearContents
Sheets("Diagramme").Range("B35").ClearContents
Sheets("Diagramme").Range("B48").ClearContents
' Pour chaque ligne de la feuille source à partir de la 7ème
For Lig = 9 To DLig
If a = 0 Then
Sheets("Diagramme").Range("B22").Value = ShtS.Range("A" & Lig).Value
a = a + 1
Else
Lig = Lig - 1
'Si nom calculé = cellule B48 alors on garde le même nom
If Sheets("Diagramme").Range("B48").Value = Sheets("Diagramme").Range("C22").Value Then
Sheets("Diagramme").Range("B22").Value = ShtS.Range("A" & Lig).Value
' 'Si différent, on prend le nom suivant : Lig + 1
Else
Sheets("Diagramme").Range("B22").Value = ShtS.Range("A" & Lig + 1).Value
Lig = Lig + 1
End If
End If
Sheets("Diagramme").Calculate
Sheets("TCD données références").Calculate
Sheets("Diagramme").Calculate
'Si nom calculé = cellule B22 alors on garde le même nom
If Sheets("Diagramme").Range("C35").Value = Sheets("Diagramme").Range("B22").Value Then
Sheets("Diagramme").Range("B35").Value = ShtS.Range("A" & Lig).Value
'Si différent, on prend le nom suivant : Lig + 1
Else
Sheets("Diagramme").Range("B35").Value = ShtS.Range("A" & Lig + 1).Value
Lig = Lig + 1
End If
Sheets("Diagramme").Calculate
Sheets("TCD données références").Calculate
Sheets("Diagramme").Calculate
'Si nom calculé = cellule B36 alors on garde le même nom
If Sheets("Diagramme").Range("C48").Value = Sheets("Diagramme").Range("B35").Value Then
Sheets("Diagramme").Range("B48").Value = ShtS.Range("A" & Lig).Value
'Si différent, on prend le nom suivant : Lig + 1
Else
Sheets("Diagramme").Range("B48").Value = ShtS.Range("A" & Lig + 1).Value
Lig = Lig + 1
End If
Sheets("Diagramme").Calculate
Sheets("TCD données références").Calculate
Sheets("Diagramme").Calculate
' Lancer l'impression
'.PrintOut
Next
End With
End If
Next
End SubC'est ma macro ^^
PS : J'ai oublié de préciser qu'à chaque nouvelle boucle mes calculs se font en prenant comme référence une liste qui est différente de celle du tour précédent.
Bonjour,
Soit plus précis dans tes demandes, ça évite de faire de suppositions non adaptées...
On va supposer donc que tu travailles sur une plage où constantes et formules sont mélangées.
Si c'est le cas tu peux faire :
Dim pl As Range
On Error Resume Next
Set pl = [A2:C9].SpecialCells(xlCellTypeConstants)
On Error GoTo 0
If Not pl Is Nothing Then pl.ClearContentsqui ne supprimera que les constantes (textes et nombres, on peut faire que sur l'un ou sur l'autre, regarde l'aide sur SpecialCells)
eric
Ok merci je vais voir ce que ça donne
On Error Resume Next
Sheets("Diagramme").Range("O35").SpecialCells (xlCellTypeConstants)
On Error GoTo 0
If Not Range("O35") Is Nothing Then Sheets("Diagramme").Range("O35").ClearContentsJ'ai essayé avec ce code en prenant xlCellTypeConstants et xlCellTypeFormulas mais les deux on effacé la formule de la cellule O35
Je n'avais pas rafraîchi avant de poster, je n'avais pas vu ton complément.
Ce que je te proposais n'a plus lieu d'être.
Je rejoins Paritec, ta demande n'a aucun sens.
Tu n'as que 4 cellules concernées. Si tu as besoin des formules qui y sont et bien il faut les conserver, si tu n'en as pas besoin et bien elles ont aucune raison d'y être.
Si les valeurs qu'elles te retournent ne te conviennent pas, agit sur leurs antécédents (cellules qu'elle utilisent).
eric
Ok
Je laisse tomber le codage,je vais agir sur mes formules, apparemment je n'arrive pas à être suffisamment clair via écran interposés.
Merci pour votre aide en tout cas