Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2010 rendre formule en vba

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

yahya belbachir

XLDnaute Occasionnel
bonjour
dans un tableau dynamique,j'ai cette formule:
Jusqu' au dernière ligne. ce que je cherche
est ce possible de la mettre en VBA pour éviter la suppression des formules?
=SI(C2="BB";"✔";SI(C2="DP"; "✔";SI(C2="PC"; "✔";"" )))
 

Pièces jointes

Bonsoir,
Dans un tableau structuré, les formules de calcul sont figées.
Si tu supprime les lignes et que tu réécris les données dans les colonnes A,B et C les formules seront de nouveau actives.
Si tu ne veux pas que l'on écrase les formules dans les colonnes "Choix " utilises la validation de données sur les cellules concernées.



Cordialement
 

Pièces jointes

Hello,

la solution de goube (hello) est la bonne, en voici une autre en VBA
Le but et d'annuler la dernière opération s'il y a eue un changement dans les colonne D à F
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    
    If Not Application.Intersect(Target, Range("D:F")) Is Nothing Then
        Application.EnableEvents = False
        Application.Undo
        Application.EnableEvents = True
    End If
            
End Sub
 

Pièces jointes

Maintenant pour empêcher la modification des formules vous pouvez utiliser cette macro dans le code de la feuille :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False 'désactive les évènements
If ListObjects.Count <> 1 Then Application.Undo: GoTo 1 'un tableau structuré et un seul
On Error Resume Next
With ListObjects(1).Range.SpecialCells(xlCellTypeFormulas)
    If Err Then Application.Undo: GoTo 1
    If .Areas.Count > 1 Then Application.Undo: GoTo 1
    If .Columns.Count <> 3 Then Application.Undo: GoTo 1
    If .Rows.Count < ListObjects(1).Range.Rows.Count - 1 Then Application.Undo: GoTo 1
    If Not Intersect(Target, .Cells) Is Nothing Then Application.Undo
End With
1 Application.EnableEvents = True 'réactive les évènements
End Sub
 

Pièces jointes

Bonjour le forum,

J'ai eu du mal mais je pense que cette solution est la bonne :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False 'désactive les évènements
If ListObjects.Count = 0 Then GoTo 1 'il faut au moins un tableau structuré
If Target.Count = 1 Then If Not Intersect(Target, ListObjects(1).Range.Rows(1)) Is Nothing Then GoTo 2 'si modification des en-têtes
On Error Resume Next 'si aucune SpecialCell
With ListObjects(1).Range.SpecialCells(xlCellTypeFormulas)
    If Err Then GoTo 1 'si toutes les formules sont supprimées
    On Error GoTo 0
    If .Areas.Count > 1 Then GoTo 1
    If .Columns.Count <> 3 Then GoTo 1
    If Intersect(Target, .ListObject.Range) Is Nothing Then GoTo 2 ' si le tableau n'est pas modifié
    If .Rows.Count < .ListObject.Range.Rows.Count - 1 Then GoTo 1
    If Application.CountIf(.Columns(1), "#REF!") Then GoTo 1 'si suppression de la colonne Option
    If Intersect(Target, .Cells) Is Nothing Then
        If .Precedents.Address <> .Columns(0).Address Then GoTo 1 'teste la position des antécédents pour annuler l'insertion de colonnes
    Else
        .Columns(1) = "=REPT(""" & ChrW(10004) & """,OR(RC[-1]=""BB"",RC[-1]=""DP"",RC[-1]=""PC""))"
        .Columns(2) = "=REPT(""" & ChrW(10004) & """,RC[-2]=""PC"")"
        .Columns(3) = "=REPT(""" & ChrW(10004) & """,OR(RC[-3]=""PC"",RC[-3]=""DP""))"
    End If
End With
GoTo 2
1 Application.Undo 'annule la modification
2 Application.EnableEvents = True 'réactive les évènements
With UsedRange: End With 'actualise
End Sub
En résumé on peut :

- déplacer le tableau et le renommer ainsi que ses colonnes

- ajouter des colonnes mais uniquement avant la colonne des antécédents (Option) et après les 3 colonnes de formules

- supprimer des colonnes sauf la colonne Option et celles des formules .

Pour tester la macro j'ai recopié le tableau A2:F10 sur 99 000 lignes, la durée d'exécution dépend des modifications annulées.

Chez moi la suppression des 3 colonnes D E F prend 0,4 seconde, la modification d'une formule 2,8 secondes.

La modification d'une cellule en dehors du tableau prend 2,1 secondes : c'est la durée de la recherche des formules par SpecialCells.

A+
 

Pièces jointes

Dernière édition:
Bonsoir le forum,

Avec cette solution on n'utilise plus les SpecialCells, c'est nettement plus rapide :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim tablo As Range, premcol%, dercol%
Application.EnableEvents = False 'désactive les évènements
If ListObjects.Count = 0 Then GoTo 1 'il faut au moins un tableau structuré
Set tablo = ListObjects(1).Range
If Target.Count = 1 Then If Not Intersect(Target, tablo.Rows(1)) Is Nothing Then GoTo 2 'si modification des en-têtes
On Error Resume Next
premcol = tablo.Find("=", , xlFormulas, xlPart, xlByColumns, xlNext).Column - tablo.Column + 1
dercol = tablo.Find("=", , xlFormulas, xlPart, xlByColumns, xlPrevious).Column - tablo.Column + 1
If Err Then If tablo.ListObject.DataBodyRange Is Nothing Then _
    tablo(2, 1) = " ": tablo(2, 1) = "": GoTo 2 Else GoTo 1 'si toutes les formules sont supprimées
On Error GoTo 0
If dercol - premcol <> 2 Then GoTo 1
If Intersect(Target, tablo) Is Nothing Then GoTo 2 ' si le tableau n'est pas modifié
With tablo.Cells(2, premcol).Resize(tablo.Rows.Count - 1, 3)
    If Application.CountIf(.Columns(1), "#REF!") Then GoTo 1 'si suppression de la colonne Option
    If Intersect(Target, .Cells) Is Nothing Then
        If .Precedents.Address <> .Columns(0).Address Then GoTo 1 'teste la position des antécédents pour annuler l'insertion de colonnes
    Else
        .Columns(1) = "=REPT(""" & ChrW(10004) & """,OR(RC[-1]=""BB"",RC[-1]=""DP"",RC[-1]=""PC""))"
        .Columns(2) = "=REPT(""" & ChrW(10004) & """,RC[-2]=""PC"")"
        .Columns(3) = "=REPT(""" & ChrW(10004) & """,OR(RC[-3]=""PC"",RC[-3]=""DP""))"
    End If
End With
GoTo 2
1 Application.Undo 'annule la modification
2 Application.EnableEvents = True 'réactive les évènements
With UsedRange: End With 'actualise
End Sub
Avec un tableau structuré de 99 000 lignes :

- l'annulation de la suppression des 3 colonnes D E F se fait en 0,7 seconde

- l'annulation de la modification d'une formule se fait en 0,7 seconde

- l'annulation de la suppression de la colonne Option se fait en 0,4 seconde

- la modification d'une cellule en dehors du tableau se fait en 0,15 seconde.

Edit : pour If Err Then j'ai traité le cas où le DataBodyRange a été supprimé.

A+
 

Pièces jointes

Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
9
Affichages
650
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…