2010-01-21 71 views
3

我有這行代碼在我的宏:如何避免Excel本地化對象名稱和破壞宏?

ActiveSheet.ChartObjects("Chart 6").Activate 

當我打開該文件,並在非英語版本的Excel運行宏,該代碼中斷。例如,日本的系統我測試了,我需要前行更改爲:

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

(グラフ意味着在日圖)

這似乎荒謬,因爲這些對象名稱,並不意味着無論如何都是人類可讀的,但用於識別物體。有什麼辦法可以使用Excel的語言嗎?

回答

1

是的,這些名稱用於編程目的,但這些名稱對用戶也是可見的,所以這是一個有趣的問題......要解決它,您可以通過它的整數索引值簡單地引用圖表。

,而不是例如:

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 

一致認爲,這是不理想的。甚至可能有一個我不知道的圖表的編程代碼名稱,如果它存在,它可以讓你使用任何你想要的名字。但是,如果沒有這樣的功能,那麼使用不會被翻譯的圖表名稱似乎是最好和最簡單的方法。

希望這會有所幫助!

邁克

+0

問題是,「圖表6」是指* that *圖表。圖表(6)指的是恰好在列表中的第六個圖表,這可能隨時間而改變,所以我不能使用它。即使我確定了正確的索引,它可能會改變,我將修改一個不同的圖表,以至於不能解決問題。 – Laurent 2010-01-24 23:32:12

+0

至於顯示給用戶的名字,如果我將圖表命名爲「Motorboat」,該怎麼辦?當Excel文件在日本PC上打開時,Excel是否必須使用某種字典將「摩托艇」翻譯成日文? Souds有點可笑。所以只是因爲我碰巧把它命名爲「Graph」,我不明白爲什麼它應該在這種特殊情況下。如果我以某種方式命名我的圖表,那麼這個名稱就與語言無關。 – Laurent 2010-01-24 23:36:24

+0

@Laurent:「即使我確定了正確的索引,它可能會改變,我會修改一個不同的圖表,所以不能解決問題。」那麼,一本工作手冊是非常有活力的。你通常可以確定它是#6,然後鎖定你的代碼。也就是說,你100%正確:它*可以*改變,所以這個建議不是通用的 - 如果你添加或刪除了圖表,你將不得不改變你的參考號。這可以通過對每個圖表編號使用全局常量而不是硬編碼來更簡單地完成。但是,一致認爲,如果進行修改,這並不理想。 – 2010-01-25 12:45:43

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是否需要在代碼中執行。

+0

這並不能真正解決識別我想要修改的特定圖形的問題。使用你的解決方案,If條件只需要識別一個圖表,以及比使用其名稱更好的方法是什麼? – Laurent 2010-01-24 23:33:46

+0

我會問這個問題,「你怎麼知道這個名字?」。如果您碰巧只知道對象的名稱,並且圖表的所有名稱都以阿拉伯數字(0-9)結尾,那麼您至少可以解析所有圖表,同時檢查圖表名稱的末尾看看它是否匹配。這不是理想的解決方案,但我不確定你會怎麼做,因爲你試圖通過名稱來引用對象。 另一方面,如果您每個工作表只有一個圖表,請使用我提供的代碼,但僅限於單個工作表。 – 2010-01-25 01:04:32

相關問題