none
PC環境によりVisio図形のシェイプシートから取得される結果が異なる RRS feed

  • 質問

  • VBで作成したVisioのCOMアドインで、図形のシェイプシートのセルから値を取得する処理を行っています。
    シェイプシートのセルから値を取得する方法は、「Shape」オブジェクトの「GetResults」メソッドを使用しています。

    例)
    Shape.GetResults(SRCStream(), Flags, UnitsNamesOrCodes(), resultArray())

    最終パラメータの「resultArray()」が出力パラメーターで、問い合わせたセルの値を受け取る配列です。
    この際、同じVisioファイルの同じ図形を対象としているにも関わらず、PC環境により異なる結果になる場合があります。

    例)シェイプシートの「Shape Transform」セクションの「PinY」セルを取得。

    ■PC環境1の結果 ※小数点以下4桁まで取得され、単位はmm

    22.8222 mm

    ■PC環境2の結果 ※整数で取得され(小数点以下は四捨五入される)、単位はMM

    23MM


    上記のような現象になる原因と対応方法について何か情報がありましたら、ご教示頂けますと幸いです。
    2018年8月30日 5:55

すべての返信

  • Okidate さん、こんにちは。フォーラム オペレーターの立花です。
    MSDN フォーラムへご投稿くださいましてありがとうございます。

    内容を拝見すると Visual Basic for Application(VBA) フォーラムの方が、
    情報が集まりやすいように思えましたので移動いたしますね。

    何か問題がありましたらご返信ください。


    参考になった投稿には回答としてマークの設定にご協力ください
    MSDN/TechNet Community Support 立花楓

    2018年8月30日 8:22
    モデレータ
  • srcstream,flags,unitsnamesorcodesに何入れてるか提示されてないので、flagsにvisGetFloatsとvisGetRoundedIntsを入れ間違えてるんじゃないのとしか

    Sub Test()
        Dim a As Visio.Application
        Set a = Application
        Dim doc As Visio.Document
        Set doc = a.ActiveDocument
        Dim p As Visio.Page
        Set p = doc.Pages.Item(1)
        
        Dim shapeIndex As Long
        For shapeIndex = 1 To p.Shapes.count
            Dim shp As Visio.Shape
            Set shp = p.Shapes.Item(shapeIndex)
            
            Const count As Integer = 4
            
            Dim srcstreams() As Integer
            ReDim srcstreams(0 To count * 4 - 1)
            
            Dim units() As Variant
            ReDim units(0 To count - 1)
            
            Dim results() As Variant
            ReDim results(0 To count - 1)
            
            For i = 0 To count - 1
                srcstreams(0 + i * 4) = shp.ID
                srcstreams(1 + i * 4) = VisSectionIndices.visSectionObject
                srcstreams(2 + i * 4) = VisRowIndices.visRowXFormOut
                
                If (i Mod 2) = 0 Then
                    srcstreams(3 + i * 4) = VisCellIndices.visXFormPinX
                Else
                    srcstreams(3 + i * 4) = VisCellIndices.visXFormPinY
                End If
                
                If (((i \ 2) Mod 2) = 0) Then
                    units(i) = "mm" 'VisUnitCodes.visMillimeters
                Else
                    units(i) = "in" 'VisUnitCodes.visInches
                End If
            Next
            
            Dim flag As Integer
            flag = VisGetSetArgs.visGetFloats
            
            Call p.GetResults(srcstreams, flag, units, results)
            Debug.Print shapeIndex
            Debug.Print "float X=" & results(0) & "[mm], Y=" & results(1) & "[mm]", "X=" & results(2) & "[in], Y=" & results(3) & "[in]"
            
            flag = VisGetSetArgs.visGetRoundedInts
            
            Call p.GetResults(srcstreams, flag, units, results)
            Debug.Print "round X=" & results(0) & "[mm], Y=" & results(1) & "[mm]", "X=" & results(2) & "[in], Y=" & results(3) & "[in]"
            
            Debug.Print "*****************"
        Next
    End Sub

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2018年8月30日 17:00
  • 早速、丁寧なご連絡を頂きまして、誠にありがとうございます。
    「GetResults」メソッドのパラメータの情報不足で申し訳ございません。

    ・「srcstream」→100程度のセル情報を指定していますが、本現象の発生する例として、「Shape Transform」セクションの「PinY」セルが挙げられます。
    ・「flags」→「VisGetSetArgs.visGetStrings」を指定しています。
    ・「unitsnamesorcodes」→「VisUnitCodes.visNumber」を指定しています(全て)。

    疑問な点は、同じプログラム(パラメータ)、同じ図面、同じシェイプを対象として動かしているにも関わらず、PC環境により異なる結果が取得されるという点です。

    以上、よろしくお願いいたします。
    2018年8月31日 2:59