如何避免Excel本地化对象名称和破坏宏?

时间:2010-01-21 05:17:25

标签: excel vba excel-vba

我的宏中有这行代码:

ActiveSheet.ChartObjects("Chart 6").Activate

当我打开文件并在非英语版本的Excel上运行宏时,此代码会中断。例如,在我测试它的日本系统上,我需要将前一行更改为:

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

(グラフ指日语中的图表)

这看起来很荒谬,因为它们是对象名称,无论如何都不是人类可读的,而是用于识别对象。有没有什么方法可以使用Excel的语言工作?

2 个答案:

答案 0 :(得分:1)

是的,这些名称用于编程目的,但这些名称对用户也是可见的,因此这是一个有趣的问题......要解决它,您可以简单地通过它的整数索引值来引用图表。

例如,而不是:

ActiveSheet.ChartObjects("Chart 6").Activate

您可以使用:

ActiveSheet.ChartObjects(6).Activate

在上面,我假设“图表6”由值6索引,但它实际上可以是任何数字。例如,如果您创建并销毁了五个以前的图表,并且此图表现在是工作表上的唯一图表,则名为“图表6”的图表实际上将被整数值1(1)索引。

因此,您必须确定图表所对应的索引编号,然后在代码中使用该索引值。

有意义吗?

更新:回复Laurent

  

至于显示的名称   用户,如果我命名图形怎么办?   “摩托艇”?

就是这样!那是你的答案!!

我打算建议你坚持不改变的名称部分。例如,“图表6”正在变为“グラフ6”。因此,在这种情况下,您应该简单地遍历所有图表,查找以名称“6”结尾的图表。但是,更好的是,简单地避免将自动翻译的单词。因此,不要命名它,“图6”,命名,是,“摩托艇”或其他任何不会自动翻译的。

使用这种方法,而不是:

ActiveSheet.ChartObjects("Chart 6").Activate

你会使用:

ActiveSheet.ChartObjects("Motorboat").Activate

同意这不理想。甚至可能有一个我不知道的图表的程序化代码名称,如果它存在,它将允许您使用您想要的任何名称。但是,如果没有这样的功能,那么使用不能翻译的图表名称似乎是最好和最简单的方法。

希望这有帮助!

麦克

答案 1 :(得分:0)

听起来你需要以引用对象本身的方式调用对象,而不是通过各自的文本名称引用对象。

在这种情况下帮助我的一件事是使用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是否需要在您的代码中执行操作。