Word (VBA)

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

 
(指定なし : 指定なし)
表の特定の列の文字列を取得する方法
投稿日時: 16/11/29 14:39:28
投稿者: hatena
投稿者のウェブサイトに移動

Word VBA を使うのは今回が初めてで、下記で行き詰まっているで、よろしくお願いします。
 
テーブルの3列目の文字列を取得しようと、下記のコードを書きました。
 

    Dim s As String

    ActiveDocument.Tables(1).Columns(3).Select
    s = Selection.Text
    Debug.Print s

ところが、1行目の文字しか取得できませんでした。
 
    Dim s As String

    ActiveDocument.Tables(1).Columns(3).Select
    Selection.Copy

 
とするとクリップボードにはすべての行の文字列が入ってます。
 
最終的には下記で目的は達成できたのですが、、
 
    Dim c As Word.Cell
    Dim s As String
   
    For Each c In ActiveDocument.Tables(1).Columns(3).Cells
        s = s & Left(c.Range.Text, Len(c.Range.Text) - 1)
    Next
 
    Debug.Print s

 
クリップボード経由、または For は使わずには無理でしょうか。
 
あと,c.Range.Text だと最後にゴミがついてくるので、Leftで削除してますが、これもなんなのか気になります。
 
最終的には、列をcsvファイルとして保存したいので、これが、もっと手軽にできる方法があれば、うれしいです。

回答
投稿日時: 16/11/29 17:19:36
投稿者: sk

引用:
テーブルの3列目の文字列を取得しようと、下記のコードを書きました。
 
    Dim s As String

    ActiveDocument.Tables(1).Columns(3).Select
    s = Selection.Text
    Debug.Print s

ところが、1行目の文字しか取得できませんでした。

複数の範囲でテキスト選択されているのと
同じような扱い(飛び石状態)となるため、
Selection オブジェクトの Text プロパティの性質上、
その列の最初のセル(選択範囲)の
テキストしか返せないのではないかと。
 
例えば、
 
1. ドキュメントの本文中の任意のテキストを範囲選択。
 
2. そのまま Ctrl キーを押しながら、マウスドラッグで
   他のテキストを範囲選択する。
 ( 1 の選択範囲とつながらないようにする)
 
3. 複数範囲でテキスト選択が行われている状態で、
   Selection オブジェクトの Text プロパティの
   値を参照する。
 
といった操作を行なった場合、最初の選択範囲の
テキストのみが返されることになります。
 
また、Column オブジェクトではなく
1 つの Row オブジェクト、あるいは
1 つの Table オブジェクトを選択した場合は、
Selection オブジェクトの Text プロパティは
選択範囲内の各セルに含まれるテキストを
1 つながりの文字列( String 型のデータ)として返します。
(内部的には「 1 つの選択範囲」なので)
 
引用:
    Dim s As String

    ActiveDocument.Tables(1).Columns(3).Select
    Selection.Copy

  
とするとクリップボードにはすべての行の文字列が入ってます。

厳密には、プレーンテキストだけでなく
セル/段落/テキストの書式に関するデータも
コピーされているはず。
 
(コピーしたデータをどこに/どうやって貼り付けるか、
 どのような形で貼り付けられることになるかは、
 また別の問題)
 
引用:
最終的には下記で目的は達成できたのですが、、
 
    Dim c As Word.Cell
    Dim s As String
   
    For Each c In ActiveDocument.Tables(1).Columns(3).Cells
        s = s & Left(c.Range.Text, Len(c.Range.Text) - 1)
    Next
 
    Debug.Print s

 
クリップボード経由、または For は使わずには無理でしょうか。

各セルのプレーンテキストのみを抜き出したい
(書式情報は含めない)ようにするなら、
基本的には For Each ... Next 文で対処されるのが無難かと。
 
引用:
あと,c.Range.Text だと最後にゴミがついてくるので、
Leftで削除してますが、これもなんなのか気になります。

1 つのセル(の最後の段落)の末尾に含まれる特殊記号。
( Chr(7) に相当)
 
引用:
最終的には、列をcsvファイルとして保存したいので、これが、もっと手軽にできる方法があれば、うれしいです。

( Excel ワークシートの CSV 出力にも言えることですが)
セル内に複数の段落/改行文字/タブ記号/カンマ等が
含まれているケースまで想定した限り、
そう気軽には出来ないと思います。
何らかのエスケープ処理が必要となるはず。

投稿日時: 16/11/29 23:09:43
投稿者: hatena
投稿者のウェブサイトに移動

> 各セルのプレーンテキストのみを抜き出したい
>(書式情報は含めない)ようにするなら、
> 基本的には For Each ... Next 文で対処されるのが無難かと。
 
やはり、そうですか。
 
> 1 つのセル(の最後の段落)の末尾に含まれる特殊記号。
>( Chr(7) に相当)
 
下記で希望の結果になることを確認しました。
 

    For Each c In ActiveDocument.Tables(1).Columns(3).Cells
        s = s & Replace(c.Range.Text, Chr(7), "")
    Next

 

投稿日時: 17/01/17 18:15:01
投稿者: hatena
投稿者のウェブサイトに移動

解決済みにするのを忘れてました。