Word (VBA)

Word VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(指定なし : 指定なし)
行間が大きい時のカーソル位置の正確な取得
投稿日時: 21/10/19 10:51:41
投稿者: rodeo540
メールを送信

行が1行で通常の行間の場合、
「Selection.Information(wdActiveEndSectionNumber)」で取得した位置と実際の位置はずれませんが、
行間にある程度大きなシェイプ、図等を入れている場合(行間が大きい場合)、
その行で「Selection.Information(wdActiveEndSectionNumber)」から位置を取得すると
行の上端(シェイプ、図の上側)の位置となります。(当たり前ですが)
カーソルが点滅している位置を正確に取得するプロパティはどのようなものがあるのでしょうか?
 
行間を取得して、そのサイズを加えるしかないでしょうか?
 
初歩的な質問で恐縮ですが、どなたか教えて頂ければと思います。
よろしくお願い致します。

回答
投稿日時: 21/10/19 12:02:32
投稿者: Suzu

何をなさりたいのかが判りません。
 
ここで言う「カーソル位置」とは、何を言っているのでしょうか?
 
Selection.Information(wdActiveEndSectionNumber) で得られるのは、
レイアウト - ページ設定 の 区切り 内 セクション区切り の セクション番号 ですよね。
 
それが、行間の違い(シェイプの大きさ)により 変わりますか?
行間を取得 と 言っていますが、求めているのは、セクション番号であり、行間は関係無いと思っています。
 
目的や、再現ができるだけの情報がなくコメントしづらい状態です。
 
・何を求めたくて
・その時のレイアウト と、 シェイプの 文字の折り返し の設定
・カーソルの位置(シェイプを選択した状態なのか、違うのであればどこにあるのかシェイプの前?後ろ?)
・その時の、Selection.Information(wdActiveEndSectionNumber)の値
・実際の位置 と言っている その欲しい値 は ウィンドウのどこかに表示されている値なのでしょうか?
 表示されているのであれば、どこに表示されているのかを示してください。
 表示されていないのであれば、欲しい値は、どういう考え方で数えるなり求めるのかを示してください。

投稿日時: 21/10/24 15:41:07
投稿者: rodeo540
メールを送信

業務多忙のためお返事が遅くなってしまいました。申し訳ありません。
 
>Selection.Information(wdActiveEndSectionNumber) で得られるのは、
>レイアウト - ページ設定 の 区切り 内 セクション区切り の セクション番号 ですよね。
 
上記、焦って投稿して間違えています。すみません。。。。
Selection.Range.Information(wdVerticalPositionRelativeToPage)
が正解です。
 
何ともご説明が難しいのですが、
 
例えば1ページの行数38、行送り18ptの場合、1行目にカーソルがある場合は
Selection.Range.Information(wdVerticalPositionRelativeToPage)=79.5 程度でしょうか。
(マージンスペースにもよると思いますが)
 
ただ、その行内に大きいシェイプを入れるとカーソル位置はかなり下に移動するのですが、
Selection.Range.Information(wdVerticalPositionRelativeToPage)は同様に79.5のままです。
 
要は行内に大きいシェイプが入っている時、その行内にあるカーソルの位置を正確に取得したいというのが
意図になります。
 
この投稿に画像が張り付けれられれば、ご説明しやすいのですが。。。

回答
投稿日時: 21/10/25 13:28:08
投稿者: Suzu

再現できる情報を頂けていませんが、何となく推測はできました。
 
WdInformation 列挙 (Word)
https://docs.microsoft.com/ja-jp/office/vba/api/word.wdinformation
 
wdVerticalPositionRelativeToTextBoundary    8    選択範囲またはポイント (1 ポイント = 20 twip、72 ポイント = 1 インチ) で、それを囲む隣接する境界線の上端を基準にして範囲の垂直方向の位置を返します。 枠または表のセル内に挿入ポイントの位置を決定するのに便利です。 選択範囲が表示されない場合は、-1 を返します。
 
カーソルの存在する 行に シェイプが含まれている場合、そのシェイプの TOP位置 が 得られるのでしょう。
 
何のために位置が必要なのか判りませんが、

引用:
行間を取得して、そのサイズを加えるしかないでしょうか?

で良いと思います。

投稿日時: 21/10/25 22:13:41
投稿者: rodeo540
メールを送信

