2017-09-06 6 views
0

donc c'est une question générale, je suis sûr que cela a déjà été demandé, mais je ne trouve pas beaucoup d'aide.Comment limiter Worksheet_Calculate() à seulement exécuter lorsque la plage spécifiée est calculée

Dans Excel ayant une plage dans une feuille de calcul dire B6: F12, qui sont tous les résultats des calculs que je suis un problème avec le sous-programme Worksheet_Calculate()

mon problème est que, avec ce code très généralisé pour la Worksheet_Calculate sous-routine

Private Sub Worksheet_Calculate() 
    Dim aCell as Range 
    Dim aRange as Range 
    Set aRange = Range(B6:B12) 
    For Each aCell in aRange 
      SomeFunction(aCell) 
    Next 
End Sub 

tout calcul qui se produit dans la gamme C6: F12 provoque l'itération par aRange se passer et appels non nécessaires à SomeFunction (ACELL).

Comment puis-je faire en sorte que ce scénario se produise uniquement lorsqu'un calcul est effectué sur la plage B6: B12?

+0

vous pouvez avoir être un peu plus spécifique. Peut-être montrer des échantillons de vos données. Quand un calcul est-il effectué? Dans votre code vous avez 'B6: B12' mais dans votre question vous avez' C6: F12' et 'B6: F12'. – ShanayL

+0

Essayez-vous d'exécuter la fonction uniquement s'il y a une valeur dans Range'B6: B12'? Si c'est ce que vous essayez, utilisez 'If aCell <>" "Then' ou [sur le changement de cellule ou de plage] (https://stackoverflow.com/questions/409434/automatically-execute-an-excel-macro-on -a-cell-change) – danieltakeshi

+0

des calculs séparés sont effectués dans toutes les cellules B6: F12, ce qui fait 35 calculs différents. Lorsque les calculs de B6: B12 arrivent, je veux que SomeFunction() soit appelée. Comme il se trouve à chaque fois que n'importe quel calcul sur la feuille de calcul est appelé, le SomeFunction() est appelé via l'itération. – Chris

Répondre

0

Ajouter cette avant de commencer votre boucle FOR:

If Not Application.Intersect(ActiveCell, aRange) Is Nothing Then 

Cela ne déclenchent la boucle FOR si vous êtes dans la plage donnée

EDIT
J'ai la configuration du code comme ci-dessous et il semble fonctionner pour moi:

Private Sub Worksheet_Calculate() 
    Dim oWS As Worksheet: Set oWS = ThisWorkbook.Worksheets("Sheet8") 
    Dim aRange As Range: Set aRange = oWS.Range("F6:F10") 
    If ActiveSheet.Name = oWS.Name Then 
     If Not Application.Intersect(ActiveCell, aRange) Is Nothing Then 
      MsgBox "In range" 
     End If 
    End If 
End Sub 
+0

ActiveCell est une variable protégée qui fait partie de worksheet_calculate? ou dois-je le déclarer? – Chris

+0

désolé cela se termine par erreur d'objet 1006, comme je crée une valeur dans une cellule sur une autre feuille de calcul ainsi que créer une feuille de calcul parfois si elle n'existe pas, et im supposer quand elle crée la feuille de calcul et/ou crée la cellule, il déplace la cellule active et provoquer des problèmes. – Chris