[[20200513180814]] 『取り消し線をまとめて消したい!』(vba初心者) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『取り消し線をまとめて消したい!』(vba初心者)

はじめまして!
大学資料のデータを整理しているのですが
あちこちに取り消し線の引かれた文字があります。

セル全体に取り消し線が引かれていたり
文頭、文末、文の途中にのみ引かれているものもあります。
セルを選択して削除するマクロは検索で見つけたのですが
資料データが膨大なので行を選択して
取り消し線のついた文字だけ(セルごとではありません)
削除し続けるマクロを作成したいです。

参考URL:https://stabucky.com/wp/archives/3209

やっていただきたい動作
1,行を選択する
2,マクロが選択した行から
取り消し線の入った文字を持つセルを検出
3,取り消し線のある文字のみ削除

宜しくお願いします!

< 使用 Excel:Office365、使用 OS:Windows8 >


 >   If myCell.Characters(Start:=i, Length:=1).Font.Strikethrough = False Then
 >      textAfter = textAfter & Mid(textBefore, i, 1)
 >  End If
↓
myCell.Characters(Start:=i, Length:=1).Font.Strikethrough = False

 > myCell.Value = textAfter

 ↑は削除かコメントアウト
(OK) 2020/05/13(水) 18:31


 ああ勘違い。

↑は取り消し線を消すだけのコードでした。
(OK) 2020/05/13(水) 18:32


 >1,行を選択する 

 ↑の意味が分かりませんが、参考HPのコードは
 お望みのとおりになっていると思います。
(OK) 2020/05/13(水) 18:36

 全セル選択して、取り消し線を解除すれば良いのに・・・。
(BJ) 2020/05/13(水) 18:36

すみません。
説明が足りませんでした。
上記のURLで取り消し線付き文字の削除は
確かに実現可能なのですが
行を丸ごと選択して実行すると
エクセルが5分以上応答なしになってしまい
そのまま強制終了しなければならないのです。

諦めて応答するまで待つべきなのでしょうか
(vba初心者) 2020/05/13(水) 18:42


とりあえず10分程度待てば動くことが分かったので
一先ずこれでやってみることにします
ありがとうございました!
(vba初心者) 2020/05/13(水) 18:53

最近γさんと半平太さんから教わったばかりの方法
合わせ技で使ってみました。

 Sub test()
    Dim s As String
    Dim r As Range

    Set r = Selection.EntireRow

    s = r.Value(xlRangeValueXMLSpreadsheet)
    With CreateObject("VBScript.RegExp")
        .Pattern = "<S>[\s\S]*?</S>"
        .Global = True
        s = .Replace(s, "")
    End With

    r.Value(xlRangeValueXMLSpreadsheet) = s

 End Sub

(マナ) 2020/05/13(水) 21:33


マナさん こんにちは。
驚速です。すごいです。
100倍くらいは早そうですね。
(γ) 2020/05/14(木) 08:59

その他の方法として、Wordを利用する方法も考えられます。
全体の文章の長さにもよりますが。
 
いったんWordに貼り付けてから、
Wordの書式付きの置換で、取消線のあるものを一括して消せます。
置換してから、Excelに戻すわけです。
テキストの扱いは、文書専門ソフトのほうが一日の長がありますから。
 
その他、現在のコードは一文字単位なので相当時間がかかると思います。
改良するとしたら、次の点は検討されたらよいと思います。
(1)セルの全体の.Font.Strikethroughを調べると、
  取消線がなければ False,全体が取消だとTrue,混在しているとNullを返しますから、
  少なくともFalse が返った時には、処理をスキップするとよいと思います。
(2)文字列の連結を繰り返すのは効率が悪いです。
 もとのセルの文字列と同じ長さの文字列を作っておき( String(長さ," ") など)
 これに Midステートメント(Mid関数ではなく)で書き込むと、速度向上になります。

私は、マナさんの手法をお薦めします。
XMLフォーマットの文字列をValueプロパティで取得して、
そのなかの取り消し線の情報を、正規表現を使って削除し、
その結果を元のセルに戻す、というものです。
(私もこのプロパティの使い方は半平太さんの発言から教わりました。)

(γ) 2020/05/14(木) 09:28


ありがとうございます!
マナさんのおかげで作業が早く終わりました!

コメントして頂いた他の方々も
本当にありがとうございます!

時間が余った際にyさんの手法も試させて頂きます。
(vba初心者) 2020/05/14(木) 16:54


よかったですな。
ちなみに、(2)のMidステートメントを使うと速くなるというのは、もっと大量の文字列を、
多数回連結する場合の話だったようです。セルの文字列の長さが普通のものであれば、
効果は余りありませんでした。(ちなみに、Space(長さ)でしたね。)
(1)のほうは気づきにくい点でありながら、効果はあるはずです。
 
特別に手を掛けてもらう必要もありません。
(閲覧されている方にもなんらかの参考になればと思って書いていますので。)
(γ) 2020/05/14(木) 17:38

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.