7

Visio 2010 COM Interopsを使用して、プログラムでタイムラインとマーカーを作成しようとしています。私のコードは、Chris Castilloの2部構成のブログ投稿(第1部、第2部)に基づいています。これは、これを行う方法について私が見つけた唯一の半完全な例です。しかし、彼のブログ(2004年から)は正しく機能していないようです。マイルストーンは実際にはタイムラインに関連付けられておらず、日付を更新しても適切な場所に移動できません。

提案や修正はありますか?

ここに画像の説明を入力してください

Imports Microsoft.Office.Interop.Visio
Imports System.Diagnostics.CodeAnalysis
Imports System.Runtime.InteropServices

..。

Dim VisioApp As New Application

Dim myDoc As Document = VisioApp.Documents.Add("")
Dim myPage As Page = myDoc.Pages.Item(1)

Dim TimelineStencils As Document =
    VisioApp.Documents.Add("Timeline Shapes.vss")

Dim theTimeline As Shape
Dim theMilestone As Shape

VisioApp.AlertResponse = 1

theTimeline = myPage.Drop(
    TimelineStencils.Masters.ItemU("Block timeline"), 5.610236, 5.511811)

theTimeline.CellsU("User.visBeginDate").FormulaU = _
        VisioApp.ConvertResult(
            "1/1/2004", VisUnitCodes.visDate, VisUnitCodes.visInches)

theTimeline.CellsU("User.visEndDate").FormulaU = _
    VisioApp.ConvertResult(
        "12/31/2004", VisUnitCodes.visDate, VisUnitCodes.visInches)

VisioApp.Addons("ts").Run("/cmd=3")

theMilestone = myPage.Drop( _
    TimelineStencils.Masters.ItemU("Line milestone"), _
    5.610236, 5.511811)

theMilestone.CellsU("User.visMilestoneDate").FormulaU = _
    VisioApp.ConvertResult(
        "7/1/2004", VisUnitCodes.visDate, VisUnitCodes.visInches)

VisioApp.AlertResponse = 0
4

2 に答える 2

1

そこで、@ JohnGoldsmithが関連する質問に対する他の回答のいくつかでリンクしているVisioオブジェクトをプログラムで追加するという、はるかに優れたウォークスルーを見つけ、ステンシルとページを作成するためのより良い方法を見つけました。

Dim VisioApp As New Application

Dim myDoc As Document = VisioApp.Documents.Add("Timeline.vst")
Dim myPage As Page = myDoc.Pages.Item(1)

Dim TimelineStencilName As String = "TIMELN_M.VSS"
Dim TimelineStencilDoc As Document

For Each Doc As Document In VisioApp.Documents
    If Doc.Name = TimelineStencilName Then
        TimelineStencilDoc = Doc
        Exit For
    End If
Next

Dim TimelineMaster As Master =
    TimelineStencilDoc.Masters.ItemU("Block timeline")

Dim MilestoneMaster As Master =
    TimelineStencilDoc.Masters.ItemU("Line milestone")

Dim theTimeline As Shape
Dim theMilestone As Shape

theTimeline = myPage.Drop(TimelineMaster, 5.610236, 5.511811)

theTimeline.CellsU("User.visBeginDate").FormulaU = _
    VisioApp.ConvertResult(
            "1/1/2004", VisUnitCodes.visDate, VisUnitCodes.visInches)

theTimeline.CellsU("User.visEndDate").FormulaU = _
    VisioApp.ConvertResult(
        "12/31/2004", VisUnitCodes.visDate, VisUnitCodes.visInches)

theMilestone = myPage.Drop( _
    MilestoneMaster, _
    5.610236, 5.511811)

theMilestone.CellsU("User.visMilestoneDate").FormulaU = _
    VisioApp.ConvertResult(
        "10/1/2004", VisUnitCodes.visDate, VisUnitCodes.visInches)
于 2012-09-27T20:18:02.277 に答える
1

組み込みのステンシル( "TIMELN_M.VSS")とVisio 2010のテンプレートに対してChrisのコードを実行すると、完全に機能することがわかりました。ただし、空白のドキュメントを含む組み込みのステンシルに対して実行すると、[説明]および[日付の形状]データフィールドは表示されません。これら2つのフィールドの表示は、アドオンによって追加されるか、マスターの1つが削除されたときに追加されるドキュメントシェイプシートのユーザーセル( "User.visTLShowProps")によって異なります。

標準テンプレートには、DocumentCreatedとDocumentOpenedのアドオンの機能を呼び出す2つの永続的なイベントが含まれています。また、これらは、上記の値のオンとオフを切り替えるために使用される他のユーザーセルをいくつか追加するか、テンプレートに存在します。 。いずれの場合も、元のテンプレートを使用していない場合、これらはドキュメントシェイプシートに追加されません。

これは、値を自分で切り替える必要があることを意味します。例(簡単なVBAの例):

Private Sub SetTlShowProps(ByRef vDoc As Visio.Document)
If (Not vDoc Is Nothing) Then
    Dim docShp As Visio.Shape
    Set docShp = vDoc.DocumentSheet
    If (docShp.CellExistsU("User.visTLShowProps", 0)) Then
        docShp.CellsU("User.visTLShowProps").FormulaU = 1
    End If
End If
End Sub

または、もちろん、これらの「プッシュ」セルをShapeSheetの独自のドキュメントテンプレートに追加することもできます。

User.visTLShowPropsOn = SETF(GetRef(User.visTLShowProps),1)

User.visTLShowPropsOff = SETF(GetRef(User.visTLShowProps),0)

これで問題が解決しない場合の最後のポイントは、別のステンシルまたは派生ステンシル( "Timeline Shapes.vss")を使用していますか?

于 2012-09-27T09:48:40.437 に答える