2016-11-22 1 views
2

J'essaie actuellement d'obtenir des informations historiques sur le développement de l'arriéré.Exécuter la macro lorsque la valeur de la cellule liée change (Excel VBA)

Mon fichier Excel est basé sur des requêtes provenant d'une base de données Access qui peut me donner une vue de la situation actuelle.

Je voudrais exécuter automatiquement une macro chaque fois que le numéro de semaine change. Je suis actuellement en utilisant le code suivant:

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Not Intersect(Target, Target.Worksheet.Range("D3")) Is Nothing Then 
     Call KPIupdate 
    End If 
End Sub 

La macro qui devrait tirer est appelé KPIupdate

Mon problème est que les feux que macro si je clique sur la cellule. Je voudrais juste que le feu se déclenche lorsque le nombre change. La cellule "D3" est liée à une autre cellule avec la formule = numsem (aujourd'hui(); 21)

J'espère que vous pouvez me aider

+2

Vous devez utiliser l'événement 'Calculate()' plutôt que l'événement 'Change()'. –

+0

Salut Gary, je suis nouveau chez VBA. Pouvez-vous me donner un exemple de ce à quoi ressemblera le code? –

Répondre

2

Selon l'entrée MSDN pour Worksheet_Change:

Cet événement ne se produit pas lorsque les cellules changent pendant un recalcul. Utilisez l'événement Calculate pour intercepter un recalcul de feuille.

Pour utiliser Worksheet_Calculate pour piéger le changement dans une cellule qui est définie par une formule regardant une autre cellule, vous devez définir une variable pour maintenir la valeur de la « cible » et vérifier si elle a changé après les feux d'événement Calculate.

Voici un exemple simple:

Option Explicit 

Private strCurrentWeek As String 

Private Sub Worksheet_Calculate() 
    If Me.Range("A1").Value <> strCurrentWeek Then 
     'the linked cell changed 
     Debug.Print "Sheet1!A1 was changed" 
     'call another macro 
    End If 
    'update the new current week 
    strCurrentWeek = Me.Range("A1").Value 
End Sub 

Pour tester cela, vient de mettre la formule dans A1 être =B1 puis modifiez la valeur de B1 et vérifier la sortie dans la fenêtre immédiate.

Vous pouvez adapter ce code pour appeler KPIupdate où mon instruction Debug.Print... est.

+0

Merci pour la réponse et m'aider :-) Il y a toujours un problème. Chaque fois qu'une cellule est modifiée, elle exécute la macro. Le problème peut-il être lié au fait que la cellule est liée à une cellule avec la formule (= Aujourd'hui)? Je pense que peut-être exceller pense que le numéro est mis à jour parce qu'il ne cesse de chercher la journée? Si je fais une feuille de test excel, elle continuera d'exécuter la macro si je me réfère à une cellule avec la formule Aujourd'hui. Savez-vous comment vous débarrasser de ce problème? –

+0

Oui - la macro s'exécute à chaque fois que la feuille de calcul est calculée. Cependant, la logique dans le code signifie que rien ne se passera à moins que la valeur dans A1 change. J'ai testé avec B1 contenant '= TODAY()' et A1 contenant '= B1' et le code dans le bloc IF ne s'exécute pas. Cependant, si B1 contient '= NOW()' alors la logique interne déclenche chaque recalcul (au fur et à mesure que le temps passe). –

+0

Merci. Cela fonctionne presque parfaitement maintenant. Peut-être pourriez-vous m'aider avec une dernière question? Chaque fois que j'ouvre le fichier, il exécute la macro car il ne se souvient pas de strCurrentWeek = Me.Range ("A1"). Value. Cela peut-il être résolu d'une manière ou d'une autre? –