Word (VBA)

Word VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10全般 : Word 2019)
挿入しt画像の「図の位置(左上、右上など)を取得する方法
投稿日時: 22/06/23 11:08:52
投稿者: WinArrow
投稿者のウェブサイトに移動

画像を挿入した場合、デフォルトでは、「図」の位置:=行内、「文字列の折り返し」=行内
で設定されますが、
「文字列の折り返し」を「四角形」などの非行内に変更した時には、
shapeオブジェクトに変更されるが、
「図」の位置も変化しちると思いますが、
どこのプロパティを確認すればよいのでしょうか?

回答
投稿日時: 22/06/23 14:25:26
投稿者: Suzu

・図の形式 タブ 配置 - 位置 - その他のレイアウトオプション
または
・オブジェクト 右クリック レイアウトの詳細設定
 
レイアウト の 位置タブ 水平方向/垂直方向
 
ではないでしょうか。

回答
投稿日時: 22/06/23 14:28:54
投稿者: Suzu

「VBA で」と言うことであれば、普通に Shapeオブジェクトのプロパティで良さそうです。

回答
投稿日時: 22/06/23 14:54:18
投稿者: sk

・RelativeHorizontalPosition プロパティ
 
・LeftRelative プロパティ
 
・Left プロパティ
 
・RelativeVerticalPosition プロパティ
 
・TopRelative プロパティ
 
・Top プロパティ
 
主に関連するのはこれらのプロパティですが、
ただ単純に Left や Top の値を取得すればよい
というものでもありません。
 
・図の水平位置や垂直位置を決める際の基準は 1 つではない。
 
・右方向/下方向の距離ではなく、配置や相対位置によって
 図の位置が指定される場合がある。

投稿日時: 22/06/23 15:41:36
投稿者: WinArrow
投稿者のウェブサイトに移動

Suzu さんの引用:

「VBA で」と言うことであれば、普通に Shapeオブジェクトのプロパティで良さそうです。

Suzu さん、ありがとうございます。
あたしもそう思って、「左上」から「右上」などクリックして、
ローカルウインドウで、プロパティを眺めているのですが、
ずばりの「値」(列挙で)のものが見つかりません。
そのため、質問した次第です。
  
sk さんへ
ありがとうございます。
なかなか奥が深いというか、複雑怪奇な世界に踏み込んでしまったような気がしています。
数字として位置を取得したいということではないです。
ここ3日ほど、苦戦しています。
  
もう少し、頑張ってみます。
  

回答
投稿日時: 22/06/23 16:39:20
投稿者: sk

引用:
数字として位置を取得したいということではないです。

例えば、その文書内の 1 つめの Shape オブジェクトに対して
どのような位置設定が施されているかを簡易的に調べたいのであれば、
次のようなマクロを実行なさればよろしいでしょう。
 
-----------------------------------------------------------------------
Private Sub Test1()

    If ThisDocument.Shapes.Count = 0 Then
        Debug.Print "この文書の描画レイヤーに図形はありません。"
        Exit Sub
    End If

    PrintShapePosition ThisDocument.Shapes(1)

End Sub

'図形の位置に関する情報をイミディエイトウィンドウに出力する処理
Sub PrintShapePosition(Shape As Word.Shape)

    With Shape
        Debug.Print "図形の名前: " & .Name
        Debug.Print "水平方向の基準: " & RelativeHorizontalPositionName(.RelativeHorizontalPosition)
        If .LeftRelative = wdShapePositionRelativeNone Then
            If .Left < -999990 Then
                Debug.Print "水平方向の配置: " & ShapePositionName(.Left)
            Else
                Debug.Print "水平方向の距離: " & Format(PointsToMillimeters(.Left), "0.0 mm")
            End If
        Else
            Debug.Print "水平方向の相対位置: " & .LeftRelative & " %"
        End If

        Debug.Print "垂直方向の基準: " & RelativeVerticalPositionName(.RelativeVerticalPosition)
        If .TopRelative = wdShapePositionRelativeNone Then
            If .Top < -999990 Then
                Debug.Print "垂直方向の配置: " & ShapePositionName(.Top)
            Else
                Debug.Print "垂直方向の距離: " & Format(PointsToMillimeters(.Top), "0.0 mm")
            End If
        Else
            Debug.Print "垂直方向の相対位置: " & .TopRelative & " %"
        End If
    End With

