XL 2010 activer macro sur ws change via cellule avec formule

herve62

XLDnaute Barbatruc
Supporter XLD
Bonsoir
Je n'arrive pas à juste exécuter du code compris dans un WS change via une cellule précise
exemple : des données (texte) en A et B et C puis num. en D, E F affectant une cellule T10 = A x B + C
Je cherche à exécuter des instructions quand T change via la formule
Je fait : If Not intersect (target,range("T10") is nothing then .....
mais cela ne semble pas efficace du tout , la sub s'execute déjà à la modif de A à F ????
je n'ai jamais utilisé ce cas donc ne maîtrise pas ces événements
 

herve62

XLDnaute Barbatruc
Supporter XLD
Bonjour , Slt Dranreb
en fait j'ai ce code :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
dl = Worksheets("BaseDonnées").Range("A100").End(xlUp).Row + 1
If Not Intersect(Range("I6"), Target) Is Nothing Then
Cb = Target.Address
With Worksheets("BaseDonnées")
If (.Cells(dl - 1, 1) = Worksheets("Renseignement").Cells(2, 4)) And (.Cells(dl - 1, 2) = Worksheets("Renseignement").Cells(1, 4)) Then Exit Sub
ref = Cells(1, 4)
des = Cells(2, 4)
stok = Cells(6, 9)

.Cells(dl, 1) = des
.Cells(dl, 2) = ref
.Cells(dl, 3) = stok

End With
    end if

End Sub
et je n'ai jamais I6 pour Cb c'est toujours la cellule ou j'ai entré une donnée . Donc l'événement CHANGE ne fonctionne pas pour une modif de cellule par formule ?
Y a t_il un autre moyen , moi je vois pas ?
 

Dranreb

XLDnaute Barbatruc
Comme déjà dit un changement de valeur d'une formule ne consiste pas en la modif de la cellule qui la porte.
J'ai déjà répondu à la question : détecter les modifications des cellules dont elle dépend par des Workhseet_Change dans les Worksheet des feuilles qui les contiennent. Sinon une Worksheet_Calculate dans celui de la feuille contenant la formule pourrait aussi vous arranger, mais pour savoir si une cellule particulière aura changé de valeur vous n'aurez pas d'autre moyen que de la comparer à sa valeur précédente que vous aurez noté comme référence d'un nom propre à la feuille.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
En résumé :
Si la valeur de la formule dépend de beaucoup de cellules dont même certaines dans d'autres feuilles :
VB:
Private Sub Worksheet_Calculate()
   Dim ValPrécI6
   On Error Resume Next: ValPrécI6 = Me.[ValPrécI6]
   If Err Then ValPrécI6 = Empty
   If Me.[I6].Value = ValPrécI6 Then Exit Sub
   On Error GoTo 0: Me.Names.Add "ValPrécI6", Me.[I6].Value
   AjouterLigneBD
   End Sub
Si la valeur de la formule dépend de beaucoup de cellules (sans formule, elles) de la même feuille :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
   Dim Cel As Range
   For Each Cel In Me.[I6].DirectPrecedents
      If Not Intersect(Cel, Target) Is Nothing Then Exit For
      Next Cel
   If Cel Is Nothing Then Exit Sub
   AjouterLigneBD
   End Sub
Private Sub AjouterLigneBD()
   Dim LRs As ListRows, TVLd(), TVLn(1 To 1, 1 To 3)
   Set LRs = WshBDon.ListObjects(1).ListRows
   TVLn(1, 1) = Me.[D1].Value
   TVLn(1, 2) = Me.[D2].Value
   TVLn(1, 3) = Me.[I9].Value
   TVLd = LRs(LRs.Count).Range.Value
   If TVLd(1, 1) = TVLn(1, 1) And TVLd(1, 2) = TVLn(1, 2) Then Exit Sub
   LRs.Add.Range.Resize(, 3).Value = TVLn
   End Sub
Préalablement :
— Dans VBA rebaptisez WshBDon l'objet Worksheet représentant la feuille "BaseDonnées"
— Coté Excel, si ce n'est encore fait, sélectionnez votre base de données, titres compris, et appliquez la commande 'Mettre sous forme de tableau' du groupe Styles du menu Accueil.

Remarque: Si votre feuille est une sorte de fiche, vous devriez la remplacer par un UserForm de consultation et mise à jour de la base …
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Dans le code que je vous proposai, j'utilise un nom WshBDon. C'est donc ainsi que doit être garni l'identification (Name) (et non la propriété Name) de l'objet Worksheet assumant dans VBA la représentation de l'entité Excel qu'est la feuille "BaseDonnées". Personnellement je les rebaptise toujours d'un tel nom car les Feuil1, Feuil2 etc. n'ont aucune signification, n'est ce pas. Reportez vous, dans l'explorateur de projets, à la rubrique Microsoft Excel Objets du projet VBA du classeur.
Il y a une ressource à télécharger pour gérer facilement les contrôles d'un UserForm de consultation et mise à jour d'une base sous forme de tableau Excel. C'est un complément .xlam auto-installable. Mais je peux, si vous préfériez, équiper votre classeur à joindre des modules de service nécessaires.
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour herve62, Bernard,

Mettez la formule =AUJOURDHUI() où vous voulez dans le classeur.

Cette formule volatile crée l'évènement Calculate quand une cellule quelconque est modifiée.

Cet évènement déclenchera cette macro, à placer dans ThisWorkbook :
VB:
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
Dim F1 As Worksheet, F2 As Worksheet, dl&
Set F1 = Sheets("BaseDonnées")
Set F2 = Sheets("Renseignement")
dl = F1.Range("A100").End(xlUp).Row + 1
If (F1.Cells(dl - 1, 1) = F2.Cells(2, 4)) And (F1.Cells(dl - 1, 2) = F2.Cells(1, 4)) Then Exit Sub
Application.EnableEvents = False
F1.Cells(dl, 1) = F2.Cells(2, 4)
F1.Cells(dl, 2) = F2.Cells(1, 4)
F1.Cells(dl, 3) = F2.Cells(6, 9)
Application.EnableEvents = True
End Sub
Si du moins j'ai bien compris le code du post #3.

A+
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Pour un code tout le temps exécuté quand on change n'importe quoi dans n'importe quelle feuille, il vaudrait vraiment mieux, à mon avis, éviter des recherches systématiques dans la collection Sheets. C'est précisément un des deux avantages offerts par un objet VBA de la rubrique Microsoft Excel Objets: l'atteindre directement sans avoir à l'y rechercher, toujours en vue, quoi qu'il en soit, d'interroger ou manipuler la feuille qu'il représente.
Évidemment s'il n'y a que ça, ça n'a guère d'importance, mais ça ne serait pas la première fois que quelqu'un se plaindrait d'une lenteur globale dans une accumulation devenue inextricable de tels dispositifs, faute d'avoir toujours mis toutes les chances de son coté pour chaque détail !
 

Dranreb

XLDnaute Barbatruc
La première chose que je vois c'est que vous avez inutilement renommé "WshDon" la feuille Excel représentée par l'objet Worksheet Feuil2, qui, lui, s'appelle toujours encore Feuil2 au lieu de WshBDon !
La seconde c'est que des choses existent à la fin du tableau, dont il aurait mieux vallu d'abord supprimer toutes le lignes vides.
Corrigé selon ma proposition :
 

Pièces jointes

  • Temp.xlsm
    20.3 KB · Affichages: 6

job75

XLDnaute Barbatruc
Bonjour herve62, Bernard,

Je ne vois pas l'intérêt de la macro AjouterLigneBD mais bon...

Par ailleurs pour trouver la dernière ligne remplie d'un tableau structuré End(xlUp) ne va pas.

Utiliser plutôt :
VB:
dl = F1.Columns(1).Find("*", , xlValues, , , xlPrevious).Row + 1
A+
 

Discussions similaires

Statistiques des forums

Discussions
311 735
Messages
2 082 024
Membres
101 873
dernier inscrit
excellllll