- ベストアンサー
WordVBA 行の削除
Word上に挿入した表中でに記載されている文章での選択している行の削除を行いたいと考えています。 With Selection .StartOf wdLine .EndOf wdLine, wdExtend .Delete End With 上記のプログラムで、途中の行は期待通りに削除されます。 しかし、表のセル中の最終行を選択した状態で上記を実行すると、セル内が全て選択され、消えてしまいます。 最終行を選択した状態では、最終行のみを削除したいのですが、どのように指定すればよいでしょうか? 使用している環境はWord2003です。 教えてください。よろしくお願いいたします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
いろいろ検討してみたのですが、具体的な案が浮かばなかったので回答 を控えていましたが、他の回答者によるアイデアが出るように、簡単な アドバイスをしますね。 質問で示したマクロは行頭にカーソルがあって、[ Shift+End ]キーを 押して[ Delete ]キーで削除したときと同じ動作です。 このとき、セルの最後にある[セルの終了記号](End of cell marker)を 選択するとセル全体を選択することと同じになります。 単純に、行にあるテキストを一行分削除するだけなら、 With Selection .EndOf wdLine .StartOf wdLine, wdExtend .Delete End With のように、行末(段落記号を含まない)から行頭を選択して削除すること で、どの行でも問題なく削除できます。このとき行末に段落記号がある 場合は残ってしまいますので、[段落記号]の場合と[セルの終了記号]の 場合の条件で指定範囲の向きを指定できるかと思ったのですが、私では 調べてもわかりませんでした。 セル全体が選択されたかどうかを判断する条件にする方法も、検討材料 としてあるとは思いますが、よくわかりませんでした。 Wendy02さんのマクロだと段落の数と段落ごとの削除になるので、表内 の段落にある特定行を削除することには向かないと思います。 条件として、行ごとに段落で改行してあるような複数行=複数段落での 指定している場合なら、有効なものだと思います。 具体的なマクロを提示できませんが、私なりのアドバイスも参考にして ください。
その他の回答 (5)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 まず、大事なことは、ご質問者さんがら、どのようにして、セルに入力している、または作っているか、ということです。回答者が、自分の想定内であれこれ空回りをしてもしょうがないと思います。 私のコードがうまく行かなかったのは、あくまでも、こちらの想定した内容とは違うということです。想定上で生み出されたコードが、うまく出来ないから、コードがダメだということではないはずです。 最終的には、ループして、セル全部を処理するということを考えると、セルを指定していくことを想定しなければならないように考えています。問題は、あくまでも、セル内の行の区切りの問題です。また物理的に区切られていないかもしれません。 どうやら、先ほど、もう一つのご質問のほうが解決したようで、これも同質の内容のようですから、こちらのほうも確実な線は見えてくるような気がします。 私のコードは、以下の条件下で作れられています。 こちらで成功しているのは、 たとえば、 --------セルの中 ABC↓ EFG↓ HIJ↓ KLM↓・ -------- (添付の図を参照)左は可能ですが、右では出来ません。) そして、カーソルを、セル内に指定した場合という条件です。間違いないと思ったからコードを掲示したわけですが、どうやら、想定内のものではないようにも思えるのです。 なお、他に、セル幅と比較して行の範囲を取るというものですが、それは、なかなか難しいかもしれません。出来れば、物理的にカーソルを動かすのだけは避けたいと思います。 enunokokoroさん、私に限らず、よほど、相手が凡ミスでない限りは、他人のコードのダメ出しはやめましょう! >Wendy02さんのマクロだと段落の数と段落ごとの削除になるので、表内 >の段落にある特定行を削除することには向かないと思います。 ただ、一応、説明はしておきます。 Paragraphは、改行コードで区切られた範囲のことを指します。しかし、行というものは、Word VBAでは、論理的なものでしかありませんし、物理的には存在しているわけではありません。それと、ご指摘になった段落の数と段落ごとを削除するというコードではありませんから、念のため。 私のコードは、Paragraphs というコレクションの最後のParagraphから、遡って、そのParagraphsの先頭に戻ってそこから、削除するという内容です。 セル内をどう区切っているか、区切られていないか、ということです。条件を確認したほうがよいということです。
補足
回答ありがとうございます!他の質問でもお世話になっています。 頂いたソースコードで可能な処理は了解いたしました。これから行おうとしている処理は「論理的」であることも了解いたしました。 図を用意して頂いているので、そちらを参考に説明をさせていただきます。 プログラムで行いたいのは、「あいうえお」「たちつてと」は勿論のこと、「ねの」「はひふ」の見た目の行を削除することです。 削除したい行にカーソルを持って行き、キーボードで順番にEnd、Shift+Home、Deleteを押すと行の削除ができますが、この処理をプログラムで行いたいと考えています。 対象Wordは私が作成したファイルではなく、提示することは難しいと考えます。ご容赦ください。 今回の質問の流れで[セルの終了記号](End of cell marker)の存在を知ることができたので、 質問自体はほぼ解決しています。ありがとうございます。
- KenKen_SP
- ベストアンサー率62% (785/1258)
勘違いしてるかもその2 Sub sample() On Error Resume Next Dim r As Row, c As Cell For Each r In Selection.Rows For Each c In r.Cells c.Range = vbNullString Next Next End Sub 削除なのか、消去なのか...?
補足
回答、ありがとうございます! 頂いたソースを実装し、表の中、表以外で実行してみたのですが、何も起きませんでした・・・ そして、削除か消去か、ということですが、消去になります。 指定行だけを消去したいのですが、ソース中のCellが表の1つの枠の中を意味するのであればNullを入れてますので、セル内全てを消去しようとしているように読み取れます。 しかし、こういった消去方法や組み方は参考になります。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 他の質問でも同様のものがありましたが、うまく行く・行かないというのは、 >表のセル中の最終行を選択した状態で上記を実行すると、 うまく行かないのは、改行(CRLF)コードで区分けされている、Paragraphが複数行存在していないかもしれません。内容を確認してみないと、なんとも言えません。 複数のParagraph がない場合に切り分けるということは、難しいかもしれません。入力の際に意識して入れたなら、私のコードは実行可能なはずです。それ以外の切り分けのコードは、いくら作っても不安定ではないかと思います。 それは、Excelでも同じですが、セル幅と文字をカウントして、それで、行を探すというのは、あまりうまく行かないのではないかと思います。ただし、Excelのセル内では、違う改行(LF)コードだったと思います。また、Wordでも似たような改行コードも存在していたような気がしますが、セル内では用いられないと思います。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 こんなコードではいかがでしょうか? セル内にカーソルがないと実効しません。 また、セル内が一行しかない場合は、削除しません。 >表のセル中の最終行を選択した状態で上記を実行すると、 最終行の末尾には制御記号があるので、Cell内全体を選択されます。 '------------------------------------------- Sub LineDelect_A_Cell() Dim i As Long With Selection .Expand Unit:=wdCell i = .Paragraphs.Count 'セル内の行を数える If i > 1 Then .Collapse Direction:=wdCollapseEnd .MoveEnd Unit:=wdCharacter, Count:=-1 .StartOf Unit:=wdParagraph, Extend:=wdExtend ''行を削除する場合は、以下を外す '.MoveStart Unit:=wdCharacter, Count:=-1 Selection.Delete End If End With End Sub
補足
回答ありがとうございます。 早速標準モジュールに記載して実行してみたのですが、選択している枠内以外の行が削除されてしまいました。 何度か実行してみると、削除されなかったり、セル内が全て削除されたり、色々なパターンを確認しました。 頂いたコードは、参考にさせていただきます。勉強になります。
- KenKen_SP
- ベストアンサー率62% (785/1258)
> Word上に挿入した表中でに記載されている文章での選択している行の削除 On Error Resume Next Selection.Rows.Delete 勘違い回答の予感。
補足
回答、ありがとうございます。 教えて頂いた方法を行ってみましたが、表の行そのものが削除されます。申し訳ないのですが、違ってました・・・ 表を作成し、その中にいくつか改行を含めた文字列を入力し、上記の質問部分のプログラムを実行すると、なぜか選択行の文字だけでなく、セル内全てが削除されてしまいます。 質問部分のプログラムは、ほぼ期待通りの動きはしているので、何かが足りないだけだと思うのですが・・・
補足
回答ありがとうございます! [セルの終了記号](End of cell marker)の存在を知りませんでした・・・原因はコレですか! 行の選択で、End、Shift+HomeとHome、Shift+Endに違いは無いと考えていましたが・・・改めます。 [セルの終了記号](End of cell marker)を意識して各行を選択し、キーボードでEnd、Shift+Home、Deleteを行ってみたところ、全ての行で意図通りの削除ができることを確認しました。 セル内の最終行でEnd、Shift+Homeを行っても問題ありませんでした。 本質問の直接的な原因が判明したのですっきりしました。 これで、やりたいことはできそうです。