在群組中建立一個或多個新的 Shape 物件。 它會回傳一個由 Shape 物件 ID 組成的陣列。
語法
expression。
DropMany( _ObjectsToInstance()_ , _xyArray()_ , _IDArray()_ )
expression 一個用於表示 Shape 物件的變數。
參數
| 名稱 | 必要/選用 | 資料類型 | 描述 |
|---|---|---|---|
| ObjectsToInstance () | 必要 | Variant | 會識別要產生圖形的主圖形或其他物件。 |
| xyArray () | 必要 | 雙精確度 | 交替的 x 及 y 值的陣列,這些值會指定新圖形的位置。 |
| () | 必要 | 整數 | 輸出參數。 會傳回所建立圖形之識別碼的陣列。 |
傳回值
整數
註解
使用 DropMany 方法就像使用 Page、Master 或 Shape 物件的 Drop 方法,但 DropMany 方法可以用來一次建立很多新的 Shape 物件,而不是每個方法呼叫建立一個物件。 DropMany 方法會在頁面、主圖形或它所套用的群組圖形 (下列討論中將此圖形稱為「目標物件」) 中建立新的 Shape 物件。
透過傳遞 Master 物件或主圖形的索引或主圖形的名稱給 DropMany 方法,便能識別要放下哪一個主圖形。 當您傳遞物件時,DropMany 並不會限制只從文件的文件樣板將主圖形放到它要放置的目標上。 該物件可以是取自另一個文件或另一個物件類型的主圖形。
傳遞整數 (主圖形索引) 或字串 (主圖形名稱) 給 DropMany 比傳遞物件還快,但是整數或字串只會識別文件的文件樣板中要放下主圖形之位置上的主圖形。 因此,您的程式可能會先將在此討論的主圖形放到文件樣板中 (如果該樣板中還沒有主圖形的話)。
ObjectsToInstance () 應該是一個包含 n>= 1 變體的一維陣列。 它的條目會標示你想從中製作新 Shape 物件的物件。 條目通常指的是 Microsoft Visio 應用程式 的主物件 。 它也可能指 Visio 應用程式的 Shape 物件、 Selection 物件,甚至是來自其他應用程式的物件。 應用程式不在意 ObjectsToInstance 條目的陣列上下界。 分別稱它們為 vlb 和 vub 。
如果 ObjectsToInstance (i) 是指向一個提供 IDataObject 介面Microsoft (Visual Basic for Applications 中的物件,該物件是指向選取、形狀、主控、導引或 OLE 物件) ,那麼它所參考的物件就是實例化的。 這基本上等同於呼叫 Drop (ObjectsToInstance (i) ,x,y) 。
若 ObjectsToInstance (i) 為整數 j,則在目標物件文件的模板中,建立一個以 1 為基礎的索引為 j 的主物件實例。 新形狀事件區塊中的 EventDrop 儲存格不會被觸發。 如果你想觸發 EventDrop 儲存格,改用 Drop 方法。
如果 ObjectsToInstance (i) 是字串 s (或是對字串 s ) 的參考,則會在目標物件文件的模板中建立一個名為 s 的主物件實例;s 可以等於主物件的 UniqueID 或 Name 屬性。 新形狀事件區塊中的 EventDrop 儲存格不會被觸發。 如果你想觸發 EventDrop 儲存格,改用 Drop 方法。
對於 vlb<i<= vub ,如果 ObjectsToInstance (i) 在 Visual Basic) 中空 (Nothing 或未初始Microsoft化,項目 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 個相同事物的實例,你可以傳遞一個 ObjectsToInstance () 陣列,一個 m () 個 xyArray 條目。
如果實例化的實體是一個主圖形,新 Shape 物件的針會定位在指定的 xy 上。 否則,會將 Shape 物件的中心定位在指定的 xy 上。
DropMany 方法回傳的值是 xyArray () 中成功處理的 xy 條目數量。 若所有條目均成功處理,則返回 m 。 若部分條目在錯誤發生前成功處理,產生的 Shape 物件不會被刪除,這會產生例外,但仍回傳正值。
假設所有 m 個 xy 條目都被正確處理,DropMany 方法產生的新 Shape 物件數量通常等於 m。 在罕見情況下 (例如,如果一個 Selection 物件被實例化) ,可能會產生超過 m個 Shape 物件。 呼叫者可以透過比較目標物件中執行 DropMany 方法前後的形狀數量來判斷產生的 Shape 物件數量。 呼叫者可以斷言新的 Shape 物件是目標物件 Shapes 集合中索引最高的物件。
如果 DropMany 方法回傳 0 (0 ) ,IDArray () 回傳 Null (Nothing) 。 否則,它會回傳一個由 m 個整數組成的一維陣列,索引從 0 到 m - 1。 IDArray () 是一個由 DropMany 方法分配的輸出參數,所有權會傳給呼叫 DropMany 方法的程式。 呼叫者最終會對回傳陣列執行 SafeArrayDestroy 程序。 (Microsoft Visual Basic 和 Visual Basic for Applications 會幫你處理這些問題。)
如果 IDArray () 回傳非空 (不是 Nothing) ,IDArray ( i - 1) , 1 <= i<= intReturnd,則會回傳由第 i 個 xyArray 條目產生的 Shape 物件的 ID,前提是第 i 個 xyArray () 條目恰好產生一個 Shape 物件。 如果第 i 個 xyArray () 條目產生多個 Shape 物件,條目中會回傳 -1。 所有條目 i , intReturned<= i<m , 返回 -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 支援與意見反應。