End Sub

'WdShapePosition 列挙のメンバーを日本語表記で取得する関数
Function ShapePositionName(ShapePosition As WdShapePosition) As String

    Select Case ShapePosition
        Case wdShapeBottom                          '-999997
            ShapePositionName = "下"
        Case wdShapeCenter                          '-999995
            ShapePositionName = "中央"
        Case wdShapeInside                          '-999994
            ShapePositionName = "選択範囲の内側"
        Case wdShapeLeft                            '-999998
            ShapePositionName = "左"
        Case wdShapeOutside                         '-999993
            ShapePositionName = "選択範囲の外側"
        Case wdShapeRight                           '-999996
            ShapePositionName = "右"
        Case wdShapeTop                             '-999999
            ShapePositionName = "上"
        Case Else
            ShapePositionName = ""
    End Select

End Function

'WdRelativeHorizontalPosition 列挙のメンバーを日本語表記で取得する関数
Function RelativeHorizontalPositionName(RelativeHorizontalPosition As WdRelativeHorizontalPosition) As String

    Select Case RelativeHorizontalPosition
        Case wdRelativeHorizontalPositionCharacter              '3
            RelativeHorizontalPositionName = "文字"
        Case wdRelativeHorizontalPositionColumn                 '2
            RelativeHorizontalPositionName = "列"
        Case wdRelativeHorizontalPositionMargin                 '0
            RelativeHorizontalPositionName = "余白"
        Case wdRelativeHorizontalPositionPage                   '1
            RelativeHorizontalPositionName = "ページ"
        Case wdRelativeHorizontalPositionInnerMarginArea        '6
            RelativeHorizontalPositionName = "内側の余白領域"
        Case wdRelativeHorizontalPositionLeftMarginArea         '4
            RelativeHorizontalPositionName = "左余白"
        Case wdRelativeHorizontalPositionOuterMarginArea        '7
            RelativeHorizontalPositionName = "外側の余白領域"
        Case wdRelativeHorizontalPositionRightMarginArea        '5
            RelativeHorizontalPositionName = "右余白"
        Case Else
            RelativeHorizontalPositionName = ""
    End Select

End Function

'WdRelativeVerticalPosition 列挙のメンバーを日本語表記で取得する関数
Function RelativeVerticalPositionName(RelativeVerticalPosition As WdRelativeVerticalPosition) As String

    Select Case RelativeVerticalPosition
        Case wdRelativeVerticalPositionLine                     '3
            RelativeVerticalPositionName = "行"
        Case wdRelativeVerticalPositionMargin                   '0
            RelativeVerticalPositionName = "余白"
        Case wdRelativeVerticalPositionPage                     '1
            RelativeVerticalPositionName = "ページ"
        Case wdRelativeVerticalPositionParagraph                '2
            RelativeVerticalPositionName = "段落"
        Case wdRelativeVerticalPositionBottomMarginArea         '5
            RelativeVerticalPositionName = "下余白"
        Case wdRelativeVerticalPositionInnerMarginArea          '6
            RelativeVerticalPositionName = "内側の余白領域"
        Case wdRelativeVerticalPositionOuterMarginArea          '7
            RelativeVerticalPositionName = "外側の余白領域"
        Case wdRelativeVerticalPositionTopMarginArea            '4
            RelativeVerticalPositionName = "上余白"
        Case Else
            RelativeVerticalPositionName = ""
    End Select

End Function
-----------------------------------------------------------------------

投稿日時: 22/06/24 17:15:38
投稿者: WinArrow
投稿者のウェブサイトに移動

sk さんの引用:

次のようなマクロを実行なさればよろしいでしょう。

 
sk さん、コードを提供していただき、ありがとうございます。
 
例えば、
「位置」で表示される「配置」ダイアログ操作と、
手作業により画像の移動が異なることがよくわかりました。
ワープロなんだから、VBAも見た目で取り扱えると、軽く考えていましたが、
バックヤードともいうのか、暗闇が多いので、見た目とギャップを
意識する必要があるようです。
その割には、参考書がすくない。
 
頂いたコードの中の
LEFT、TOPを数値で取得した場合、アンカーからの距離なので、
アンカーの位置を加算するようにしました。
 
大変、参考になりました。
ありがとうございました。