🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →

The ExcelMaster.ai Blog

VBA Shell dans Excel — lancer un programme externe, et pourquoi votre code n'attend pas

VBA Shell dans Excel — lancer un programme externe, et pourquoi votre code n'attend pas

La fonction VBA Shell lance un programme externe puis s'en va aussitôt — c'est du fire-and-forget. Shell renvoie un identifiant de tâche, pas le code de sortie du programme, ni sa sortie, ni un indicateur de réussite, et la ligne suivante de votre macro s'exécute pendant que le programme démarre encore. Voilà le bug qui piège la plupart du code Shell : vous lancez un convertisseur avec Shell puis tentez d'ouvrir un fichier qu'il n'a pas encore écrit. Ce guide explique pourquoi Shell n'attend pas, comment mettre entre guillemets un chemin contenant des espaces, pourquoi Shell lance des exécutables mais ne sait pas ouvrir seul un PDF ou une URL, et quand abandonner Shell au profit de WScript.Shell Run ou Exec pour vraiment attendre le programme et lire ce qu'il a produit.

Henry
VBA Environ dans Excel — lire les chemins Windows sans coder en dur un dossier utilisateur

VBA Environ dans Excel — lire les chemins Windows sans coder en dur un dossier utilisateur

La fonction VBA Environ lit les variables d'environnement que Windows remet à chaque programme — USERPROFILE, TEMP, USERNAME, APPDATA — pour que vous construisiez des chemins propres à l'utilisateur sans coder en dur C:\Users\John, un chemin qui casse sur toutes les autres machines. Son piège caractéristique est silencieux : une variable absente ou mal orthographiée renvoie une chaîne vide, pas une erreur, si bien qu'un nom mal saisi comme TMEP au lieu de TEMP donne discrètement du vide et fait atterrir votre chemin à la racine du disque. Ce guide explique pourquoi Environ est l'outil des chemins portables, pourquoi vous devez traiter chaque résultat comme possiblement vide, les deux formes d'appel (par nom ou par indice numérique), l'instantané qu'Environ capture au lancement d'Excel, et ce qu'Environ ne sait pas faire — définir des variables ou lire celles modifiées après le démarrage.

Henry
VBA CreateObject dans Excel — liaison tardive, GetObject, et pourquoi Outlook reste ouvert

VBA CreateObject dans Excel — liaison tardive, GetObject, et pourquoi Outlook reste ouvert

CreateObject est le passe-partout de VBA vers tout ce qui est hors d'Excel — il démarre n'importe quelle application COM par sa chaîne ProgID : Scripting.FileSystemObject, Scripting.Dictionary, Outlook.Application, WScript.Shell, Word.Application. Cette recherche par chaîne, c'est la liaison tardive : le compilateur ne sait rien de l'objet, donc un mauvais ProgID ou une application non installée n'échoue qu'à l'exécution, avec l'error 429. Ce guide explique la vraie décision entre liaison tardive et liaison précoce (portabilité contre IntelliSense), pourquoi CreateObject démarre toujours une nouvelle instance tandis que GetObject se raccroche à une instance déjà en cours, et pourquoi un processus Outlook ou Excel sans interface reste suspendu dans le Gestionnaire des tâches quand vous oubliez de faire Quit sur l'application et de passer l'objet à Nothing.

Henry
VBA Now, Date & Time dans Excel — lire l'horloge, et pourquoi Date est aussi une instruction

VBA Now, Date & Time dans Excel — lire l'horloge, et pourquoi Date est aussi une instruction

Une date VBA est un Double — la partie entière compte les jours depuis le 30/12/1899 et la partie décimale porte l'heure, donc Now, Date et Time sont trois lectures de la même horloge. Now renvoie la date et l'heure, Date renvoie aujourd'hui à minuit, Time renvoie l'heure seule. Le bug qui casse le plus de code, c'est de comparer une valeur Now stockée avec Date sans jamais tomber juste, car Now porte une fraction d'heure que Date n'a pas. Pire, Date et Time sont aussi des instructions qui règlent l'horloge système. Ce guide montre ce qu'est vraiment ce Double, pourquoi l'égalité échoue, comment retirer l'heure avec Int ou DateValue, et pourquoi Now donne l'heure locale et non UTC.

Henry
VBA DateAdd & DateDiff dans Excel — calculer sur les dates sans le bug de la longueur des mois

VBA DateAdd & DateDiff dans Excel — calculer sur les dates sans le bug de la longueur des mois

Comme une date VBA est un Double, ajouter 1 avance d'un jour et l'arithmétique simple est correcte — pour les jours. Elle casse dès qu'on traite un mois comme 30 jours ou une année comme 365, car les mois et les années bissextiles n'ont pas une longueur fixe. DateAdd connaît le calendrier, donc ajouter un mois au 31 janvier renvoie le 28 février plutôt qu'un 31 impossible. DateDiff compte les frontières franchies, pas le temps écoulé, si bien que l'écart du 31 décembre au 1er janvier vaut un an même si un seul jour a passé. DateSerial construit une date à partir de l'année, du mois et du jour sans ambiguïté régionale et normalise les débordements, ce qui donne l'idiome propre du dernier jour du mois. Ce guide montre quand le plus simple suffit, les codes d'intervalle qui piègent, et pourquoi DateDiff est un comptage de frontières.

Henry
VBA Weekday & DatePart dans Excel — extraire les parties d'une date, et pourquoi lundi n'est pas 1

VBA Weekday & DatePart dans Excel — extraire les parties d'une date, et pourquoi lundi n'est pas 1

Year, Month, Day, Hour, Minute et Second extraient chacun un entier d'une date — ce Double dans lequel vous voyez déjà — et ils sont aussi simples qu'ils en ont l'air. Weekday est celui qui piège — il renvoie 1 à 7, mais la numérotation dépend d'un second argument dont la valeur par défaut fait dimanche égale 1, donc dans un appel nu lundi vaut 2, pas 1, et tout test de week-end bâti sur un nombre codé en dur est discrètement faux. DatePart est l'extracteur général avec les mêmes codes d'intervalle que DateAdd, et il atteint des parties sans fonction dédiée comme le numéro de semaine et le trimestre, même si sa règle de semaine n'est pas ISO 8601 par défaut. WeekdayName et MonthName renvoient des noms dans la langue de la machine, bons pour l'affichage mais pas pour la relecture. Ce guide montre comment extraire chaque partie et pourquoi lundi n'est pas 1.

Henry
VBA FreeFile & l'instruction Open dans Excel — obtenir un numéro de fichier, ouvrir un fichier texte (pas un classeur)

VBA FreeFile & l'instruction Open dans Excel — obtenir un numéro de fichier, ouvrir un fichier texte (pas un classeur)

En VBA intégré, on atteint un fichier texte par un canal numéroté — vous écrivez Open path For Output As #n, et le numéro n est une poignée qu'il faut prendre de FreeFile plutôt que choisir à la main. Codez #1 en dur et, dès que deux fichiers sont ouverts, vous tombez sur l'erreur 55 File already open ; ouvrez For Output un fichier qui contient déjà des données et il est vidé ; oubliez Close et le fichier reste verrouillé jusqu'à la fermeture d'Excel. Ce guide montre pourquoi FreeFile vous remet un numéro de canal à saisir dans une variable, la différence entre For Output, For Append et For Input, pourquoi l'instruction Open n'est pas Workbooks.Open, et le motif de nettoyage qui ferme toujours le canal.

Henry
VBA Print # vs Write # dans Excel — écrire un fichier texte ou un CSV (et pourquoi le vôtre a des guillemets partout)

VBA Print # vs Write # dans Excel — écrire un fichier texte ou un CSV (et pourquoi le vôtre a des guillemets partout)

