6

Оказывается, я идиот (или, по крайней мере, безнадежно неопытный со всей этой разработкой программного обеспечения). Ниже то, о чем я весь день паниковал. Я напишу ответ с подробным описанием того, что я увидел, какие действия последовали и что на самом деле происходит.

tl; dr: Как я думал, что моя IDE работает и как она на самом деле работает, это две разные вещи. На самом деле в моем коде была ошибка, но из-за того, как я интерпретировал то, что, как мне показалось, говорила мне моя IDE, я подумал, что проблема гораздо серьезнее. И я идиот, потому что до сих пор не внедрил контроль версий.

Что я написал ранее:

Итак, я на самом деле не SysAdmin, но я фактически «ИТ-парень» для моей компании (у нас 12 сотрудников).

Где-то между 19:00 по Гринвичу вчера вечером 25 августа 2015 года и 11:00 по Гринвичу этим утром 26 августа 2015 года все макросы vba на каждом компьютере (мы запускаем Excel 2010 и Excel 2013) начали демонстрировать поведение, при котором публично объявлялись переменные (которые должны быть доступны). для всех подпрограмм в данной рабочей книге) доступны только в том модуле, в котором они были объявлены.

Это делает многие наши макросы неработоспособными.

Я подозреваю, что было обновление Microsoft, которое перепуталось с Excel, но я не могу найти никакого подтверждения этого онлайн. Кроме того, наш сервер удаленного рабочего стола (который не обновляется автоматически) демонстрирует такое же поведение. Любые предложения будут высоко ценится.

Обновление: недавно не было обновления Windows. Это действительно плохие новости, потому что это означает, что что-то где-то пошло (возможно, однозначно) неправильно. Переменная область видимости должна быть фундаментальной частью языка. Это не должно быть вещью, которая может измениться. И все же, по всей сети, он, по-видимому, сам по себе.

1 ответ1

4

Что случилось: сегодня утром я открыл макрос, чтобы поработать над его расширением. Я запустил его, чтобы проверить, все еще работает. это бросило "ошибку автоматизации".

[примечание стороны](Я всегда привык видеть мои глобальные переменные в моем окне локальных пользователей. В красивой выпадающей вкладке под названием модуля. Оказывается, это происходит только тогда, когда вы публично объявляете их в просматриваемом модуле. Я не знал этого, и мой новый макрос содержит все мои открытые переменные в отдельном модуле)[return]

Итак, я отладил свой код, посмотрел, почему этот объект рабочего листа выдает ошибку, и увидел: <No Variables> в моем окне локальных компьютеров, где всегда были мои публичные переменные. Естественно, я запаниковал. Я полагал, что программа перестала ссылаться на публичные переменные в других модулях. Я проверил все остальные компьютеры в моем офисе, тоже самое. Я лихорадочно искал в интернете. Ничего об этом. В отчаянии я обратился к переполнению стека и отказу сервера и суперпользователю и чату в Code Review. Неудачно.

Тогда я действительно запаниковал. Я охотно позвонил в техподдержку Microsoft.

Само собой разумеется, это пошло так плохо, что я сдался. Ушел на некоторое время и снял мои разочарования на пустом этаже нашего здания с моей катаной (сейф LARP, поэтому никакого реального повреждения здания).

Затем я вернулся, вернулся в чат, поговорил с еще несколькими людьми, попробовал еще кое-что и, наконец, выяснил, что такое окно местных жителей, что позволило мне найти настоящую проблему с моим кодом:

Мой макрос закрывал рабочую книгу до того момента в коде, где я пытался ссылаться на ее рабочие листы. Это было это.

В целом, я потратил впустую весь рабочий день, пытаясь решить проблему, которая не существовала.

Итак, вот список вещей, которые я мог бы сделать / должен был сделать, чтобы предотвратить это:

Контроль версий. В частности, возможность вернуть код к предыдущему моменту времени, когда было известно, что он работает. Это немедленно продемонстрировало бы, что мой код, например, позавчера, все еще работал как ожидалось.

Окно Watch: в VBA IDE это позволяет вам указывать переменные и отслеживать их состояние по всему макросу. это показало бы мне, что моя переменная все еще существует, на нее все еще ссылаются, она просто внезапно очищается в какой-то момент в коде.

На самом деле запуск старых макросов: потому что я думал, что в окне локальных систем тоже есть открытые переменные, которых там не было. все, что я делал на других компьютерах, это шагал в макрос, видел, что их там не было, и предполагал худшее. Если бы я на самом деле только что запустил какой-либо из своих макросов даже за день до этого, эта проблема была бы предотвращена.

TDD / модульное тестирование: поймал бы мою ошибку почти в тот момент, когда я ее представил, и, конечно, через несколько минут после ее написания, что дало бы намек на то, что пошло не так, и предотвратило бы все это еще до того, как оно началось.

Не паникуйте: я забыл / не пробовал много действительно очевидных вещей, любое из которых могло бы доказать мою теорию. Вместо этого, поскольку я думал, что у меня есть проблема, я искал только доказательства, которые подтвердили бы это, а не доказательства, которые опровергли бы это.

С другой стороны, по крайней мере, я теперь намного мудрее, чем был этим утром.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .