Excel (VBA)

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

 
(Windows 10 Pro : Excel 2016)
再生時間を削除して整形
投稿日時: 20/11/13 13:39:47
投稿者: Nubo

mp3の曲名(ファイル名)を編集する事が多いのですが、
曲名の途中に
  「05:13」,[12:13],(05:45)
などいくつかのカッコ(「」、[],())で区切られた再生時間(05:13等)が
位置が決まっていない状態で存在します。
 
例えば、
 
A列に
 8. Oh, My Father (2012 Stereo Mix)[04:05]
 03 「06:11」On The Run
 Pink Floyd - Learning To Fly (Live, Delicate Sound Of Thunder)(08:22) [2019 Remix]
 
これを一括で削除する方法は無いでしょうか ?
(一括が無理なら、なるべく作業効率が良くなるような方法)
 
B列に
 8. Oh, My Father (2012 Stereo Mix)
 03 On The Run
 Pink Floyd - Learning To Fly (Live, Delicate Sound Of Thunder)[2019 Remix]
 
------------------------------------------
位置が決まっていればファイル名の変名ソフトで処理できるのですが
 位置が決まっていないので手作業となり効率が悪い作業を毎回しています。
 
素人考えでは、
 :の位置を数えてその前後3つずつ=数字(2)とカッコ(1)を削除されば良いような気がしますが ?
  削除した後でカッコ(「」、[],())前後のテキストを合成する作業があるので
  マクロを使っても私にはできそうにありません。
    
   

回答
投稿日時: 20/11/13 14:50:34
投稿者: sk

引用:
曲名の途中に
  「05:13」,[12:13],(05:45)
などいくつかのカッコ(「」、[],())で区切られた再生時間(05:13等)が
位置が決まっていない状態で存在します。

引用:
これを一括で削除する方法は無いでしょうか

(標準モジュール)
--------------------------------------------------
Sub RemoveTimeString()
 
    Dim re As Object
    Set re = CreateObject("VBScript.RegExp")
    With re
        .Global = True
        .IgnoreCase = False
        .Pattern = "[\(\[「]\d{1,}[::]\d{2}[\)\]」]"
    End With
     
    Dim lngRow As Long
    Dim lngFirstRow As Long
    Dim lngLastRow As Long
    Dim strText As String
     
    lngFirstRow = 1
    lngLastRow = Cells(Rows.Count, 1).End(xlUp).Row
             
    For lngRow = lngFirstRow To lngLastRow
        strText = re.Replace(Cells(lngRow, 1).Text, "")
        Cells(lngRow, 2).Value = strText
    Next
     
    Set re = Nothing
     
End Sub
--------------------------------------------------
 
以上のようなコードを実行なさりたい、ということでしょうか。

投稿日時: 20/11/13 15:24:34
投稿者: Nubo

>以上のようなコードを実行なさりたい、ということでしょうか。
 
コード(標準モジュール)の提供ありがとうございます。
 
3種類のカッコ(「」、[],())でサンプル曲名を指定してみました。
結果は、私が望んでいた不必要な再生時間のみが削除された形式に変換されました。
 
改めてお礼申し上げます。
 
カッコの種類が増えた場合
 .Pattern = "[\(\[「]\d{1,}[::]\d{2}[\)\]」]"
のところに追加分を挿入する形式になると思うのですが、
どのような考えで追加すれば良いですか ?
 
参考に教えていただければ嬉しいです。
 
 
 
 

回答
投稿日時: 20/11/13 15:42:56
投稿者: sk

引用:
カッコの種類が増えた場合
 .Pattern = "[\(\[「]\d{1,}[::]\d{2}[\)\]」]"
のところに追加分を挿入する形式になると思うのですが、
どのような考えで追加すれば良いですか ?

'二重かぎ括弧を追加した場合
.Pattern = "[\(\[「]\d{1,}[::]\d{2}[\)\]」]"
 
------------------------------------------------------------
 
RegExp オブジェクトを使用した正規表現における
メタ文字やエスケープシーケンスについては、
とりあえず以下の記事の内容を参照して下さい。
 
Office TANAKA より:
http://officetanaka.net/excel/vba/tips/tips38.htm
 
Excelの神髄 より:
https://excel-ubara.com/excelvba4/EXCEL232.html

投稿日時: 20/11/13 18:34:06
投稿者: Nubo

追加の情報ありがとうございます。
 
