Renato d'Italie demande:
Comment puis-je ouvrir un classeur dans VBA en choisissant dans une liste? Lorsque j'enregistre une macro, il code en dur le nom du fichier sélectionné dans la macro.
Il existe une commande dans VBA appelée GetOpenFileName. Il affiche la boîte de dialogue Ouvrir fichier. Vous pouvez accéder à un répertoire, sélectionner le fichier, puis cliquer sur Ouvrir. À ce stade, la commande n'ouvre pas le fichier, elle renvoie simplement le nom à votre programme. Voici un exemple du code utilisé:
Sub TestIt() NewFN = Application.GetOpenFilename(FileFilter:="Excel Files (*.xls), *.xls", Title:="Please select a file") If NewFN = False Then ' They pressed Cancel MsgBox "Stopping because you did not select a file" Exit Sub Else Workbooks.Open Filename:=NewFN End If End Sub
Roger demande:
Comment puis-je exécuter une macro avant qu'un fichier ne soit fermé ou enregistré?
La macro doit être saisie dans le volet de code associé à "ThisWorkbook". Dans le menu déroulant de droite, sélectionnez BeforeClose ou BeforeSave.
Ken écrit:
J'ai un gestionnaire d'événements de feuille de calcul qui effectue une boucle, au moins 16 fois. Que se passe-t-il?
Le gestionnaire de Ken était simple - si l'entrée n'était pas numérique, elle changerait l'entrée en majuscules. Voici le problème. Quand il a changé la valeur de l'entrée en majuscules, c'est un autre changement de feuille de calcul et l'événement se déclenche à nouveau. Chaque fois que l'événement de modification se déclenche, Ken modifie la feuille de calcul et la macro est appelée de manière récursive, jusqu'à ce que la pile d'appels soit à court de mémoire.
La solution consiste à arrêter temporairement l'exécution des événements pendant que vous modifiez la valeur en majuscules. Vous pouvez le faire en modifiant la valeur de Application.EnableEvents sur False. Voici la macro corrigée:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range) If Not IsNumeric(Target.Value) Then Application.EnableEvents = False Target.Value = UCase(Target.Value) Application.EnableEvents = True End If End Sub
Andy du Royaume-Uni pose la question la plus intéressante du jour.
J'ai une routine VBA dans un classeur qui crée plusieurs autres classeurs. Je voudrais pouvoir ajouter dynamiquement un lien hypertexte dans chaque nouveau classeur qui pointera vers le classeur qui a généré les nouveaux classeurs.
Andy - c'est une bonne idée. Sans l'avantage de voir votre code, je peux imaginer que quelque chose comme ça fonctionnerait:
Sub Testit() Creator = ActiveWorkbook.FullName '… . Andy's code to create the new workbook… . ActiveSheet.Hyperlinks.Add Anchor:=Range("A1"), Address:= _ Creator, TextToDisplay:="Click Here to Return to " & Creator End Sub