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

質問
-
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
上記のような現象になる原因と対応方法について何か情報がありましたら、ご教示頂けますと幸いです。- 移動 立花楓Microsoft employee, Moderator 2018年8月30日 8:19 Windows クライアント開発 > Windows クライアント開発
すべての返信
-
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!)
-
早速、丁寧なご連絡を頂きまして、誠にありがとうございます。
「GetResults」メソッドのパラメータの情報不足で申し訳ございません。
・「srcstream」→100程度のセル情報を指定していますが、本現象の発生する例として、「Shape Transform」セクションの「PinY」セルが挙げられます。
・「flags」→「VisGetSetArgs.visGetStrings」を指定しています。
・「unitsnamesorcodes」→「VisUnitCodes.visNumber」を指定しています(全て)。
疑問な点は、同じプログラム(パラメータ)、同じ図面、同じシェイプを対象として動かしているにも関わらず、PC環境により異なる結果が取得されるという点です。
以上、よろしくお願いいたします。