Toutes les variables publiques dans les macros VBA de mon bureau ne fonctionnent plus ce matin

Il s’avère que je suis un idiot (ou, au moins, désespérément inexpérimenté avec tout ce développement logiciel). Ce qui suit est ce qui m’a fait paniquer toute la journée. Je vais écrire une réponse détaillant ce que j’ai vu, les actions qui ont suivi et ce qui se passait réellement.

tl;dr : La façon dont je pensais que mon IDE fonctionnait et la façon dont il fonctionne réellement sont deux choses différentes. Il y avait, en fait, un bug dans mon code, mais à cause de ma compréhension de ce que je pensais que mon IDE me disait, j’ai cru que le problème était bien plus grave. Et je suis un idiot de ne toujours pas avoir mis en place le contrôle de version.

Ce que j’avais écrit plus tôt :

Donc, je ne suis pas vraiment un administrateur système mais je suis effectivement “le gars IT” de mon entreprise (nous sommes 12 employés).

Entre 19h GMT hier soir 25/août/2015 et 11h GMT ce matin 26/août/2015, toutes les macros VBA sur chaque ordinateur (nous utilisons Excel 2010 et Excel 2013) ont commencé à exhiber un comportement où les variables déclarées publiquement (qui devraient être disponibles pour tous les sous-programmes dans un classeur donné) ne sont disponibles que dans le module où elles ont été déclarées.

Cela rend beaucoup de nos macros inutilisables.

Mon soupçon est qu’il y a eu une mise à jour Microsoft qui a perturbé Excel mais je ne trouve aucune confirmation de cela en ligne. De plus, notre serveur de bureau à distance (qui n’est pas mis à jour automatiquement) exhibe le même comportement. Toute suggestion serait très appréciée.

Mise à jour : Il n’y a pas eu de mise à jour Windows récemment. C’est une très mauvaise nouvelle, car cela signifie que quelque chose, quelque part a (probablement de manière unique) mal tourné. La portée des variables devrait être une partie fondamentale d’un langage. Cela ne devrait pas être quelque chose qui peut changer. Et pourtant, ça a changé, sur tout le réseau, apparemment tout seul.

Ce qui s’est passé : J’ai ouvert une macro ce matin pour travailler à son extension. Je l’ai exécutée pour vérifier qu’elle fonctionnait encore. Elle a lancé une “erreur d’automatisation”.

[note annexe](J’ai toujours été habitué à voir mes variables globales dans ma fenêtre de variables locales. Dans un joli onglet déroulant sous le nom du module. Il s’avère que cela ne se produit que quand vous les déclarez publiquement dans le module que vous consultez. Je ne le savais pas, et ma nouvelle macro a toutes mes variables publiques dans leur propre module séparé)[retour]

Donc, j’ai débogué mon code, j’ai cherché pourquoi cet objet feuille de calcul lançait une erreur et j’ai vu : <No Variables> dans ma fenêtre de variables locales là où mes variables publiques étaient toujours auparavant. Naturellement, j’ai paniqué. J’ai supposé que le programme avait arrêté de référencer les variables publiques dans d’autres modules. J’ai vérifié tous les autres ordinateurs de mon bureau, même chose. J’ai frénétiquement cherché sur Internet. Rien à ce sujet. En désespoir de cause, je me suis tourné vers Stack Overflow et Server Fault et Super User et le salon de discussion de Code Review. Pas de chance.

Ensuite j’ai vraiment paniqué. J’ai volontairement appelé le support technique Microsoft.

Inutile de dire que cela s’est tellement mal passé que j’ai abandonné. Je suis parti un moment et j’ai évacué mes frustrations sur un étage vide de notre immeuble avec mon katana (sécurisé GN, donc pas de dégâts réels au bâtiment).

Ensuite je suis revenu, je suis retourné sur le chat, j’ai parlé à d’autres personnes, j’ai essayé d’autres choses et j’ai finalement découvert la chose à propos de la fenêtre de variables locales, ce qui m’a permis de trouver le vrai problème dans mon code :

Ma macro fermait un classeur avant un point dans le code où j’essayais de référencer ses feuilles de calcul. C’était tout.

Au total, j’ai gaspillé une journée de travail entière à essayer de corriger un problème qui n’existait pas.

Donc, voici une liste de choses que j’aurais pu faire / que j’aurais dû faire et qui auraient empêché cela :

Contrôle de version : Plus précisément, pouvoir rétablir le code à un point antérieur dans le temps où il était connu comme fonctionnel. Cela aurait immédiatement démontré que mon code de la veille par exemple fonctionnait encore comme prévu.

La fenêtre de surveillance : Dans l’IDE VBA, cela vous permet de spécifier des variables et de suivre leur statut tout au long de la macro. Cela m’aurait montré que ma variable existait encore, qu’elle était encore référencée, qu’elle se vidait simplement soudainement à un point du code.

Exécuter réellement les anciennes macros : Parce que je pensais que la fenêtre de variables locales affichait aussi les variables publiques, et qu’elles n’étaient pas là, tout ce que j’ai fait sur les autres ordinateurs était d’entrer dans une macro, voir qu’elles n’étaient pas là, et supposer le pire. Si j’avais réellement exécuté n’importe laquelle de mes macros même de la veille, ce problème aurait été évité.

TDD / Tests unitaires : Auraient détecté mon erreur presque au moment où je l’ai introduite, et certainement dans les minutes suivant son écriture, ce qui aurait fourni un gros indice sur ce qui avait mal tourné et aurait empêché tout cela avant même que ça commence.

Ne pas paniquer : J’ai oublié / n’ai pas essayé beaucoup de choses vraiment évidentes, dont chacune aurait prouvé que ma théorie était fausse. Au lieu de cela, parce que je pensais avoir un problème, j’ai cherché uniquement des preuves qui le confirmeraient, pas des preuves qui l’infirmeraient.

Du côté positif, au moins je suis maintenant bien plus sage que je ne l’étais ce matin.