Print # et Write # donnent des réponses opposées à la question de savoir à quoi devraient ressembler les octets sur le disque. Print # écrit le texte exactement tel qu'il apparaît — pas de guillemets, pas de virgules, c'est vous qui construisez la mise en forme — il convient donc à un rapport ou à un CSV fait main. Write # écrit un format machine — chaque chaîne entourée de guillemets, des virgules entre les valeurs, les dates entre dièses — conçu pour être relu par Input #, pas par un humain ni par Excel. Ce guide montre pourquoi Write # est la raison pour laquelle votre CSV est plein de guillemets, pourquoi une virgule dans une liste Print # insère des zones d'impression au lieu de virgules CSV, comment For Output vide tandis que For Append ajoute, le piège de la virgule décimale liée à la locale, et pourquoi l'écriture intégrée est en ANSI plutôt qu'en UTF-8.

Henry
VBA Read Text File dans Excel — Line Input vs Input #, et la boucle EOF qui ne perd aucune ligne

VBA Read Text File dans Excel — Line Input vs Input #, et la boucle EOF qui ne perd aucune ligne

Lire un fichier texte en VBA offre trois outils, et choisir le mauvais brouille vos données. Line Input # lit une ligne brute dans une chaîne et c'est vous qui la découpez, ce qui est prévisible. Input # analyse les champs délimités directement dans des variables — rapide pour un fichier que Write # a produit, mais il s'étrangle sur les virgules non protégées et les guillemets égarés. Input(LOF(f), #f) avale tout le fichier dans une seule chaîne. Ce guide montre la boucle EOF qui lit chaque ligne exactement une fois, pourquoi Input # est le jumeau de Write # et Line Input # celui de Print #, comment éviter le décalage d'un cran qui lève l'erreur 62, et quand un CSV vaut mieux ouvert comme un classeur qu'analysé à la main.

Henry
VBA MkDir dans Excel — créer un dossier, et pourquoi il ne peut pas créer un chemin imbriqué

VBA MkDir dans Excel — créer un dossier, et pourquoi il ne peut pas créer un chemin imbriqué

L'instruction VBA MkDir crée exactement un niveau de dossier, pas un chemin entier — MkDir sur un chemin dont le parent n'existe pas lève l'erreur 76, et MkDir sur un dossier qui existe déjà lève l'erreur 75 au lieu de ne rien faire. Ainsi la tâche quotidienne créer ce dossier revient en réalité à créer chaque niveau manquant, et seulement là où il est absent. Ce guide montre pourquoi MkDir ne crée qu'un seul niveau, pourquoi FileSystemObject.CreateFolder ne récurse pas davantage, la boucle protégée par un test d'existence qui construit un chemin complet en toute sécurité, et pourquoi un simple nom de dossier atterrit sous CurDir plutôt que dans le dossier de votre classeur.

Henry
VBA RmDir dans Excel — supprimer un dossier, mais seulement s'il est vide

VBA RmDir dans Excel — supprimer un dossier, mais seulement s'il est vide

L'instruction VBA RmDir supprime un dossier uniquement lorsqu'il est complètement vide — pointez-la sur un dossier qui contient encore des fichiers ou des sous-dossiers et elle lève l'erreur 75, l'exact reflet inverse de Kill, qui supprime n'importe quel fichier sans pitié. Ainsi supprimer ce dossier revient en réalité à le vider d'abord, puis à le retirer. Ce guide montre pourquoi RmDir refuse un dossier non vide, pourquoi il supprime les dossiers mais jamais les fichiers, comment vider un dossier avec Kill avant RmDir, et quand FileSystemObject.DeleteFolder efface une arborescence entière en un seul appel — sans corbeille et sans annulation.

Henry
VBA CurDir & ChDir dans Excel — pourquoi un chemin relatif atterrit dans le mauvais dossier

VBA CurDir & ChDir dans Excel — pourquoi un chemin relatif atterrit dans le mauvais dossier

En VBA, un chemin relatif n'a aucun sens tant qu'il n'est pas résolu par rapport à CurDir, le répertoire de travail courant — et dans Excel ce répertoire est un réglage vagabond que vous ne contrôlez pas, pas le dossier où votre classeur est enregistré. Ainsi MkDir Reports ou Open data.csv peut atterrir à un endroit différent à chaque exécution, parce qu'une boîte de dialogue Ouvrir un fichier déplace CurDir en silence. Ce guide montre pourquoi CurDir n'est pas ThisWorkbook.Path, pourquoi ChDir ne peut pas changer de lecteur sans ChDrive, et l'unique habitude qui élimine toute la catégorie des bugs de mauvais dossier — ancrez chaque chemin à ThisWorkbook.Path.

Henry
VBA Copy File dans Excel — FileCopy, FileSystemObject.CopyFile, et pourquoi il ne peut pas copier un classeur ouvert

VBA Copy File dans Excel — FileCopy, FileSystemObject.CopyFile, et pourquoi il ne peut pas copier un classeur ouvert

Copier un fichier en VBA tient en une ligne, mais laquelle dépend de savoir si le fichier est ouvert. FileCopy est l'instruction intégrée qui n'exige aucune référence, et elle écrase la destination en silence, pourtant elle ne peut pas copier un fichier ouvert et lève l'erreur 70 Permission denied sur le seul classeur que vous voulez le plus sauvegarder. Ce guide trace la frontière entre trois outils de copie pour trois situations — FileCopy pour les fichiers fermés sur le disque, FileSystemObject.CopyFile pour les caractères génériques et un indicateur d'écrasement explicite, et SaveCopyAs pour le classeur ouvert à l'instant même — et montre pourquoi la destination doit être un chemin complet incluant le nom du fichier, pourquoi le dossier cible doit déjà exister, et comment copier-puis-supprimer devient un déplacement.

Henry
VBA Delete File dans Excel — Kill, FileSystemObject.DeleteFile, et pourquoi il n'y a aucune annulation

VBA Delete File dans Excel — Kill, FileSystemObject.DeleteFile, et pourquoi il n'y a aucune annulation

L'instruction VBA Kill supprime un fichier définitivement — pas de Corbeille, pas de confirmation, pas d'annulation. Ce seul fait est à la fois tout l'intérêt et tout le danger, et chaque autre règle sur la suppression de fichiers est une façon de garder cette ligne irréversible. Ce guide montre pourquoi Kill lève une erreur au lieu de ne rien faire quand un fichier est absent ou ouvert, comment un caractère générique efface toutes les correspondances d'un coup sans invite, pourquoi Kill ne peut pas retirer un dossier et comment RmDir et DeleteFolder se partagent cette tâche, et quand FileSystemObject.DeleteFile avec son indicateur Force est le choix le plus sûr pour les fichiers en lecture seule.

Henry
VBA Rename File dans Excel — l'instruction Name qui déplace aussi les fichiers (et refuse d'écraser)

VBA Rename File dans Excel — l'instruction Name qui déplace aussi les fichiers (et refuse d'écraser)

L'instruction VBA Name renomme un fichier, mais c'est en réalité une instruction de renommage-et-déplacement — pointez le nouveau chemin sur un dossier différent et VBA déplace le fichier là-bas au lieu de le renommer sur place. Et contrairement à presque tout le reste sur le disque, Name refuse d'écraser, levant l'erreur 58 quand la cible existe déjà, l'exact opposé de FileCopy qui écrase en silence. Ce guide montre pourquoi Name déplace autant qu'il renomme, pourquoi il ne traverse pas les lecteurs et comment FileCopy plus Kill ou FileSystemObject.MoveFile gère ce cas, et pourquoi vous devez protéger la destination pour qu'une erreur sur un fichier existant n'arrête pas une macro sans surveillance.

Henry
VBA Dir dans Excel — parcourir les fichiers d'un dossier, et l'itérateur à état qui vous piège

VBA Dir dans Excel — parcourir les fichiers d'un dossier, et l'itérateur à état qui vous piège

Dir ressemble à une fonction mais se comporte comme un itérateur à mémoire cachée — Dir(path) renvoie le premier nom de fichier correspondant, puis Dir() sans argument renvoie le suivant, et une chaîne vide quand le dossier est épuisé. La règle qui vous sauve est de ne jamais rappeler Dir au milieu d'une boucle Dir, car un second Dir lance une nouvelle recherche et réinitialise la première — la cause numéro un des fichiers sautés et des boucles infinies. Découvrez comment parcourir chaque .xlsx d'un dossier, pourquoi Dir ne renvoie que le nom et non le chemin, pourquoi il ne sait pas récurser dans les sous-dossiers, et quand rassembler les noms dans un tableau avant d'agir.