お返事ありがとうございます。
 
docは文字変数として、下のようなコードでカーソル位置にテキストボックスを挿入したいと思ってます。
その際に、一般的な文字だけの行の中にカーソルがあると概ねその場所にテキストボックスが入るのですが、
行間に大きいシェイプがあると、カーソルが点滅している行の下側では無くて、
行中のシェイプの上端部分に挿入されます。
 
Selection.Range.Information(wdVerticalPositionRelativeToPage)が
シェイプが存在することによる行の広がりを認識してくれないみたいです。
 
-----------サンプルコード------------------------------------------------
Ptop = Selection.Range.Information(wdVerticalPositionRelativeToPage)
Pleft = Selection.Range.Information(wdHorizontalPositionRelativeToPage)
 
s = Selection.Information(wdActiveEndSectionNumber)
Pwidth = ActiveDocument.Sections(s).PageSetup.PageWidth
PLmargin = ActiveDocument.Sections(s).PageSetup.LeftMargin
PRmargin = ActiveDocument.Sections(s).PageSetup.RightMargin
Pwidth = Pwidth - (PLmargin + PRmargin)
 
ActiveDocument.Shapes.AddTextbox(Orientation:=msoTextOrientationHorizontal, Left:=PLmargin, Top:=Ptop, Width:=Pwidth, Height:=18.2).Select
Selection.TypeText Text:=doc
------------------------------------------------------------------------
 

引用:
カーソルの存在する 行に シェイプが含まれている場合、そのシェイプの TOP位置 が 得られるのでしょう。

 
Selection.Range.Information(wdVerticalPositionRelativeToTextBoundary)
でも上手く拾ってくれませんでした。。。
Selection.Range.Informationの一覧も何回も眺めているのですが、
行間を拾う上手いプロパティが無さそうです。
 
良いアイデアを教えて頂ければ幸いです。

回答
投稿日時: 21/10/27 10:37:51
投稿者: Suzu

再現をできる情報は、頂けないのですね。。
 
 
Paragraph.LineSpacing プロパティ (Word)
https://docs.microsoft.com/ja-jp/office/vba/api/word.paragraph.linespacing
 
これで、行間を 取得できると思っていたのですが
 
実際に行うと、違うのですよね。。
 
確実なのは、次の行に移動してから
Selection.Information(wdActiveEndSectionNumber)
を取得し、その差を得る。

投稿日時: 21/10/27 14:23:17
投稿者: rodeo540
メールを送信

すみません、再現できる情報をお渡ししたいのですが、画像が貼れないため何とも上手く
お伝え出来ません。。。
 
前出のコードでテキストボックスを挿入した場合
 
←カーソルがここにある時 ←ここの高さにテキストボックスが入ります。
 
ただ、下の線で囲まれたものを何らかのシェイプとし、それが行間にある場合、
 
-----|←ここの高さにテキストボックスが入ります。
     |
     |
     |
-----|←カーソルがここにある時
 
という意味になります。
 
Paragraph.LineSpacing プロパティ (Word)
もあくまで行間を取得するだけなので、
大きいシェイプが入っていても1行は1行と認識されます。
 
教えて頂いた次の行との差分も色々と考えたのですが、
カーソルが最終行にあって、かつ上記の大きいシェイプがあった場合など、
そこそこ問題が出そうです。。。。。
 
 

回答
投稿日時: 21/10/27 16:48:35
投稿者: Suzu

レイアウトは 理解できました。 ただ、シェイプの 文字の折り返し の設定 は教えてほしかったです。
 
試せていませんが、行位置 や、文字位置 から 取得できませんか?

投稿日時: 21/10/27 16:55:04
投稿者: rodeo540
メールを送信

テキストボックスの折り返しの設定は以下のようにしています。
 

引用:
試せていませんが、行位置 や、文字位置 から 取得できませんか?

 
色々とやってみているのですが、どれもうまくいきません。。。
ちょっと諦めモードになってきています。
 
For Each shp In Selection.ShapeRange
 tbstyle shp, Pwidth
