2010-12-13 61 views
2

使用考慮包含多種形狀的工作表時,和一個片段(1):其中的形狀被選擇VBA Excel中:Selection集合環狀的索引引用不正確範圍與形狀

'(1) 
For i = 1 To Selection.Count 
    MsgBox Selection(i).Name 
Next 

不管(必須更當然比1)前兩個形狀似乎總是返回。
考慮使用ShapeRange(2)的:

'(2) 
For i = 1 To Selection.Count 
    MsgBox Selection.ShapeRange(i).Name 
Next 

此(2)實際上返回所選擇的形狀的名稱,如同(3):

'(3) 
For i = 1 To Selection.ShapeRange.Count 
    MsgBox Selection.ShapeRange(i).Name 
Next 

雖然(1)產生一個錯誤如果選擇少於1個Shape,則(3)看起來工作正常 - 除非Chart是唯一的選擇,並且返回自動化錯誤:「調用的對象與客戶端斷開連接。」

我不明白爲什麼第一次無法正常返回正確的形狀 - 我假設選擇集合比滿足眼睛更復雜,我也不明白爲什麼Selection.ShapeRange.Count選擇一個圖表時失敗,但當一個圖形處於成功狀態時失敗。

將不勝感激闡明這

回答

2

選擇可以含有除形狀之外的對象的任何光。並非選擇中的所有對象都具有名稱屬性。這可能是爲什麼你選擇多個形狀時出現錯誤 - 因爲你選擇的不僅僅是形狀。掃描所有選定形狀的正確方法是#3,作爲discussed here

「對象調用」錯誤聽起來像一個Excel錯誤。我會簡單地捕捉錯誤,處理錯誤,並尋找MS知識庫,以獲取有關如何解決錯誤和/或最小化錯誤發生的指導。

2

我有一個圖表和在片材上5個矩形和我使用Excel 2003中

如果我選擇的矩形第一,則圖中,(1)的代碼爲我工作而不會出現錯誤。它會返回我所期望的兩個形狀的名稱。

如果我先選擇圖表然後再選擇一個矩形,它將返回圖表兩次,就好像圖表同時是選定的形狀。我只能認爲這是一個錯誤。但是一個奇怪的錯誤,因爲如果我再次運行代碼而不改變選擇,它將返回與先選擇矩形相同的代碼。奇。

如果選擇少於一個形狀,則表示選擇了一個範圍。在Excel中總是選擇某些東西,所以如果你沒有選擇任何形狀,可能你的Selection對象引用了一個Range對象。您可以使用

Typename(Selection) 

確定選擇什麼。如果您選擇了一個範圍,並且該範圍沒有定義的名稱,則Name屬性將返回一個錯誤。

在Excel中選擇「圖表形狀」非常困難(不可能?)。當你自己選擇圖表時查看選擇點 - 它們是黑色方塊。現在按住控制鍵並選擇另一個形狀。圖表上的選擇點轉爲白色圓圈。當它被自己選中時,Selection對象實際上是一個ChartArea對象。 Excel「猜測」,當你選擇一個圖表時,你真的想要選擇一個圖表組件(ChartArea默認)。因爲ChartArea沒有ShapeRange屬性,所以會出現錯誤。

至於第一個假設的錯誤,下面是一些證明它的代碼。請注意,在第三部分中,我檢查了Typename,但不要對它做任何事情。這似乎顛簸EXCEL導入知道什麼是真正選擇

Sub testshapes() 

    Dim i As Long 
    Dim sType As String 

    Sheet1.Shapes.Range(Array("Rectangle 5", "Chart 6")).Select 

    For i = 1 To Selection.Count 
     Debug.Print Selection(i).Name 
    Next i 

    Sheet1.Shapes.Range(Array("Chart 6", "Rectangle 5")).Select 

    For i = 1 To Selection.Count 
     Debug.Print Selection(i).Name 
    Next i 

    Sheet1.Shapes.Range(Array("Chart 6", "Rectangle 5")).Select 

    sType = TypeName(Selection(1)) 'avoids chart selected first bug 
    For i = 1 To Selection.Count 
     Debug.Print Selection(i).Name 
    Next i 

End Sub 

在第一部分中,我得到正確的答案。在第二部分中,我得到了兩個debug.print語句的「圖6」。在第三部分中,我得到了正確的答案。

我不確定這是否完全回答你的問題,但我希望它能讓你更接近。