Как избежать Excel локализации имен объектов и взлома макросов? - PullRequest
3 голосов
/ 21 января 2010

У меня есть строка кода в моем макросе:

ActiveSheet.ChartObjects("Chart 6").Activate

Когда я открываю файл и запускаю макрос в неанглийской версии Excel, этот код нарушается. Например, в японской системе, на которой я ее тестировал, мне нужно изменить предыдущую строку на:

ActiveSheet.ChartObjects("グラフ 6").Activate

(グ ラ フ означает график на японском языке)

Это кажется нелепым, поскольку это имена объектов, которые в любом случае не предназначены для чтения человеком, но используются для идентификации объектов. Есть ли способ работать на любом языке Excel?

Ответы [ 2 ]

1 голос
/ 21 января 2010

Да, эти имена используются в целях программирования, но эти имена также видны пользователю, поэтому это интересная проблема ... Чтобы решить ее, вы можете просто обратиться к диаграмме по ее целочисленному значению индекса.

Например, вместо:

ActiveSheet.ChartObjects("Chart 6").Activate

Вы можете использовать:

ActiveSheet.ChartObjects(6).Activate

Выше я предполагал, что «Диаграмма 6» индексируется значением 6, но в действительности это может быть любое число. Например, если вы создали и уничтожили пять предыдущих диаграмм, и теперь эта диаграмма является единственной диаграммой на листе, диаграмма с именем «Диаграмма 6» будет фактически проиндексирована целым значением 1 (1).

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

Имеет смысл?

Обновление: ответ Лорану

Что касается имени, отображаемого на пользователь, что если я назвал график "Моторная"?

Вот и все! Это твой ответ !!

Я собирался предложить вам придерживаться той части имени, которая не меняется. Например, «Диаграмма 6» изменяется на «フ ラ フ 6». Таким образом, в этом случае вы должны просто просмотреть все графики в поисках той, которая заканчивается именем «6». Но, что еще лучше, стоит просто избегать слов, которые будут автоматически переведены. Поэтому вместо того, чтобы называть его «Диаграмма 6», назовите его, да, «Моторная лодка» или что-то еще, что не будет автоматически переведено.

Используя этот подход, вместо:

ActiveSheet.ChartObjects("Chart 6").Activate

Вы бы использовали:

ActiveSheet.ChartObjects("Motorboat").Activate

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

Надеюсь, это поможет!

Mike

0 голосов
/ 21 января 2010

Похоже, вам нужно вызывать объекты таким образом, чтобы вы ссылались на сами объекты , а не на ссылки на объекты через их соответствующие текстовые имена.

Одна вещь, которая помогла мне в подобных случаях, это использовать For Each для перебора коллекции объектов. Такие как:

Sub DoSomethingWillAllChartObjects()

Dim cs As ChartObject
Dim ws As Worksheet
Dim wb As Workbook

Set wb = ThisWorkbook

For Each ws In wb.Worksheets
    For Each cs In ws.ChartObjects
        Debug.Print cs.Name, cs.Index

    Next cs
Next ws

End Sub

Приведенный выше код перебирает все диаграммы во всех рабочих листах данной рабочей книги и позволяет вам что-то делать с этими объектами. Вам не нужно знать имя диаграммы, чтобы что-то делать с этим кодом.

Возможно, вы могли бы использовать For Each для перебора всех элементов, а затем добавить логику If ... Then, чтобы проверить, требует ли конкретный ChartObject действий в вашем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...