Next
------------------------------------------------------------------------
Private Sub tbstyle(ByVal shp As Shape, ByVal Pwidth As Variant)
shp.WrapFormat.Type = wdWrapFront
shp.Line.Visible = msoFalse
shp.Fill.Visible = msoFalse
With shp.TextFrame
' .AutoSize = False
' .WordWrap = msoFalse
 With .TextRange
  .Font.Size = Sfontsize
  .Font.TextColor.RGB = wdColorBlack
  .Font.Name = Sfontname
   With .Paragraphs
    .Alignment = wdAlignParagraphRight
    .LineSpacingRule = wdLineSpaceExactly
    .LineSpacing = 12
   End With
 End With
 .MarginRight = 2.834645669
 .MarginLeft = 2.834645669
 .MarginTop = 2.834645669
 .MarginBottom = 2.834645669
End With
End Sub
------------------------------------------------------------------------

回答
投稿日時: 21/10/28 09:13:03
投稿者: Suzu

提示頂いた tbstyle(ByVal shp As Shape, ByVal Pwidth As Variant) では
 
shp.WrapFormat.Type = wdWrapFront となっており、
文字列の折り返しは 前面ですよね?
 
もう一度確認です。
 

引用:
行が1行で通常の行間の場合、
「Selection.Information(wdActiveEndSectionNumber)」で取得した位置と実際の位置はずれませんが、
行間にある程度大きなシェイプ、図等を入れている場合(行間が大きい場合)、

 
このシェイプ が、前面 の設定であるなら、行間に影響は与えないと思っています。
それなのに、行間が大きくなるのでしょうか?
 
また、
Selection.Information 〜
の実行時に、選択している オブジェクトは何になりますか?
段落(行)? 図形? あるいは 別のオブジェクト?
 Selection.Tyoe にて確認ください。
 
Selection.Type プロパティ (Word)
https://docs.microsoft.com/ja-jp/office/vba/api/word.selection.type
 
WdSelectionType 列挙 (Word)
https://docs.microsoft.com/ja-jp/office/vba/api/word.wdselectiontype

回答
投稿日時: 21/10/28 09:23:02
投稿者: Suzu

Suzu さんの引用:

Selection.Information 〜
の実行時に、選択している オブジェクトは何になりますか?
段落(行)? 図形? あるいは 別のオブジェクト?
 Selection.Tyoe にて確認ください。

 
すみません。Selection.Type では不正確でした。
 
Shape テキストフレーム 内のテキスト位置に カーソルが/ある場合
そのカーソルの位置を返しますから。。
 
1.段落内の 行
2.図形/テキストボックス のフレーム
3.図形/テキストボックス 内の 行
4.その他
 
どれでしょう? 4.の場合はどこにカーソルがあるのかを教えてください。

投稿日時: 21/10/28 21:51:15
投稿者: rodeo540
メールを送信

引用:
このシェイプ が、前面 の設定であるなら、行間に影響は与えないと思っています。
それなのに、行間が大きくなるのでしょうか?

 
挿入しているシェイプは行内設定になります。そのため、行間が大きくなってしまいます。
 
また、Selection.Information 〜時の選択オブジェクトですが、
基本的には無し(カーソルが行間にある状態)を想定しています。
ただ、使用状況によっては、他のシェイプ等を選択している場合があります。
セクションごとのページ縦横幅を取得しているだけなので、
そこは余りこだわっていませんでした。
 
大きいシェイプが行内として入っている行に、
新規に追加でテキストボックスを挿入するイメージになります。

投稿日時: 21/10/28 23:20:29
投稿者: rodeo540
メールを送信

補足になりますが、新規に前面設定でテキストボックスを追加する形です。

回答
投稿日時: 21/10/29 10:34:42
投稿者: Suzu

現象は確認できているのですが、純粋な 垂直位置を求める方法が判りません
 
また、Selection が、Shapeもあり得るとの事で、
それが、行内 配置の Shape の可能性もあり、その所属する行 を取得する必要もある事になります。
 
当方では お力になれなさそうですので、すみませんが、ここまでとさせてください。

投稿日時: 21/10/29 10:54:08
投稿者: rodeo540
メールを送信

返信ありがとうございます。
やはり難しそうですね。
 
教えて頂いたように、次の行との差分を取ることを考えて
色々条件を分けて設定し出したのですが、
ファイルの最終行に行内設定でシェイプが入っていて、
そこにカーソルがある場合に困ってしまいました。。。。。
 
お時間を頂きありがとうございました。

トピックに返信