Finalement, je veux déplacer la cellule à l'endroit où la dernière erreur est survenue. Modifier: Oublié pour dire que j'utilise Excel 2003.VBA: Comment obtenir la dernière cellule utilisée par le code VBA lorsque la dernière erreur s'est produite dans un classeur/feuille de calcul?
Répondre
Comme demandé dans les commentaires ...
Consulter la propriété « appelant » de l'objet « Application » dans l'aide Excel VBA. Lorsque vous l'utilisez à partir d'une routine VBA, il vous dira d'où vient l'appel à la routine - quelle plage, graphique, etc.
Une chose importante à prendre en compte lors de l'utilisation de 'Application.Caller' est qu'il n'est pas toujours un objet Range. Regardez l'aide, mais la propriété renvoie une valeur Variant qui peut être une plage, une chaîne ou une erreur. (C'est un objet Range dans le cas qui vous intéresse, mais vous devez être conscient de cela.)
En raison de ce qui précède, et les caprices de la syntaxe VBA lorsqu'il s'agit d'objets par rapport aux valeurs , il peut être difficile d'utiliser 'Application.Caller'. Mettre une ligne comme:
Debug.Print Application.Caller.Address
dans votre code échouera lorsque l'appelant n'est pas une plage. Faire quelque chose comme:
Dim v
v = Application.Caller
sera « compilation », mais créer des références circulaires lorsque l'appelant est une plage parce que vous essayez d'accéder à la valeur de la chaîne d'appel.
Tout cela signifie qu'il est probablement préférable d'écrire une petite fonction d'utilité pour vous-même:
Public Function currentCaller() As String
If TypeOf Application.Caller Is Range Then
Dim rng As Range
Set rng = Application.Caller
currentCaller = rng.Address(External:=True)
Else
currentCaller = CStr(Application.Caller)
End If
End Function
puis l'appeler de vos gestionnaires d'erreurs où vous voulez savoir où l'appel est venu.
Encore une chose - de toute évidence, cela ne peut indiquer à l'appelant qu'une fois qu'une routine VBA a été appelée. Si vous avez des erreurs dans vos formules d'appel, Excel renverra les valeurs d'erreur à vos cellules sans jamais appeler vos routines VBA.
Pourrait-il être fait avec un gestionnaire d'erreur?
Un exemple de ce que je veux dire ci-dessous:
sub code1()
on error goto cell A1
end sub
L'erreur que je voulais dire pourrait être aussi causée par mon erreur personnalisée (en utilisant IF). Donc, le problème est comment obtenir la dernière cellule utilisée par le code VBA quand la dernière "erreur/erreur" s'est produite dans un classeur/feuille de calcul? AFAIK, l'objet ActiveCell se réfère à la cellule actuelle dans la fenêtre, pas à la cellule actuelle traitée par le code VBA. – Vantomex
Enveloppez votre fonction VBA dans une autre fonction qui stocke l'emplacement de la cellule et de la valeur en tant que variantes. Gardez cette fonction 'wrapper' aussi basique que possible afin qu'elle ne provoque aucune erreur supplémentaire.
Si vous essayez de déboguer des erreurs de plantage d'application, la fonction wrapper pourrait même stocker ces valeurs dans un fichier texte délimité par des virgules. Une fois stocké, Excel peut planter tout ce qu'il veut et vous saurez toujours quel est l'emplacement et la valeur de la cellule puisque vous les avez stockés auparavant en dehors d'Excel.
Votre problème est-il juste que vous avez besoin de savoir quelle cellule appelle vos routines VBA? Si c'est le cas, recherchez la propriété 'Caller' de l'objet 'Application' dans l'aide Excel VBA. Lorsque vous l'utilisez à partir d'une routine VBA, il vous dira d'où vient l'appel à la routine - quelle plage, graphique, etc. Voir aussi http://stackoverflow.com/questions/2259035/how-to-get-address -of-cell-which-calls-a-vba-functions-in-a-excel-sheet – jtolle
@jolle, oui, c'est-à-dire. Votre propriété Caller semble ce dont j'ai besoin, mais je n'ai pas le temps de le tester maintenant. Je dois aller au bureau.Pourquoi ne l'avez-vous pas posté comme une réponse à la place d'un commentaire, pour que je puisse l'accepter si votre solution fonctionne. – Vantomex
Fera, mais certains pourraient considérer cela comme une "question en double". Je pense que le libellé est assez différent. – jtolle