Henry
VBA FileSystemObject dans Excel — CreateObject contre référence, sous-dossiers, et pourquoi il n'ouvre pas les classeurs

VBA FileSystemObject dans Excel — CreateObject contre référence, sous-dossiers, et pourquoi il n'ouvre pas les classeurs

Le FileSystemObject transforme le disque en un modèle objet — des dossiers et fichiers que vous parcourez avec For Each et dont vous lisez les propriétés, au lieu de l'unique curseur caché de Dir. La décision qui vous sauve est CreateObject(Scripting.FileSystemObject) plutôt que Dim fso As New FileSystemObject, car la liaison tardive n'exige aucune référence et tourne partout, tandis que la version à liaison précoce échoue à compiler sur tout PC où Microsoft Scripting Runtime n'est pas coché. Découvrez quand FSO surpasse Dir, comment récurser dans les sous-dossiers via sa collection SubFolders, comment lire Size et DateLastModified, et pourquoi FSO ouvre les fichiers texte mais jamais un classeur Excel.

Henry
VBA Check If File Exists — Dir contre FileSystemObject.FileExists, et le piège à l'intérieur d'une boucle Dir

VBA Check If File Exists — Dir contre FileSystemObject.FileExists, et le piège à l'intérieur d'une boucle Dir

Il existe deux bonnes façons de tester l'existence d'un fichier en VBA, et un mauvais réflexe. Ce réflexe est de l'ouvrir et de piéger l'erreur, ce qui est lent et masque les vraies défaillances. Les bonnes réponses sont Dir(path) (une ligne intégrée) et fso.FileExists(path) (sans état et plus clair) — et la règle qui vous sauve est de ne jamais utiliser le test Dir à l'intérieur d'une boucle Dir, car Dir partage un unique curseur caché et le test réinitialise en silence votre énumération. Découvrez pourquoi FileExists est le choix par défaut le plus sûr, comment Dir gère mal un dossier ou une barre oblique inverse finale, et pourquoi vérifier puis ouvrir exige encore un garde-fou d'erreur.

Henry
VBA Open Workbook dans Excel — Workbooks.Open, capturer la valeur de retour, et pourquoi ce n'est pas Workbook_Open

VBA Open Workbook dans Excel — Workbooks.Open, capturer la valeur de retour, et pourquoi ce n'est pas Workbook_Open

Workbooks.Open est une fonction qui renvoie le classeur qu'elle vient d'ouvrir, donc la seule règle qui vous sauve est Set wb = Workbooks.Open(path) — capturez cette valeur de retour et parlez à wb, jamais à ActiveWorkbook, qui change à l'instant où quoi que ce soit vole le focus. Découvrez la différence entre Workbooks.Open (une méthode que vous appelez) et Workbook_Open (un événement qui s'exécute automatiquement), comment protéger un chemin manquant pour obtenir un message plutôt que l'erreur d'exécution 1004, comment gérer un fichier déjà ouvert, et quels paramètres ouvrent en silence une boîte de dialogue et bloquent une macro sans surveillance.

Henry
VBA Save Workbook dans Excel — Save contre SaveAs, le piège de FileFormat, et pourquoi vos macros disparaissent

VBA Save Workbook dans Excel — Save contre SaveAs, le piège de FileFormat, et pourquoi vos macros disparaissent

Save écrase le fichier que vous avez déjà, sur place et sans boîte de dialogue. SaveAs écrit un nouveau fichier ou un nouveau type, et le numéro FileFormat est le piège — enregistrez un classeur à macros en xlOpenXMLWorkbook (51, le format xlsx) et Excel supprime en silence chaque ligne de votre VBA ; il vous faut xlOpenXMLWorkbookMacroEnabled (52) pour le xlsm. Découvrez quand utiliser Save, SaveAs et SaveCopyAs, pourquoi Save sur un classeur tout neuf fait apparaître la boîte de dialogue Enregistrer sous et bloque une macro sans surveillance, comment DisplayAlerts transforme l'invite d'écrasement en approbation anticipée, et pourquoi wb.Saved = True marque un classeur comme propre sans rien écrire.

Henry
VBA Close Workbook dans Excel — SaveChanges, l'invite qui bloque votre macro, et fermer sans enregistrer

VBA Close Workbook dans Excel — SaveChanges, l'invite qui bloque votre macro, et fermer sans enregistrer

wb.Close sur un classeur comportant des modifications non enregistrées fait surgir la boîte de dialogue modale « Voulez-vous enregistrer les modifications ? », et dans une macro sans surveillance cette boîte attend indéfiniment. Vous y répondez en code avec l'argument SaveChanges — wb.Close SaveChanges:=False abandonne, SaveChanges:=True enregistre d'abord, et l'omettre déclenche l'invite. Découvrez pourquoi fermer sans l'argument est la première raison pour laquelle une macro planifiée ne finit jamais, pourquoi la variable objet est morte à l'instant où vous fermez, en quoi Close diffère d'Application.Quit, et pourquoi fermer le dernier classeur peut laisser un EXCEL.EXE invisible en cours d'exécution.

Henry
VBA Wait dans Excel — Application.Wait, pourquoi il fige Excel, et quand utiliser Sleep à la place

VBA Wait dans Excel — Application.Wait, pourquoi il fige Excel, et quand utiliser Sleep à la place

Application.Wait est un réveil, pas un chronomètre. Vous lui donnez un moment de l'horloge où se réveiller, pas un nombre de secondes à décompter, et c'est pourquoi Application.Wait 5 ne fait presque rien alors que la bonne ligne est Application.Wait Now + TimeValue("0:00:05"). Il ne descend pas sous la seconde entière et il fige Excel pendant toute l'attente, incapable de repeindre l'écran, de mettre à jour une barre d'état ou de laisser l'utilisateur annuler. Découvrez le modèle du réveil, l'argument en temps absolu qui piège tout le monde, pourquoi les pauses inférieures à la seconde exigent Sleep, et pourquoi une pause où Excel doit rester vivant est plutôt une boucle DoEvents.

Henry
VBA Sleep dans Excel — l'appel d'API Windows, le piège PtrSafe 64 bits, et Wait vs Sleep

VBA Sleep dans Excel — l'appel d'API Windows, le piège PtrSafe 64 bits, et Wait vs Sleep

Sleep n'est pas un mot-clé VBA. C'est une fonction kernel32 de Windows que vous empruntez avec une instruction Declare pour mettre votre macro en pause pendant un nombre de millisecondes, d'où la précision inférieure à la seconde que Application.Wait ne peut pas offrir. Le piège, c'est la déclaration elle-même. Les vieilles lignes Declare Sub Sleep copiées-collées provoquent une erreur de compilation sur Excel 64 bits tant que vous n'ajoutez pas l'attribut PtrSafe dans une garde de compilation conditionnelle VBA7. Découvrez le modèle de l'API empruntée, le correctif 64 bits exact, pourquoi les millisecondes ne sont pas précises, et pourquoi Sleep fige quand même Excel, si bien qu'une pause réactive passe plutôt par une boucle DoEvents.

