2010-06-28 8 views
0

J'utilise Auto_Open sur un modèle Excel (.xlt) pour exécuter une macro qui importe certaines données dans un sperate feuille, ajoute un peu de forula, puis crée un certain nombre de tableaux croisés dynamiques et de graphiques. Le résultat est un rapport finalisé qui peut ensuite être enregistré en tant que .xls.Comment arrêter une macro si elle a déjà été exécutée ou s'il y a une valeur dans une cellule particulière

J'ai ajouté l'instruction IF suivante en haut du sous-élément Auto_Open pour vérifier la cellule A2 si elle contient "Service Activity Report" (il s'agit d'une cellule fusionnée de A2: N2) et si elle quitte la macro. Ceci permet à la macro de ne pas s'exécuter une deuxième fois après la génération du rapport.

If ActiveSheet.Range("A2").Text = "Service Activity Report" Then 
Exit Sub 
Else 

Deux questions:

Est-ce la meilleure façon d'arrêter le fonctionnement macro pour une deuxième fois et le rapport finalisé en écrasant?

La macro ne fonctionne que dans Excel 2007 en raison de la nature des cartes encore le code ci-dessus est sautée dans Excel 2003

Toutes les idées?

+0

Pourquoi utilisez-vous la macro Auto Open si vous n'avez pas besoin d'exécuter le code chaque fois que le fichier est ouvert? –

Répondre

1

Aucun expert ici par tout moyen, mais ...

  1. Si vous n'êtes pas appeler un autre sous après la « Auto_Open » Sub, alors j'utiliser « End » au lieu de « sortie Sous". Cela garantira qu'aucun autre code ne s'exécutera si "ActiveSheet.Range (" A2 "). Text =" Rapport d'activité du service "= Vrai

  2. L'enquête indique que" Auto_Open "a été dépassé par" Workbook_Open "dans Excel 2003 , il pourrait ne pas être pris en charge plus ...

Cheers!

+0

Super, je vais essayer aussi. – Adam

0
  1. Je ne sais pas exactement ce que vous vérifiez. Est-ce que ActiveSheet fait référence au modèle Excel ou au rapport final? Si cette cellule est créée pour le rapport final et vérifie simplement si elle existe, indiquant ainsi que le rapport final a été complété, je ne le changerai pas nécessairement. Ce n'est peut-être pas la «meilleure» façon d'accomplir cette tâche, mais lorsque vous travaillez avec VBA et Office, il peut souvent être difficile de trouver le «meilleur» moyen d'accomplir des choses délicates.
  2. Je n'avais jamais utilisé Auto_Open auparavant dans Excel 2007, donc je ne peux pas dire si oui ou non il est disponible dans Excel 2003. Cependant, j'ai utilisé Workbook_Open() avant d'exécuter du code quand un classeur démarre. Vous devriez être en mesure de voir cette méthode si vous accédez à ThisWorkbook dans la fenêtre de l'Explorateur Visual Basic. Dans la fenêtre de droite, remplacez (Général) par Workbook et vous devriez maintenant voir la méthode Workbook_Open().
+0

Merci, la fonction Auto_Open fonctionne en 2003 bien qu'il semble ignorer la vérification pour voir si la cellule est remplie. Je vais essayer Workbook_Open(). – Adam

0

Vous pouvez également envisager d'être plus précis que « ActiveSheet, » juste au cas où le classeur a été enregistré avec une autre feuille actif .Vous pouvez donner un nom A2 - dire « ReportTitle » - ce qui signifie qu'il n'a pas d'importance ce que la feuille est active:

If Range("ReportTitle").Text = "Service Activity Report" Then 
    Exit Sub 
Else 
    ' Code to do whatever you are doing... 
End if 

Et puisque vous voulez vraiment ne rien faire si votre test est vrai et quelque chose si elle est fausse , vous pouvez envisager:

If Not (Range("ReportTitle").Text = "Service Activity Report") Then 
    ' Code to do whatever you are doing... 
End if 
Questions connexes