おかげさまで、追加するカッコの位置は理解できました。
(同じ[でも\[[は違うので区別が付きにくかったですが
  パターンが判明しました。)
 
これで自分でカッコを追加する事ができるようになります。
 
最後の質問としたいのですが、
 コード中の\d{1,}[::]\d{2}の部分が再生時間(分、秒)なのは、
 推測できるのですが、紹介いただいたURLを見ても難解です。
 
 これは、どう読み解くのでしょうか ?
 
-----------------------------------------
後のコードは、理解できました。
  (再生時間を見つけて、””に変換して結果をB列に書き出す。)

回答
投稿日時: 20/11/13 21:01:44
投稿者: simple

横入りします。

引用:
 コード中の\d{1,}[::]\d{2}の部分が再生時間(分、秒)なのは、
 推測できるのですが、紹介いただいたURLを見ても難解です。
 これは、どう読み解くのでしょうか ?

\d{1,} \d(数字)が1個以上続く
[::] : か : にマッチ
\d{2} \d(数字)が2個続く
という意味ですね。
 
>紹介いただいたURLを見ても難解です。
まあ、書いてはあるんですがね。
誰でも、直ぐにぱぱっと理解できないかもしれないですね。
色々な例にあたって場数を踏むこともある意味必要です。
 
正規表現というのは、典型的なDSL(Domain-Specific Language)であり、
深みもあって"沼"ですかね。

回答
投稿日時: 20/11/13 23:51:38
投稿者: sk

引用:
コード中の\d{1,}[::]\d{2}の部分が再生時間(分、秒)なのは、
推測できるのですが、紹介いただいたURLを見ても難解です。

各パートの意味については simple さんが解説されている通りです。
 
「分」を示すパターンとして \d{1,} を使用した私の意図について
お答えするなら、"[1:00]" や "[100:00]" のように
「分」を示す文字列の長さが 2 文字固定ではないケースを
想定したから、ということになります。
 
ただ実は、それもあくまで簡略化されたパターンに過ぎません。
 
例えば、次のようなケースも含めて「時刻/時間( time )を表す文字列」であるか否かを
より正確に、より広い解釈で判別したいのであれば、もっと詳細にパターン文字列を
記述する必要があるでしょう。
 
・"[1:00:00]" のように「分」や「秒」だけでなく
 「時/時間( hour )」の表記も含まれるケース
 
・"[1:1]" のように「秒」を示す文字列の長さが 1 文字であるケース
 ( \d{2} には合致しない。このケースも含めるべきかどうかは、読み手の解釈による)
 
・"[1:60]"のように「秒」の範囲が 59 を超えているケース
 (本来なら弾かれるべきだが、 \d{2} に合致しているのでヒットする。
  また「分」「秒」に加えて「時/時間( hour )」の表記も含まれる場合、
  「分」の範囲も 59 を超えないようにしなければならない)

投稿日時: 20/11/14 11:20:38
投稿者: Nubo

simpleさん、skさん 読み解きの情報ありがとうございます。
 
>\d{1,} \d(数字)が1個以上続く
>\d{2} \d(数字)が2個続く
>という意味ですね。

 
\d{1,} \d(数字)が1個以上続くは、
   分は100分以上(3桁)なることは、考えられないので
   1-99分(1桁又は2桁)で完結すると思います。
    (1曲が100分を超えるmp3に出会ったことはまだないです。)
 
 なので\d{1,2}で良いのでしょうが保険をかけて\d{1,}を採用します。
    (5分を05分と記載されている場合も想定)
 
\d{2} \d(数字)が2個続くは、
   秒なので1-59秒(1桁又は2桁)で完結です。
 
 なので\d{1,2}を採用します。
   (2秒を02秒と記載されている場合も想定)
 
------------------------------------
>"[1:00:00]" のように「分」や「秒」だけでなく
>「時/時間( hour )」の表記も含まれるケース

 
  1曲でmp3が1時間を超すのは、分で61-99分のmp3と同じく
   ほとんど考えられないので判別から外しても問題ないと思います。
 
---------------------------------------
[::] : か : にマッチ
 
   最後のこの意味が、判りません。
  
  (分と秒の間を表す「:」を検索するなら[:]は1個で良いのに
     [::]と2個セットする意味が ?)
 
   この辺が"沼"と表現されている意味ですか。
 
  

回答
投稿日時: 20/11/14 12:02:40
投稿者: simple

神髄サイトに記載されている「文字クラス」の
説明を確認してください。[]がポイントです。
半角全角のいずれかのコロンにマッチする
という意味です。
 
# まだ沼には行っていないです。
# 少し湿度が上がったくらいかと。

回答
投稿日時: 20/11/14 18:31:20
投稿者: simple

参考情報も挙げておきましょう。
万人にお勧めするものではなく、興味をお持ちのかたに、という趣旨です。
 
VBScriptの正規表現に関するヘルプは、下記が原典です。
https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc392149(v=msdn.10)
なお、サイドバーにあるリファレンスから、
関連するオブジェクトについての説明にも辿っていけます。
見逃さないようにしてください。
 
関連書籍では、
@「詳説 正規表現」第3版(オライリージャパン; 第3版 (2008/4/26))翻訳本
が昔から薦められる本です。
A「正規表現技術入門 ――最新エンジン実装と理論的背景」 (WEB+DB PRESS plus)
は、最近出版された書籍です。
いずれも深いところまで書いてありますので、すべて読みこなすのは至難ですが、
定評はあると思います。
 
B[改訂新版]正規表現ポケットリファレンス (技術評論社)
は手にしたことはありませんが、例はたくさん載っていそうです。
こうした本のほうが実務的でよいかもしれません。
 
その他、色々関連書籍はありますので、もし興味があれば、
一度、大型の書店で手に取られたらよいでしょう。
 
実際的なのは、質問掲示板の過去ログで「正規表現」などと検索してヒットする
実際の質問に、ご自分でトライしてみることかと思います。
手っ取早く慣れることになると思います。
(こちらのサイトは6ヶ月で消されるのでダメですが。)

投稿日時: 20/11/15 06:07:55
投稿者: Nubo

simpleさん、参考書籍の紹介を含めて回答ありがとうございます。
 
昔、ネットが無かった時代は、
 書店で参考書を購入していましたがネット社会となり
 必要な情報が入手できるようになり、
  近頃、ほとんど書店に行かなくなりました。
 (そのため、全国の書店、特に個人経営の中、小型店
    閉店傾向にあるとのニュースを見ました。)
 
やはり、”VBA「正規表現」”で検索して
 参考になりそうな記事を見つけてなれるしか無いのですね。
 
昨日から、何箇所か参考になりそうな記事を見つけたので
 参考にしたいと思います。
 
今回は、大変お世話になりました。
  (幕引きにしたいと思います。)

回答
投稿日時: 20/11/15 19:17:03
投稿者: simple

ヘルプへのリンクが上手くいっていないですが、
URLそのものは正しいので、最後まで選択してコピーペイストしてください。
  
オンライン書店ですよね。私も利用しています。
申し上げたかったのは、やや高価でもあるので、
内容をよく見てから購入してください念のため、ということだけでした。
 
ただ、杞憂だったでしょうね。
それほど熱心になっているわけではないでしょうから、
本を買ってまでというのが非現実的でしたか。
まあ、ご覧になっている方の中の、わずかの方にでも参考になれば、と思います。
  
私も とば口 に立っているだけですので、偉そうには言えませんが、
なにごともそうですが、ご自分でトライして苦労すると、身につくように思います。
頑張って下さい。

回答
投稿日時: 20/11/15 19:58:50
投稿者: kumatti
投稿者のウェブサイトに移動

simple さんの引用:
ヘルプへのリンクが上手くいっていないですが、

括弧だけURLエンコードされるとか。
https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc392149%28v=msdn.10%29

回答
投稿日時: 20/11/15 21:32:55
投稿者: simple

どうも、ありがとうございます。助かります。

回答
投稿日時: 20/11/16 09:04:27
投稿者: sk

引用:
[::] : か : にマッチ
  
最後のこの意味が、判りません。
  
(分と秒の間を表す「:」を検索するなら[:]は1個で良いのに
[::]と2個セットする意味が ?)

それは Nubo さんが最初に例示されたデータ( A 列の各セルの値)に、
半角コロン(:)だけでなく全角コロン(:)で分と秒が
区切られているケースが含まれていたため、どちらでも
対応できるようにしたまでです。
 
Nubo さんの引用:
A列に
 8. Oh, My Father (2012 Stereo Mix)[04:05]
 03 「0611」On The Run
 Pink Floyd - Learning To Fly (Live, Delicate Sound Of Thunder)(08:22) [2019 Remix]

「実際に全角コロンで区切られているケースはあり得ない」あるいは
「全角コロンで区切られているケースについては無視する(そのまま残す)」
ということであれば、パターン文字列をそのように書き換えればよろしいでしょう。

投稿日時: 20/11/16 10:27:41
投稿者: Nubo

skさん、解説ありがとうございます。
 
恥ずかしながら、
 全角と半角の違いについて認識していませんでした。
 
これで「:」問題もスッキリしました。
 
お礼申し上げます。
----------------------------------