Henry
VBA Timer dans Excel — mesurer combien de temps prend votre macro (et pourquoi ce n'est pas un planificateur)

VBA Timer dans Excel — mesurer combien de temps prend votre macro (et pourquoi ce n'est pas un planificateur)

La fonction VBA Timer est un chronomètre, pas un minuteur de compte à rebours. Malgré son nom, elle ne déclenche jamais rien après N secondes et ne met jamais votre code en pause. Elle renvoie simplement le nombre de secondes écoulées depuis minuit, et vous la lisez deux fois pour mesurer combien de temps a pris un bloc de code. C'est donc l'outil qui prouve que ScreenUpdating = False a réellement accéléré votre macro, au lieu de le supposer. Découvrez le modèle du chronomètre, pourquoi ceux qui cherchent un minuteur veulent en général plutôt Application.OnTime, le bug de passage à minuit qui produit des temps écoulés négatifs, et sa résolution au centième de seconde.

Henry
VBA DoEvents dans Excel — empêcher Excel de passer en Ne répond pas (et pourquoi il laisse votre macro s'exécuter deux fois)

VBA DoEvents dans Excel — empêcher Excel de passer en Ne répond pas (et pourquoi il laisse votre macro s'exécuter deux fois)

DoEvents met votre macro en pause un instant et laisse Excel traiter les clics, les frappes et les redessins accumulés pendant l'exécution de votre code, ce qui empêche la fenêtre de virer au gris en Ne répond pas et rend possible un bouton d'annulation qui marche. Mais le même moment de cession qui garde Excel en vie rend aussi le contrôle à l'utilisateur en plein milieu de la macro, si bien qu'il peut cliquer de nouveau sur le même bouton et lancer une deuxième copie de votre macro à l'intérieur de la première. C'est cette réentrance, et non la performance, qui est le vrai danger. Découvrez où placer DoEvents, comment vous prémunir contre la réentrance avec un drapeau d'exécution, pourquoi vous devez le limiter en fréquence, et pourquoi ce n'est pas du multithreading.

Henry
VBA StatusBar dans Excel — afficher la progression d'une macro sans UserForm (et le message qui reste bloqué pour toujours)

VBA StatusBar dans Excel — afficher la progression d'une macro sans UserForm (et le message qui reste bloqué pour toujours)

Application.StatusBar vous permet d'écrire votre propre texte dans la barre en bas de la fenêtre Excel, ce qui est la façon la plus légère d'afficher la progression d'une macro en cours, sans UserForm et sans scintillement. La ligne que tout le monde oublie, c'est la réinitialisation. Le dernier texte que vous avez écrit y reste épinglé après la fin de la macro, car Excel ne reprend pas la barre tant que vous n'avez pas mis Application.StatusBar à False. Et elle ne se met pas à jour de façon visible à l'intérieur d'une boucle serrée à moins qu'Excel n'ait un instant pour repeindre, et c'est là qu'intervient DoEvents. Découvrez le motif écrire-puis-réinitialiser, pourquoi False vaut mieux qu'une chaîne vide, l'idiome du pourcentage de progression, et quand une vraie barre de progression mérite le surcroît de travail.

Henry
VBA DisplayAlerts dans Excel — supprimer les invites de confirmation des macros sans surveillance (et pourquoi il valide automatiquement les plus dangereuses)

VBA DisplayAlerts dans Excel — supprimer les invites de confirmation des macros sans surveillance (et pourquoi il valide automatiquement les plus dangereuses)

Application.DisplayAlerts à False dit à Excel de cesser d'afficher ses boîtes de dialogue de confirmation et d'avertissement pendant l'exécution de votre macro, si bien qu'une macro sans surveillance ne se bloque pas en attendant qu'on clique sur OK. Mais il ne fait pas taire l'avertissement, il y répond à votre place avec la réponse par défaut d'Excel, et pour des invites comme supprimer cette feuille ou écraser ce fichier, la réponse par défaut est d'y aller. Il se remet à True tout seul à la fin de la macro, si bien que le vrai piège n'est pas de le laisser désactivé pour toujours mais de supprimer un avertissement qui vous protégeait. Découvrez où il aide, la règle de la fenêtre étroite, pourquoi ce n'est pas la même chose que la gestion des erreurs, et comment il s'associe à ScreenUpdating et Calculation.

Henry
VBA ScreenUpdating dans Excel — supprimer le scintillement et accélérer les macros (et pourquoi ça ne réparera pas une macro lente)

VBA ScreenUpdating dans Excel — supprimer le scintillement et accélérer les macros (et pourquoi ça ne réparera pas une macro lente)

Application.ScreenUpdating à False dit à Excel de cesser de repeindre l'écran pendant l'exécution de votre macro et de tout redessiner une seule fois à la fin, ce qui supprime le scintillement et apporte un gain de vitesse modéré. Mais cela n'aide que lorsque votre code écrit, sélectionne ou fait défiler — greffez-le sur une macro limitée par le calcul et vous ne gagnez rien. La règle qui vous sauve, c'est qu'un plantage peut laisser l'écran figé et grisé, alors vous le rétablissez dans un gestionnaire d'erreurs, jamais en comptant sur une réinitialisation automatique. Découvrez où il aide, où il n'aide pas, le piège du scintillement dû au rétablissement imbriqué, et le motif CleanExit qui l'associe à Calculation et EnableEvents.

Henry
VBA Calculation dans Excel — passer le calcul en manuel pour la vitesse (et le piège silencieux de le laisser en manuel)

VBA Calculation dans Excel — passer le calcul en manuel pour la vitesse (et le piège silencieux de le laisser en manuel)

Application.Calculation à xlCalculationManual dit à Excel de cesser de recalculer après chaque écriture et de tout différer en une seule passe, ce qui constitue le vrai gain de vitesse sur les classeurs chargés de formules. Mais c'est l'interrupteur le plus dangereux de VBA car sa défaillance est silencieuse — laissez-le en manuel et les formules cessent de se mettre à jour sans aucun indice visuel, si bien que les totaux se figent et personne ne le voit. La règle qui vous sauve consiste à sauvegarder l'état de calcul, à forcer un recalcul avec Application.Calculate quand une étape ultérieure a besoin d'un résultat, et à rétablir l'état sauvegardé dans un gestionnaire d'erreurs plutôt que de coder Automatic en dur. Découvrez les pièges du mode manuel, l'error 1004 quand aucun classeur n'est ouvert, et le motif CleanExit.

Henry
VBA EnableEvents dans Excel — empêcher votre macro de déclencher ses propres événements (et pourquoi un plantage les laisse morts)

VBA EnableEvents dans Excel — empêcher votre macro de déclencher ses propres événements (et pourquoi un plantage les laisse morts)

Application.EnableEvents à False empêche les écritures de votre macro de déclencher des gestionnaires d'événements comme Worksheet_Change, ce qui brise la boucle infinie où un gestionnaire modifie une cellule et se redéclenche lui-même. C'est un interrupteur de justesse, pas de vitesse. La règle qui vous sauve, c'est qu'EnableEvents est une propriété au niveau de l'application qui ne se réinitialise pas d'elle-même, si bien qu'un plantage en le laissant à False laisse morts tous les événements de tous les classeurs ouverts jusqu'au redémarrage d'Excel — ce qui explique pourquoi les utilisateurs signalent que leurs boutons ont cessé de fonctionner. Découvrez le correctif du Worksheet_Change récursif, le rétablissement CleanExit, et pourquoi cet interrupteur compte encore plus que les autres.

Henry
VBA SpecialCells dans Excel — sélectionner cellules vides, cellules visibles et constantes (et pourquoi il plante quand il ne trouve rien)

VBA SpecialCells dans Excel — sélectionner cellules vides, cellules visibles et constantes (et pourquoi il plante quand il ne trouve rien)

SpecialCells laisse Excel choisir les cellules pour vous par type plutôt que par adresse — toutes les vides, toutes les lignes visibles, toutes les formules, toutes les constantes. C'est le jumeau en code de la commande Atteindre les cellules. La règle qui vous sauve, c'est que SpecialCells lève error 1004 quand il ne trouve rien du tout, si bien qu'un appel nu est une bombe à retardement ; la forme mûre associe toujours On Error Resume Next et If Not result Is Nothing. Découvrez les types de cellules qui comptent, les motifs remplir-les-vides et copier-les-lignes-visibles, et pourquoi le résultat est une référence multi-zones.

Henry
VBA Union dans Excel — combiner des plages non adjacentes en une seule référence (et pourquoi il ne déduplique pas)

VBA Union dans Excel — combiner des plages non adjacentes en une seule référence (et pourquoi il ne déduplique pas)

Union colle des rectangles éparpillés en une seule référence pour que vous puissiez colorer, effacer ou copier plusieurs blocs non adjacents en une opération — la version en code du Ctrl-clic sur plusieurs zones. La règle qui piège tout le monde, c'est qu'Union concatène, il ne déduplique pas ; les cellules qui se chevauchent sont comptées deux fois, donc .Count ment et Union est une liste de lot, pas une union d'ensembles. Découvrez le motif d'accumulation qui évite l'erreur Union of Nothing, pourquoi c'est une opération par référence au lieu d'une boucle cellule par cellule, et en quoi Union diffère d'Intersect.

Henry
VBA Intersect dans Excel — trouver où deux plages se chevauchent (et la protection Worksheet_Change que tout le monde emploie)

VBA Intersect dans Excel — trouver où deux plages se chevauchent (et la protection Worksheet_Change que tout le monde emploie)

Intersect ne renvoie que les cellules que deux plages partagent, et renvoie Nothing quand elles ne se touchent pas — et ce Nothing est tout l'intérêt. Son usage numéro un est la protection de Worksheet_Change, If Not Intersect(Target, Range) Is Nothing, qui empêche un événement de se déclencher à chaque modification de la feuille. La règle qui vous sauve, c'est qu'aucun chevauchement renvoie Nothing, si bien que tout accès à une propriété sans vérification Is Nothing plante avec error 91. Découvrez la protection d'événement complète avec EnableEvents, comment restreindre une macro à une zone cible, et en quoi Intersect diffère d'Union.

Henry
VBA Cells vs Range dans Excel — référencer des cellules par numéro (et pourquoi Cells(1, 2) est B1, pas A2)

VBA Cells vs Range dans Excel — référencer des cellules par numéro (et pourquoi Cells(1, 2) est B1, pas A2)

Cells, c'est Range adressé par des nombres. Range(A1) désigne une cellule avec une chaîne dans l'ordre de lecture, la lettre de colonne puis la ligne ; Cells(ligne, colonne) désigne une cellule avec deux entiers dans l'ordre de stockage d'Excel, la ligne d'abord puis la colonne. Voilà pourquoi Cells(1, 2) est B1, pas A2 — et pourquoi Cells, dont on peut calculer les coordonnées, est la référence conçue pour les boucles. Découvrez quand employer Cells plutôt que Range, comment bâtir un bloc à partir d'angles calculés avec Range(Cells, Cells), pourquoi un Cells nu désigne toute la feuille, et pourquoi qualifier Cells d'une feuille de calcul.

Henry
VBA Resize dans Excel — remodeler une plage depuis son ancre (et pourquoi c'est un nombre, pas un delta)

VBA Resize dans Excel — remodeler une plage depuis son ancre (et pourquoi c'est un nombre, pas un delta)

Resize fixe l'ancre en haut à gauche d'une plage et redessine le rectangle à une nouvelle taille. Il ne déplace pas la référence comme le fait Offset, et il ne sélectionne rien — il renvoie une nouvelle plage partant du même coin. La règle qui piège tout le monde, c'est que Resize(lignes, colonnes) est un nombre absolu à base 1 de la taille finale, pas un delta à ajouter, si bien que Range(A1).Resize(5, 3) donne A1:C5 et Resize(0) déclenche l'erreur 1004. Découvrez comment omettre un argument pour laisser une dimension intacte, pourquoi l'ancre est toujours en haut à gauche, et les deux motifs qui paient — retirer un en-tête avec Offset plus Resize, et réécrire un tableau dans un bloc qui lui va.

Henry
VBA CurrentRegion dans Excel — saisir tout le bloc de données en une ligne (et ce qu'une ligne vide lui fait)

VBA CurrentRegion dans Excel — saisir tout le bloc de données en une ligne (et ce qu'une ligne vide lui fait)

CurrentRegion est le bloc contigu de cellules autour d'une cellule. Excel part de votre cellule et s'étend vers l'extérieur jusqu'à rencontrer une ligne entièrement vide et une colonne entièrement vide, renvoyant le plus petit rectangle qui enferme cet îlot ininterrompu — exactement ce que sélectionne Ctrl+Maj+astérisque. Vous ne calculez pas les bords ; Excel les trouve. Le piège, c'est qu'une seule ligne ou colonne entièrement vide forme un mur qui scinde le bloc en silence, si bien que vous obtenez la moitié de vos données sans aucune erreur. Découvrez pourquoi CurrentRegion inclut l'en-tête et comment le retirer avec Offset et Resize, en quoi il diffère d'UsedRange et de End(xlUp), et quand utiliser plutôt un vrai tableau.

Henry
VBA Borders dans Excel — tracer des bordures de cellule en code (et pourquoi tout le bloc s'est retrouvé encadré)

VBA Borders dans Excel — tracer des bordures de cellule en code (et pourquoi tout le bloc s'est retrouvé encadré)

Une bordure en VBA Excel est une propriété d'un bord, pas un interrupteur sur la cellule. Une plage possède huit bordures adressables — quatre bords extérieurs, deux jeux de quadrillage intérieur et deux diagonales — et la collection Range.Borders nue les désigne toutes à la fois. C'est pourquoi Range.Borders.LineStyle = xlContinuous encadre chaque cellule au lieu de tracer un seul contour. Découvrez quand utiliser BorderAround pour le seul cadre, comment LineStyle, Weight et Color se combinent, comment définir un seul bord avec xlEdgeBottom, et comment effacer les bordures avec xlLineStyleNone.

Henry
VBA Merge Cells dans Excel — fusionner et défusionner en code (et pourquoi il vaut mieux s'en abstenir)

VBA Merge Cells dans Excel — fusionner et défusionner en code (et pourquoi il vaut mieux s'en abstenir)

Fusionner des cellules en VBA Excel n'est pas du formatage — c'est un changement structurel de la grille. Range(A1:C1).Merge fond trois cellules en une seule qui s'étend sur trois colonnes, et seule la valeur en haut à gauche survit tandis que les autres sont effacées. C'est pourquoi les cellules fusionnées cassent silencieusement le tri, les calculs de Range, les insertions de colonnes et les boucles. Découvrez Merge, UnMerge, MergeCells et MergeArea, pourquoi les pros préfèrent Center Across Selection, et comment repérer et nettoyer les cellules fusionnées sans risque en code.

Henry
VBA Column Width & Row Height dans Excel — redimensionner et AutoFit en code (et les unités qui vous piègent)

VBA Column Width & Row Height dans Excel — redimensionner et AutoFit en code (et les unités qui vous piègent)

Dimensionner des cellules en VBA Excel agit sur la colonne ou la ligne entière, et les deux dimensions utilisent des unités différentes — ColumnWidth se mesure en caractères de la police Normal, RowHeight se mesure en points. Ce décalage explique pourquoi une largeur de 10 et une hauteur de 10 n'ont rien de comparable. AutoFit est l'autre piège. Il ne s'exécute que sur une colonne ou une ligne entière, et il mesure le texte affiché, donc il ignore silencieusement les cellules fusionnées. Découvrez ColumnWidth face à la propriété Width en lecture seule, RowHeight et le retour à la ligne, EntireColumn.AutoFit, et pourquoi mettre la largeur à zéro est la mauvaise façon de masquer une colonne.

Henry
VBA Font dans Excel — définir la couleur, le gras et la taille en code (et le piège de ColorIndex)

VBA Font dans Excel — définir la couleur, le gras et la taille en code (et le piège de ColorIndex)

L'objet Font est la couche texte d'une cellule en VBA Excel — couleur, gras, italique, taille et nom, sans jamais toucher à la valeur en dessous. Le piège, c'est la couleur. Il existe trois façons de la définir et elles utilisent des espaces de nombres différents. Range.Font.Color prend un nombre RGB 24 bits, Range.Font.ColorIndex prend un index de palette de 1 à 56, et les deux ne sont pas interchangeables. Découvrez laquelle utiliser, comment mettre en gras ou redimensionner une partie de cellule avec Characters, pourquoi la coloration selon la valeur relève de la Mise en forme conditionnelle, et comment relire une couleur de police sans obtenir le mauvais nombre.

Henry
VBA Cell Color dans Excel — définir le remplissage d'arrière-plan en code (et pourquoi la couleur n'est pas une donnée)

VBA Cell Color dans Excel — définir le remplissage d'arrière-plan en code (et pourquoi la couleur n'est pas une donnée)

Range.Interior est la couche de remplissage d'une cellule en VBA Excel — la peinture derrière le texte. Définissez-la avec Interior.Color et RGB, effacez-la avec Interior.ColorIndex réglé sur xlNone, et sachez qu'un remplissage blanc n'est pas la même chose qu'une absence de remplissage. Le point plus profond, c'est qu'une cellule colorée ne porte aucune donnée. SUM et SUMIF l'ignorent, si bien que colorer pour catégoriser revient à cacher de l'information là où les formules ne peuvent pas la lire. Découvrez les propriétés de couleur, comment surligner selon une condition sans boucle qui se périme, et comment remplir de nombreuses plages rapidement.

Henry
VBA NumberFormat dans Excel — changer l'affichage d'un nombre sans changer sa valeur

VBA NumberFormat dans Excel — changer l'affichage d'un nombre sans changer sa valeur

Range.NumberFormat est la couche d'affichage d'une cellule en VBA Excel. Elle change la façon dont un nombre stocké se lit à l'écran et ne change jamais le nombre lui-même, si bien que formater une cellule pour afficher 5 alors qu'elle contient 5.4999 n'est pas un arrondi et que la somme utilise toujours 5.4999. C'est là que l'opposition apparence contre valeur mord pour de bon, car une date est en réalité un numéro de série déguisé. Découvrez le langage des codes de format, en quoi NumberFormat diffère de la fonction Format, le piège des paramètres régionaux avec NumberFormatLocal, et quand il vous faut plutôt Round.

Henry
VBA WorksheetFunction dans Excel — appeler les fonctions natives d'Excel depuis le code (et les deux façons dont elles échouent)

VBA WorksheetFunction dans Excel — appeler les fonctions natives d'Excel depuis le code (et les deux façons dont elles échouent)

Application.WorksheetFunction permet à VBA d'emprunter les plus de 450 fonctions intégrées d'Excel au lieu de réécrire SUM, VLOOKUP ou COUNTIF sous forme de boucle. Le piège, c'est qu'il existe deux façons de les appeler et qu'elles échouent différemment. WorksheetFunction.X déclenche une erreur d'exécution en l'absence de correspondance, tandis qu'Application.X renvoie une valeur d'erreur que vous testez avec IsError. Découvrez quel style d'appel choisir, pourquoi le résultat doit être un Variant, quelles fonctions ne pas appeler ainsi, et quand passer une plage entière plutôt que de boucler cellule par cellule.

Henry
VBA Remove Duplicates dans Excel — dédupliquer en une ligne (et pourquoi cela supprime sans annulation possible)

VBA Remove Duplicates dans Excel — dédupliquer en une ligne (et pourquoi cela supprime sans annulation possible)

Range.RemoveDuplicates, c'est le bouton Supprimer les doublons d'Excel en une seule ligne de code, mais il est destructeur là où une boucle ne l'est pas. Il supprime les lignes sur place, conserve la première occurrence, et ne peut pas être annulé une fois la macro exécutée. L'argument qui piège tout le monde est Columns, dont les numéros sont des décalages à l'intérieur de la plage, pas des lettres de colonne de la feuille. Découvrez le piège du décalage dans la plage, pourquoi Header xlYes compte, comment garder la dernière ligne plutôt que la première, et quand recourir plutôt au filtre avancé ou à un Dictionary.

Henry
VBA Advanced Filter dans Excel — extraire des valeurs uniques et filtrer vers une nouvelle plage (sans boucle)

VBA Advanced Filter dans Excel — extraire des valeurs uniques et filtrer vers une nouvelle plage (sans boucle)

Range.AdvancedFilter est le seul filtre qui produit des données plutôt qu'une vue. Il peut extraire une liste unique ou un ensemble de lignes correspondant à des critères vers un autre emplacement en un seul appel, sans boucle et sans rien supprimer. Ce qui déroute, c'est que sa clause WHERE vit dans des cellules, une plage de critères dont l'en-tête doit correspondre exactement aux données. Découvrez xlFilterInPlace face à xlFilterCopy, comment fonctionne la plage de critères, comment Unique True déduplique sans détruire, le piège de correspondance d'en-tête qui renvoie une sortie vide, et en quoi cela diffère d'AutoFilter et de Remove Duplicates.

Henry
VBA Find dans Excel — rechercher dans les cellules correctement (Find renvoie une Range, pas une position)

VBA Find dans Excel — rechercher dans les cellules correctement (Find renvoie une Range, pas une position)

La méthode VBA Range.Find est le Ctrl+F d'Excel pour le code, et elle déroute parce qu'elle renvoie un objet Range (ou Nothing en l'absence de correspondance) au lieu d'un nombre. Découvrez la vérification unique qui empêche le plantage error-91, le piège des arguments persistants qui fait se comporter Find différemment à chaque exécution, comment LookAt xlWhole face à xlPart tranche entre cellule entière et contenu partiel, et comment boucler FindNext pour obtenir chaque correspondance sans boucle infinie.

Henry
VBA AutoFilter dans Excel — filtrer des lignes dans le code (et pourquoi masqué n'est pas supprimé)

VBA AutoFilter dans Excel — filtrer des lignes dans le code (et pourquoi masqué n'est pas supprimé)

La méthode VBA AutoFilter filtre un tableau dans le code, mais les lignes qu'elle masque sont toujours là — elles comptent encore dans SUM, se copient encore, et occupent encore votre plage. Découvrez le modèle mental qui évite les bugs classiques, pourquoi vous devez passer par SpecialCells xlCellTypeVisible pour ne toucher que les lignes visibles, comment fonctionnent les critères et les opérateurs, le piège de la bascule qui désactive votre filtre à la deuxième exécution, et le schéma rapide filtrer-puis-supprimer pour retirer des lignes en masse.

Henry
VBA Sort dans Excel — Range.Sort vs l'objet Sort (et comment retrouver l'ordre d'origine)

VBA Sort dans Excel — Range.Sort vs l'objet Sort (et comment retrouver l'ordre d'origine)

Trier en VBA est une réorganisation permanente sans Ctrl+Z, aussi la première règle est-elle de protéger l'ordre d'origine avant d'y toucher. Découvrez le modèle mental qui sépare une vue d'une mutation, pourquoi Header xlYes compte sous peine de voir vos titres finir dans les données, la différence entre le rapide Range.Sort et l'objet Sort illimité, le piège SortFields.Clear qui hérite d'anciennes clés de tri, et pourquoi des nombres stockés en texte se trient dans le mauvais ordre.

Henry
VBA supprimer des lignes dans Excel — lignes, lignes vides et lignes selon une condition (bouclez à rebours !)

VBA supprimer des lignes dans Excel — lignes, lignes vides et lignes selon une condition (bouclez à rebours !)

Supprimer une ligne en VBA est une modification structurelle, pas un simple effacement — chaque ligne du dessous remonte pour combler le vide, et c'est pourquoi une boucle vers le bas saute des lignes. Découvrez la règle unique qui corrige tout, boucler de bas en haut ou tout supprimer d'un seul Union, en quoi EntireRow.Delete diffère de l'effacement d'une cellule, la manière rapide de retirer les lignes vides, et comment supprimer des lignes par condition sans corrompre vos données ni vos formules de référence.

Henry
VBA insérer des lignes et des colonnes dans Excel — décaler la grille dans le bon sens (et insérer dans une boucle sans chaos)

VBA insérer des lignes et des colonnes dans Excel — décaler la grille dans le bon sens (et insérer dans une boucle sans chaos)

Insérer est le miroir de supprimer — cela pousse les lignes existantes vers le bas (ou les colonnes vers la droite) pour faire de la place, si bien que le même décalage qui casse une boucle de suppression casse aussi une boucle d'insertion. Découvrez EntireRow.Insert face à une plage partielle avec l'argument Shift, pourquoi CopyOrigin décide quel voisin donne son format à la nouvelle ligne insérée, le sens sûr pour insérer dans une boucle, et la méthode en un seul appel pour ajouter de nombreuses lignes d'un coup.

Henry
VBA masquer des colonnes et des lignes dans Excel — masquer n'est pas supprimer (et pourquoi vos totaux ne changent pas)

VBA masquer des colonnes et des lignes dans Excel — masquer n'est pas supprimer (et pourquoi vos totaux ne changent pas)

Masquer une colonne en VBA, ce n'est ni la supprimer ni la filtrer — les données sont toujours là, toujours dans chaque SUM, toujours copiées lors d'une copie de plage, on leur donne simplement une largeur d'affichage nulle. Découvrez pourquoi .Hidden appartient à EntireColumn et EntireRow, pourquoi les cellules masquées comptent encore dans les formules, la ligne tout-afficher qui sauve une feuille bloquée, et en quoi les lignes masquées à la main diffèrent des lignes masquées par AutoFilter quand vous bouclez.

Henry
VBA Worksheet_BeforeDoubleClick dans Excel — transformer un double-clic en action (et supprimer le mode édition)

VBA Worksheet_BeforeDoubleClick dans Excel — transformer un double-clic en action (et supprimer le mode édition)

Worksheet_BeforeDoubleClick est l'événement qu'Excel déclenche à l'instant où vous double-cliquez une cellule, avant qu'elle ne passe en mode édition, et il vous remet la cellule Target ainsi qu'un indicateur Cancel. Mettez Cancel à True pour supprimer le mode édition et exécuter votre propre action — cocher une case, marquer une ligne comme faite, ou descendre au détail. Découvrez comment le cibler sur une seule colonne avec Intersect, pourquoi oublier Cancel fait basculer la cellule en mode édition, et où le code doit résider.

Henry
VBA Worksheet_BeforeRightClick dans Excel — remplacer le menu du clic droit (et pourquoi le désactiver n'est pas de la sécurité)

VBA Worksheet_BeforeRightClick dans Excel — remplacer le menu du clic droit (et pourquoi le désactiver n'est pas de la sécurité)

Worksheet_BeforeRightClick est l'événement qu'Excel déclenche à l'instant où vous faites un clic droit sur une cellule, avant l'apparition du menu contextuel, et il vous remet la cellule Target ainsi qu'un indicateur Cancel. Mettez Cancel à True pour supprimer le menu intégré et exécuter votre propre action ou afficher un menu personnalisé à la place. Découvrez comment le cibler avec Intersect pour ne pas paralyser Copier et Coller, pourquoi désactiver le clic droit relève de l'ergonomie plutôt que de la protection, et où le code doit résider.

Henry
VBA Workbook_BeforePrint dans Excel — bloquer une impression, tamponner un en-tête, et le piège de l'aperçu avant impression

VBA Workbook_BeforePrint dans Excel — bloquer une impression, tamponner un en-tête, et le piège de l'aperçu avant impression

Workbook_BeforePrint est l'événement qu'Excel déclenche avant que quoi que ce soit dans le classeur ne soit imprimé, et il vous remet un indicateur Cancel. Mettez Cancel à True et l'impression est bloquée — validez avant d'imprimer, ou empêchez un brouillon de sortir. Découvrez pourquoi l'événement se déclenche aussi pour l'aperçu avant impression (si bien qu'un traitement lourd fait ramer l'aperçu), pourquoi il s'exécute une seule fois pour tout le classeur plutôt que par feuille, pourquoi un Cancel silencieux est un bug, et où le code doit résider.

Henry
VBA Workbook_BeforeClose dans Excel — annuler la fermeture, proposer d'enregistrer, et où le code doit résider

VBA Workbook_BeforeClose dans Excel — annuler la fermeture, proposer d'enregistrer, et où le code doit résider

Workbook_BeforeClose est l'événement qu'Excel déclenche à l'instant où quelqu'un tente de fermer le fichier — avant que quoi que ce soit ne soit démantelé — et il vous remet un indicateur Cancel. Mettez Cancel à True et la fermeture est annulée. Découvrez comment lancer un nettoyage à la fermeture, comment empêcher Excel de demander deux fois d'enregistrer grâce à la propriété Saved, pourquoi il ne se déclenche jamais lors d'un plantage, et où le code doit résider.

Henry
VBA Workbook_BeforeSave dans Excel — valider ou bloquer un enregistrement, et ce que SaveAsUI vous dit vraiment

VBA Workbook_BeforeSave dans Excel — valider ou bloquer un enregistrement, et ce que SaveAsUI vous dit vraiment

Workbook_BeforeSave est l'événement qu'Excel déclenche à l'instant où un enregistrement est demandé — avant que quoi que ce soit ne soit écrit sur le disque — et il vous remet deux indicateurs, SaveAsUI et Cancel. Découvrez comment bloquer un enregistrement quand une cellule obligatoire est vide, comment estampiller automatiquement qui a enregistré et quand, pourquoi appeler Save dans le gestionnaire boucle à l'infini, et comment SaveAsUI vous permet d'imposer un nom de fichier.

Henry
VBA Worksheet_Activate et Deactivate dans Excel — exécuter du code au changement de feuille (et pourquoi on ne peut pas annuler un départ)

VBA Worksheet_Activate et Deactivate dans Excel — exécuter du code au changement de feuille (et pourquoi on ne peut pas annuler un départ)

Worksheet_Activate se déclenche quand une feuille devient active et Worksheet_Deactivate se déclenche à l'instant où vous la quittez — les événements d'arrivée et de départ d'une feuille. Le hic qui les définit — contrairement à BeforeClose et BeforeSave, aucun ne vous donne de Cancel, vous pouvez donc observer un changement de feuille mais pas le bloquer. Découvrez le motif d'actualisation à l'affichage, le contournement par renvoi, et les gestionnaires au niveau feuille contre niveau classeur.

Henry
VBA Class Module dans Excel — créez votre propre objet (plan contre instance, et le piège As New)

VBA Class Module dans Excel — créez votre propre objet (plan contre instance, et le piège As New)

Un class module VBA vous laisse définir votre propre type d'objet — un plan qui regroupe données et comportement — puis fabriquer autant d'instances indépendantes que voulu avec New. Le piège qui surprend tout le monde, c'est que les objets sont des types référence, donc Set b = a fait pointer les deux noms vers la même instance, et Dim x As New cache un piège d'instanciation paresseuse. Découvrez comment le nom du module devient le nom du type, quand une classe l'emporte sur un Type, et comment éviter les pièges classiques de New.

Henry
VBA Type dans Excel — regrouper des champs liés dans une seule variable (types définis par l'utilisateur ou class module)

VBA Type dans Excel — regrouper des champs liés dans une seule variable (types définis par l'utilisateur ou class module)

Un Type VBA — un type défini par l'utilisateur déclaré avec Type ... End Type — regroupe plusieurs champs liés dans une seule variable, si bien que Name, Age et Salary voyagent ensemble au lieu de former trois tableaux parallèles. C'est un type valeur, donc affecter une variable Type à une autre copie chaque champ, à la différence des objets, qui se partagent. Découvrez où placer la déclaration, pourquoi copier plutôt que partager change tout, et le moment précis où passer à un class module.

Henry
VBA Property dans Excel — Get, Let et Set (accès contrôlé aux champs d'une classe)

VBA Property dans Excel — Get, Let et Set (accès contrôlé aux champs d'une classe)

Property Get, Let et Set transforment un champ de classe en une porte — une petite procédure qui exécute votre code chaque fois que l'extérieur le lit ou l'écrit, pour valider une entrée, calculer une valeur à la volée ou rendre un champ en lecture seule. La distinction qui piège tout le monde, c'est Let contre Set — Let affecte une valeur, Set affecte un objet — et se tromper de mot-clé provoque une erreur de compilation ou d'exécution. Découvrez le motif du champ de stockage, quand une simple variable Public est le choix honnête, et comment construire une propriété en lecture seule.

Henry
VBA ActiveCell dans Excel — la cellule unique sous le curseur (ActiveCell contre Selection, et quand ça casse)

VBA ActiveCell dans Excel — la cellule unique sous le curseur (ActiveCell contre Selection, et quand ça casse)

ActiveCell est un pointeur vivant vers l'unique cellule qui a le curseur à cet instant — toujours exactement une cellule, sur la feuille active, à l'intérieur de la Selection courante. Découvrez en quoi il diffère de Selection, comment le lire et l'écrire avec .Value et .Offset, et la raison numéro un de ses plantages — il suit la feuille et le curseur laissés par l'utilisateur, ce qui en fait le mauvais outil pour du code qui ne concerne pas l'endroit où se trouve l'utilisateur.

Henry
VBA Selection dans Excel — travailler avec ce qui est en surbrillance (et pourquoi ce n'est pas toujours une Range)

VBA Selection dans Excel — travailler avec ce qui est en surbrillance (et pourquoi ce n'est pas toujours une Range)

Selection est un pointeur vivant vers ce qui est en surbrillance à cet instant — le plus souvent une plage de cellules, mais cela peut aussi être un graphique, une forme, ou rien du tout. Voilà pourquoi du code qui suppose que Selection est une plage plante dès qu'un graphique est sélectionné. Découvrez comment parcourir les cellules sélectionnées, gérer les sélections multi-zones avec .Areas, vous protéger avec TypeName, et quand ignorer complètement Selection pour nommer votre plage.

Henry
VBA Select vs Activate dans Excel — rompez avec l'habitude du .Select de l'enregistreur de macros

VBA Select vs Activate dans Excel — rompez avec l'habitude du .Select de l'enregistreur de macros

L'enregistreur de macros écrit ce que fait votre souris — Select une feuille, Select une cellule, agir sur la Selection — parce que c'est ainsi qu'une personne travaille, pas ainsi que le code devrait. Découvrez la vraie différence entre Select (mettre en surbrillance une ou plusieurs cellules) et Activate (définir l'unique cellule active), pourquoi presque chaque .Select est un détour lent et fragile que vous pouvez supprimer, les rares fois où sélectionner est vraiment nécessaire, et comment refactoriser le code de l'enregistreur pour agir directement sur des références de plage qualifiées.

Henry
VBA Workbook_Open dans Excel — exécuter une macro automatiquement à l'ouverture du fichier (et où le code doit résider)

VBA Workbook_Open dans Excel — exécuter une macro automatiquement à l'ouverture du fichier (et où le code doit résider)

Workbook_Open est l'événement qu'Excel déclenche à l'instant où votre fichier finit de s'ouvrir — du code qui s'exécute tout seul, sans bouton. Mais il ne se déclenche que s'il réside dans l'objet ThisWorkbook (pas un Module standard) et que l'utilisateur a activé les macros. Découvrez où placer le code, pourquoi il ne s'exécute jamais en silence, Workbook_Open contre Auto_Open, et comment le garder rapide et à l'épreuve des plantages.

Henry
VBA Worksheet_Change dans Excel — exécuter du code quand une cellule est modifiée (et la boucle infinie à éviter)

VBA Worksheet_Change dans Excel — exécuter du code quand une cellule est modifiée (et la boucle infinie à éviter)

Worksheet_Change est l'événement qu'Excel déclenche chaque fois qu'un utilisateur modifie une cellule de la feuille, en vous remettant la cellule modifiée sous forme de Target. Le piège qui attrape tout le monde — votre gestionnaire écrit dans une cellule, cette écriture redéclenche l'événement, et Excel boucle à l'infini. Découvrez le correctif Application.EnableEvents, comment le cibler avec Intersect, pourquoi il ignore les recalculs de formules, et où le code doit résider.

Henry
VBA Worksheet_SelectionChange dans Excel — exécuter du code quand le curseur se déplace (surligner la ligne active sans latence)

VBA Worksheet_SelectionChange dans Excel — exécuter du code quand le curseur se déplace (surligner la ligne active sans latence)

Worksheet_SelectionChange est l'événement qu'Excel déclenche chaque fois que le curseur se déplace — un clic, une touche fléchée, un appui sur Entrée. Il vous remet la nouvelle sélection sous forme de Target, ce qui rend possibles les astuces qui suivent le curseur, comme surligner la ligne active. Mais il se déclenche en permanence, si bien qu'un code lourd fait ramer toute la feuille. Découvrez le motif « surligner la ligne active » fait correctement, pourquoi il peut boucler, et comment le garder ultraléger.

Henry
VBA For Each dans Excel — parcourir une collection sans toucher à l'indice (et les pièges qu'il cache)

VBA For Each dans Excel — parcourir une collection sans toucher à l'indice (et les pièges qu'il cache)

For Each dit « fais ceci à chaque élément » et laisse VBA gérer l'ordre et les bornes — sans compteur, sans décalage d'une unité. Mais cette commodité cache trois règles strictes — la variable de boucle doit être un objet ou un Variant, parcourir un tableau est en lecture seule, et vous ne devez jamais supprimer d'une collection que vous parcourez. Découvrez quand For Each l'emporte sur For…Next et quand il vous trahit en silence.

Henry
VBA Collection dans Excel — la liste ordonnée qui s'agrandit (et pourquoi ce n'est pas un Dictionary)

VBA Collection dans Excel — la liste ordonnée qui s'agrandit (et pourquoi ce n'est pas un Dictionary)

Une Collection VBA est une liste ordonnée qui s'agrandit à chaque Add — sans ReDim, sans deviner la taille. Mais elle a quatre arêtes vives que les débutants heurtent à chaque fois — elle est en base 1 et non en base 0, on ne peut pas écraser un élément (seulement Add/Remove), une clé en double déclenche l'erreur 457, et il n'existe aucun test Exists intégré. Découvrez quand une Collection l'emporte sur un tableau ou un Dictionary, et quand elle vous coûte cher en silence.

Henry
VBA With dans Excel — écrire l'objet une seule fois (et le point initial qui fait tout basculer)

VBA With dans Excel — écrire l'objet une seule fois (et le point initial qui fait tout basculer)

L'instruction With nomme un objet une seule fois et vous laisse atteindre ses membres avec un simple point initial — moins de frappe, du code plus rapide, des blocs plus nets. Mais ce point initial est tout l'enjeu — oubliez-le et .Font devient Font, qui se lie en silence à la feuille active au lieu de votre objet. Découvrez ce que With optimise vraiment, le piège du point manquant, et comment With s'associe à For Each.

Henry
VBA Data Types dans Excel — String, Long, Double, Variant (et la bonne boîte pour chaque valeur)

VBA Data Types dans Excel — String, Long, Double, Variant (et la bonne boîte pour chaque valeur)

Un type de données VBA, c'est la forme et la taille de la boîte d'une variable — et le choisir revient à choisir ce qui peut mal tourner. Découvrez pourquoi Integer déborde à 32 767 (préférez Long), pourquoi Variant est un défaut paresseux qui cache des bugs, pourquoi l'argent réclame Currency et non Double, et comment lire les erreurs Incompatibilité de type et Dépassement de capacité.

Henry
VBA Const dans Excel — nommez vos nombres magiques (et pourquoi la valeur ne peut pas dériver)

VBA Const dans Excel — nommez vos nombres magiques (et pourquoi la valeur ne peut pas dériver)

Une constante VBA est un nom verrouillé sur une valeur à la compilation — le remède aux nombres magiques éparpillés dans votre code. Découvrez pourquoi Const empêche les valeurs de dériver, pourquoi lui affecter une valeur est une erreur de compilation (c'est la fonctionnalité, pas un défaut), pourquoi Const doit être un littéral connu à la compilation, et quand préférer Enum.

Henry
Boucle While VBA dans Excel — boucler sans figer Excel

Boucle While VBA dans Excel — boucler sans figer Excel

Une boucle While VBA est une promesse qu'elle se terminera — et c'est vous qui la tenez. Apprenez les trois parties que toute boucle While exige, pourquoi Do While vaut mieux que While...Wend, et comment ne plus jamais figer Excel. Avec exemples à copier. Testé sur Excel 365, 2021, 2019.

Henry