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

我在我的macros中有这行代码:

ActiveSheet.ChartObjects("Chart 6").Activate 

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

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

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

这似乎是荒谬的,因为这些是对象名称,不是说人类可读,而是用来识别对象。 有什么办法可以使用Excel的语言吗?

是的,这些名称是用于编程的目的,但这些名称也是用户可见的,所以这是一个有趣的问题…要解决它,你可以简单地引用图表的整数索引值。

例如,而不是:

 ActiveSheet.ChartObjects("Chart 6").Activate 

你可以使用:

 ActiveSheet.ChartObjects(6).Activate 

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

所以你将不得不找出你的图表对应的索引号,然后在你的代码中使用该索引值。

合理?

更新:回复Laurent

至于显示给用户的名字,如果我将图表命名为“Motorboat”,该怎么办?

而已! 这是你的答案!

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

使用这种方法,而不是:

 ActiveSheet.ChartObjects("Chart 6").Activate 

你会使用:

 ActiveSheet.ChartObjects("Motorboat").Activate 

一致认为这是不理想的。 甚至可能有一个我不知道的图表的编程代码名称,如果它存在,它可以让你使用任何你想要的名字。 但是,如果没有这样的function,那么使用不会被翻译的图表名称似乎是最好和最简单的方法。

希望这可以帮助!

麦克风

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

在这种情况下帮助我的一件事就是使用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逻辑来testing特定ChartObject需要在代码中执行操作。