2017-04-14 2 views

Antwort

2

Wenn Bilder in Visio importiert werden, werden sie in eine Standardform verpackt (mit einer Type-Eigenschaft von visTypeForeignObject).

Von da an sprechen Sie nur mit Zellen im ShapeSheet. (Siehe diesen Beitrag für weitere Details auf dem ShapeSheet http://visualsignals.typepad.co.uk/vislog/2007/10/just-for-starte.html)

So können Sie mit dem Makrorecorder auf Visio für diese Art von Sache starten.

Sub Macro1() 

    'Enable diagram services 
    Dim DiagramServices As Integer 
    DiagramServices = ActiveDocument.DiagramServicesEnabled 
    ActiveDocument.DiagramServicesEnabled = visServiceVersion140 + visServiceVersion150 

    Dim UndoScopeID2 As Long 
    UndoScopeID2 = Application.BeginUndoScope("Auto Size Page") 
    Application.ActiveWindow.Page.AutoSize = False 
    Application.EndUndoScope UndoScopeID2, True 

    Dim UndoScopeID3 As Long 
    UndoScopeID3 = Application.BeginUndoScope("Insert") 
    Application.ActiveWindow.Page.Import "C:\SomeImage.jpg" 
    Application.EndUndoScope UndoScopeID3, True 

    ActiveWindow.DeselectAll 
    ActiveWindow.Select Application.ActiveWindow.Page.Shapes.ItemFromID(1), visSelect 
    Application.ActiveWindow.Selection.Move 2.129396, -0.904364 

    Dim UndoScopeID4 As Long 
    UndoScopeID4 = Application.BeginUndoScope("Size Object") 
    Application.ActiveWindow.Page.Shapes.ItemFromID(1).CellsSRC(visSectionObject, visRowXFormOut, visXFormPinX).FormulaU = "46.261665987369 mm" 
    Application.ActiveWindow.Page.Shapes.ItemFromID(1).CellsSRC(visSectionObject, visRowXFormOut, visXFormPinY).FormulaU = "212.02916285428 mm" 
    Application.ActiveWindow.Page.Shapes.ItemFromID(1).CellsSRC(visSectionObject, visRowXFormOut, visXFormWidth).FormulaU = "103.47666530807 mm" 
    Application.EndUndoScope UndoScopeID4, True 

    Dim UndoScopeID5 As Long 
    UndoScopeID5 = Application.BeginUndoScope("Size Object") 
    Application.ActiveWindow.Page.Shapes.ItemFromID(1).CellsSRC(visSectionObject, visRowXFormOut, visXFormPinX).FormulaU = "46.261665987369 mm" 
    Application.ActiveWindow.Page.Shapes.ItemFromID(1).CellsSRC(visSectionObject, visRowXFormOut, visXFormPinY).FormulaU = "185.77916321819 mm" 
    Application.ActiveWindow.Page.Shapes.ItemFromID(1).CellsSRC(visSectionObject, visRowXFormOut, visXFormHeight).FormulaU = "73.441667394486 mm" 
    Application.EndUndoScope UndoScopeID5, True 

    'Restore diagram services 
    ActiveDocument.DiagramServicesEnabled = DiagramServices 

End Sub 

Die Makroaufzeichnung in Bezug auf die aktuelle Auswahl arbeitet, aber Sie nicht brauchen: ein Bild auf die Seite ziehen, wird Ausgabe etwas wie dieses produzieren. Außerdem verwendet es die SRC-Syntax (Section, Row, Column) anstelle der einfacheren Syntax für den Zellennamen. So eine Übersetzung der oben könnte wie folgt sein:

Sub TestAddImage() 
    Call DropImage(ActivePage, "C:\SomeImage.jpg") 
End Sub 

Private Sub DropImage(ByRef vPag As Visio.Page, imageFile As String) 

If Not vPag Is Nothing Then 
    Dim newShp As Visio.Shape 
    Set shpNew = vPag.Import(imageFile) 
    'Set position 
    shpNew.CellsU("PinX").FormulaU = "75mm" 
    shpNew.CellsU("PinY").FormulaU = "175mm" 
    'Set size 
    shpNew.CellsU("Width").FormulaU = "100mm" 
    shpNew.CellsU("Height").FormulaU = "80mm" 
End If 

End Sub 

AC# Version davon würde wie folgt aussehen:

void Main() 
{ 
    var vApp = MyExtensions.GetRunningVisio(); 
    DropImage(vApp.ActivePage, @"C:\SomeImage.jpg"); 
} 

private void DropImage(Visio.Page vPag, string imageFile) 
{ 
    if (vPag != null) 
    { 
     var shpNew = vPag.Import(imageFile); 
     //Set position 
     shpNew.CellsU["PinX"].FormulaU = "75mm"; 
     shpNew.CellsU["PinY"].FormulaU = "175mm"; 
     //Set size 
     shpNew.CellsU["Width"].FormulaU = "100mm"; 
     shpNew.CellsU["Height"].FormulaU = "80mm"; 
    } 
} 

Beachten Sie, dass GetRunningVisio ist meine Erweiterungsmethode für die Verwendung mit LinqPad:

http://visualsignals.typepad.co.uk/vislog/2015/12/getting-started-with-c-in-linqpad-with-visio.html

... aber es liegt an Ihnen, wie Sie das Anwendungsobjekt erhalten.

+0

John, das ist großartig, es hat perfekt funktioniert. Aber ist etwas eingebaut, um die Form am Ende der Seite wie shpNew.cellsu.end zu platzieren? Oder muss ich ein Makro ausführen, um die Koordinaten zu finden, die von Ihnen in "sub Macro1" angezeigt werden? – Puneeth

+1

Dafür müssten Sie den PinX/Y-Zellen eine Formel und keinen konstanten Wert hinzufügen. Für PinX: '" ThePage! PageWidth- (Width-LocPinX) "' und für PinY '" ThePage! PageHeight- (Height-LocPinY) "'. Dies würde die Form der linken oberen Ecke der Seite festlegen. – JohnGoldsmith

+0

Sorry, meine Frage war, am Ende der Seite zu platzieren, ich glaube, Formel mit + ändern würde die Form am unteren Rand der Seite, nicht wahr? – Puneeth