Word (VBA)

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

 
(Windows 10 Pro : Word 2016)
表中セルを縦方向に2つ以上選択した場合の行間指定マクロ
投稿日時: 20/09/09 12:09:03
投稿者: rodeo540
メールを送信

表中セルを縦方向に2つ以上選択した場合の行間指定マクロですが、
 
With Selection.ParagraphFormat
 .LineSpacingRule = wdLineSpaceExactly
 .LineSpacing = LS '行間値
End With
 
で LineSpacingRule が9999999 になってしまいます。
 
横方向に連続で触った場合、もしくは縦方向2セルを触っていたとしても
複数選択として、最後に横方向のセルを触った場合、
もしくは文章中を触った場合はうまくいきます。
 
ワードVBAのバグでしょうか?
 
あきらめて、セル毎に設定しようとしましたが、
文章中を含む複数範囲を選択しているときの
Rangeの取得方法が分かりませんでした。
 
どなたか、ご回答をお願い致します。

回答
投稿日時: 20/09/09 14:33:37
投稿者: sk

引用:
表中セルを縦方向に2つ以上選択した場合の行間指定

引用:
With Selection.ParagraphFormat
 .LineSpacingRule = wdLineSpaceExactly
 .LineSpacing = LS '行間値
End With

If Selection.Information(wdWithInTable) And _
   Selection.Type = wdSelectionColumn Then
    Dim wrdCell As Word.Cell
    For Each wrdCell In Selection.Cells
        With wrdCell.Range.ParagraphFormat
            .LineSpacingRule = wdLineSpaceExactly
            .LineSpacing = LS
            Debug.Print wrdCell.RowIndex & "行目" & wrdCell.ColumnIndex & "列目のセルの全ての段落の LineSpacingRule: " & .LineSpacingRule
        End With
    Next
Else
    With Selection.ParagraphFormat
        .LineSpacingRule = wdLineSpaceExactly
        .LineSpacing = LS
        Debug.Print "LineSpacingRule: " & .LineSpacingRule
    End With
End If
------------------------------------------------------------
 
以上のようなことをなさりたい、ということでしょうか。

投稿日時: 20/09/09 22:55:08
投稿者: rodeo540
メールを送信

ありがとうございます。
 
実は同じようなことはしていまして、
単独で縦方向の複数セルを選択している場合はこれで大丈夫なのですが、
離れている場所で複数セルを2か所以上選択すると、
最後に触った場所のみのRangeが認識し、
初めに触った場所の情報をつかめません。。。
(for each のループが回りません)
 
何かお分かりでしたら、ご回答よろしくお願いいたします。

回答
投稿日時: 20/09/10 10:59:48
投稿者: んなっと

古い方法ですが...
表のどのセルにも「網掛け」を設定していないなら、こんな方法も。
 
  Dim c As Cell
  If Not Selection.Information(wdWithInTable) Then Exit Sub
  Selection.Shading.Texture = wdTexture20Percent
  Set c = Selection.Tables(1).Range.Cells(1)
  Do Until c Is Nothing
    If c.Shading.Texture = wdTexture20Percent Then
      With c.Range.ParagraphFormat
        .LineSpacingRule = wdLineSpaceExactly
        .LineSpacing = 30
      End With
    End If
    Set c = c.Next
  Loop
  Selection.Shading.Texture = wdTextureNone
 
For Each ... Nextを使わないのは、結合セル対策です。
 
※網掛けの方法が使えない表の時は、「塗りつぶし」を利用することもできます。
 
  Dim BC As Long
  Dim c As Cell
  If Not Selection.Information(wdWithInTable) Then Exit Sub
  BC = Selection.Shading.BackgroundPatternColor
  Selection.Shading.BackgroundPatternColor = wdColorBrightGreen
  Set c = Selection.Tables(1).Range.Cells(1)
  Do Until c Is Nothing
    If c.Shading.BackgroundPatternColor = wdColorBrightGreen Then
      With c.Range.ParagraphFormat
        .LineSpacingRule = wdLineSpaceExactly
        .LineSpacing = 30
      End With
    End If
    Set c = c.Next
  Loop
  Selection.Shading.BackgroundPatternColor = BC

投稿日時: 20/09/10 11:56:25
投稿者: rodeo540
メールを送信

ありがとうございます。
ハッチングをフラグにするのですね。
今ちょっと時間が無くて確認できないのですが、
週末、もしかしたら来週確認いたします。
取り急ぎ、お礼まで。

回答
投稿日時: 20/09/10 12:01:01
投稿者: sk

引用:
単独で縦方向の複数セルを選択している場合はこれで大丈夫なのですが、
離れている場所で複数セルを2か所以上選択すると、
最後に触った場所のみのRangeが認識し、
初めに触った場所の情報をつかめません

1. ある表の 1 行目の 1 列目のセルを選択。
 
2. Ctrl キーを押しながら、同じ表の 1 行目の 3 列目のセルを選択。
 
といったように、2 つ以上のセル領域を選択する操作が
行なわれた直後の状態でマクロを実行しようとされている、
ということでしょうか。

投稿日時: 20/09/10 14:01:43
投稿者: rodeo540
メールを送信

ご指摘の通りの状況です。
離れた箇所の複数セルを同時に操作したいためです。

回答
投稿日時: 20/09/11 17:48:15
投稿者: sk

引用:
離れた箇所の複数セルを同時に操作したい

その場合は、んなっと さんが既に提示されたような方法を
取るしかないと思います。
 
範囲選択ではなく複数選択された(連続していない)領域
( Range, Cells, Paragraphs など)のうち、カーソルがない領域を
VBA のコードによってダイレクトに/個別に指定して参照する方法
(例えば Excel における Areas コレクションのような
オブジェクトやプロパティ、メソッド)が、残念なことに
現時点においてサポートされていないためです。

回答
投稿日時: 20/09/11 19:28:51
投稿者: んなっと

表以外の部分も対象にするときは、特殊なフォント設定などを目印に利用。
下の例は、蛍光ペン。
 
 
  Dim r As Range
  Dim tmp As Long
  Application.CommandBars.ExecuteMso ("TextHighlightColorPicker")
  Set r = ActiveDocument.Range(0, 0)
  With r.Find
    .Forward = True
    .Highlight = True
    Do While .Execute
      If r.End = tmp Then Exit Do
      With r.ParagraphFormat
        .LineSpacingRule = wdLineSpaceExactly
        .LineSpacing = 30
      End With
      r.Collapse wdCollapseEnd
      tmp = r.End
    Loop
  End With
  ActiveDocument.Content.HighlightColorIndex = wdNoHighlight

投稿日時: 20/09/12 11:56:09
投稿者: rodeo540
メールを送信

皆様ありがとうございました。
基本的には、selection.rangeで複数対応が可能なのですが、
なぜか、表中の縦方向2セル以上を触っているときうまくいきませんでした。
仮に2つの表中を選択していたらとか、少し課題は残りますが、
(判定はできない?)
その辺は追及するよりもマクロの運用で解決したいと思います。
重ねてお礼申し上げます。
 
 

回答
投稿日時: 20/09/12 15:01:42
投稿者: んなっと

それから9999999(undefined未定義)は、得られる値が2つ以上「混在」しているなど
有効なひとつの値に特定できないときに返されます。

トピックに返信