在群組中建立一或多個新的 Shape 物件。 它會傳回其所產生之 Shape 物件識別碼的陣列。
語法
expression。
DropMany( _ObjectsToInstance()_ , _xyArray()_ , _IDArray()_ )
expression 一個用於表示 Shape 物件的變數。
參數
| 名稱 | 必要/選用 | 資料類型 | 描述 |
|---|---|---|---|
| ObjectsToInstance () | 必要 | Variant | 會識別要產生圖形的主圖形或其他物件。 |
| xyArray () | 必要 | 雙精確度 | 交替的 x 及 y 值的陣列,這些值會指定新圖形的位置。 |
| IDArray () | 必要 | 整數 | 輸出參數。 會傳回所建立圖形之識別碼的陣列。 |
傳回值
整數
註解
使用 DropMany 方法就像使用 Page、Master 或 Shape 物件的 Drop 方法,但 DropMany 方法可以用來一次建立很多新的 Shape 物件,而不是每個方法呼叫建立一個物件。 DropMany 方法會在頁面、主圖形或它所套用的群組圖形 (下列討論中將此圖形稱為「目標物件」) 中建立新的 Shape 物件。
透過傳遞 Master 物件或主圖形的索引或主圖形的名稱給 DropMany 方法,便能識別要放下哪一個主圖形。 當您傳遞物件時,DropMany 並不會限制只從文件的文件樣板將主圖形放到它要放置的目標上。 該物件可以是取自另一個文件或另一個物件類型的主圖形。
傳遞整數 (主圖形索引) 或字串 (主圖形名稱) 給 DropMany 比傳遞物件還快,但是整數或字串只會識別文件的文件樣板中要放下主圖形之位置上的主圖形。 因此,您的程式可能會先將在此討論的主圖形放到文件樣板中 (如果該樣板中還沒有主圖形的話)。
ObjectsToInstance () 應該是 n>= 1 個變體的一維陣列。 其項目會識別您要從中建立新 Shape 物件的物件。 項目通常會參照 Microsoft Visio 應用程式 主 物件。 它也可能參照 Visio 應用程式 的圖形 物件、 選取項目 物件,或甚至是來自其他應用程式的物件。 應用程式並不在乎 ObjectsToInstance 項目的陣列下限和上限為何。 將它們分別稱為 vlb 和 vub 。
如果 ObjectsToInstance (i) 是 OLE 物件的參考,該物件在 Visual Basic for Applications 中提供 IDataObject 介面 (Microsoft選取範圍、圖形、主圖形、輔助線或 OLE 物件) 的參考,則它所參考的物件會實例化。 這基本上等同於呼叫 Drop (ObjectsToInstance (i) ,x,y) 。
如果 ObjectsToInstance (i) 是整數 j ,則會建立目標物件文件之文件樣板中 Master 物件的執行個體,其從 1 開始的索引是 j 。 不會觸發新圖形 [事件] 區段中的 EventDrop 儲存格。 如果您想要觸發 EventDrop 儲存格,請改用 Drop 方法。
如果 ObjectsToInstance (i) 是字串 s (或字串 s ) 的參照,則會在目標物件文件的文件樣板中建立具有名稱 s的主要物件實例;s 可以等於主物件的 UniqueID 或 Name 屬性。 不會觸發新圖形 [事件] 區段中的 EventDrop 儲存格。 如果您想要觸發 EventDrop 儲存格,請改用 Drop 方法。
針對 vlb<i<= vub ,如果 ObjectsToInstance (i) 為空 (Nothing 或未初始化Microsoft Visual Basic) ,則項目 i 會導致 ObjectsToInstance (j) 再次實例化,其中 j 是最大的值 <i ,因此 ObjectsToInstance (j) 不是空的。 如果您想要對相同項目產生 n 個實例,只需要提供 ObjectsToInstance(vlb)。
xyArray () 引數應該是 2 m 雙精度數的一維數組,下限為 xylb 和上限 xyub ,其中 m>= n。 陣列中的值會告知 DropMany 方法要將它產生的 Shape 物件放置在什麼位置。 ObjectsToInstance ( vlb + ( i - 1) ) 會在 ( xy [ ( i - 1) 2 + xylb ] 處捨棄, xy [ (i - 1) 2 + xylb + 1]) 因為 1 <= i<= n。
請注意, 允許 m>n 。 對於 n<i<= m ,第 i 個實例化的事物與第 n 個實例化的事物相同。 因此,若要使 m>= 1 實例成為相同項目,您可以傳遞一個包含一個項目和一個 m 項目 xyArray () 數組的 ObjectsToInstance () 數組。
如果實例化的實體是一個主圖形,新 Shape 物件的針會定位在指定的 xy 上。 否則,會將 Shape 物件的中心定位在指定的 xy 上。
DropMany 方法傳回的值是 DropMany 方法成功處理之 xyArray () 中的 xy 項目數目。 如果所有項目均已順利處理,則會傳回 m 。 如果在錯誤發生前成功處理某些項目,則不會刪除產生的 Shape 物件,這會導致例外狀況,但仍傳回正值。
假設所有 m個 xy 項目都已正確處理,DropMany 方法產生的新 Shape 物件數目通常等於 m。 在少數情況下 (例如,如果 選取 物件實例化) ,可能會產生超過 m 個Shape 物件。 呼叫端可以比較執行 DropMany 方法之前和之後目標物件中的圖形數目,藉此判斷產生的 Shape 物件數目。 呼叫端可以判斷新的 Shape 物件是目標物件的 Shapes 集合中索引最高的物件。
如果 DropMany 方法傳回 0 (0) ,IDArray () 會傳回 Null (Nothing) 。 否則,它會傳回從 0 索引到 m - 1 的 m 個整數的一維陣列。 IDArray () 是由 DropMany 方法配置的 out 參數,擁有權會傳遞給呼叫 DropMany 方法的程式。 呼叫端最終應該會在傳回的陣列上執行 SafeArrayDestroy 程序。 (Microsoft Visual Basic 和 Visual Basic for Applications 會為您處理此動作。)
如果 IDArray () 傳回非 null (Not Nothing) ,則 IDArray ( i - 1) , 1 <= i<= intReturned ,傳回第 i 個 xyArray 項目所產生的 Shape 物件識別碼,前提是第 i 個 xyArray () 項目只產生一個 Shape 物件。 如果第 i 個 xyArray () 項目產生多個 Shape 物件,則會在項目中傳回 -1。 所有項目 i , intReturned<= i<m , return -1。
注意事項
從 Microsoft Visio 2000 開始,您可以使用本機和通用名稱來參照 Visio 圖形、母片、文件、頁面、列、附加元件、儲存格、超連結、樣式、字型、主片快速鍵、UI 物件和圖層。 例如,當使用者命名圖形時,使用者是在指定本機名稱。 從 Microsoft Office Visio 2003 開始,ShapeSheet 試算表僅顯示儲存格公式和值中的通用名稱。 (在舊版中,通用名稱在使用者介面中是看不見的。)
身為開發人員,如果您不希望每次將方案本土化時就要變更名稱,可以在程式中使用通用名稱。 使用本機名稱來識別圖形時,使用 DropMany 方法可放下一個以上的圖形。 若使用通用名稱來識別圖形,請使用 DropManyU 方法放下一個以上的圖形。
範例
下列範例顯示如何使用 DropMany 方法。 它會將巨集的 Document 物件的文件樣板中每個主圖形的一個實例放在巨集的 Document 物件的第 1 頁上。 執行此巨集之前,請確定文件樣板中至少有一個主圖形。
Public Sub DropMany_Example()
On Error GoTo HandleError
Dim vsoMasters As Visio.Masters
Dim intMasterCount As Integer
Set vsoMasters = ThisDocument.Masters
intMasterCount = vsoMasters.Count
ReDim varObjectsToInstance(1 To intMasterCount) As Variant
ReDim adblXYArray(1 To intMasterCount * 2) As Double
Dim intCounter As Integer
For intCounter = 1 To intMasterCount
'Pass name of object to drop to DropMany.
varObjectsToInstance(intCounter) = vsoMasters.Item(intCounter).Name
'Set x components of where to drop to 2,4,6,2,4,6,2,4,6,...
adblXYArray (intCounter * 2 - 1) = (((intCounter - 1) Mod 3) + 1) * 2
'Set y components to 2,2,2,4,4,4,6,6,6,...
adblXYArray (intCounter * 2) = Int((intCounter + 2) / 3) * 2
Next intCounter
Dim aintIDArray() As Integer
Dim intProcessed As Integer
intProcessed = ThisDocument.Pages(1).DropMany(varObjectsToInstance, _
adblXYArray, aintIDArray)
Debug.Print intProcessed
For intCounter = LBound(aintIDArray) To UBound(aintIDArray)
Debug.Print intCounter; aintIDArray(intCounter)
Next intCounter
Exit Sub
HandleError:
MsgBox "Error"
Exit Sub
End Sub
支援和意見反應
有關於 Office VBA 或這份文件的問題或意見反應嗎? 如需取得支援服務並提供意見反應的相關指導,請參閱 Office VBA 支援與意見反應。