Excel (VBA)

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

 
(指定なし : 指定なし)
「特定数値の抽出・置換」 のTOM57さん へ
投稿日時: 22/05/21 09:37:00
投稿者: Nubo

「特定数値の抽出・置換」
 
もう見ていないでしょうが、
 
すいません。
(78)の前後のカッコはは残す件
質問ちゃんと見ていませんでした。
 
難しくて正規表現のパターンが習得できない私は相変わらずReplaceで処理しています。
 
 
垢抜けしませんがとりあえず下記でも希望の処理は出来ます。
 
Option Explicit
 
Sub test_2()
  
Dim target As String
Dim tmp1 As String, tmp2 As String, tmp3 As String, tmp4 As String, tmp5 As String
  
target = "///aaa(12)___aaa(334)\\\\aaa(556)___(78)\\\"
  
tmp1 = Replace(target, "(78)", "xx78yy")
tmp2 = Replace(tmp1, "aaa", "")
tmp3 = Replace(tmp2, "(", "")
tmp4 = Replace(tmp3, ")", "")
tmp5 = Replace(tmp4, "xx78yy", "(78)")
  
Range("A1") = tmp5
  
End Sub
 
 
A1: ///12___334\\\\556___(78)\\\
 

回答
投稿日時: 22/05/21 11:27:29
投稿者: TOM57

Nuboさん
 
回答ありがとうございます。
私も正規表現がマスターできてなくて、先ほどsimpleさんから回答して
頂いたのを参考に勉強しているところでした。
 
色々なやり方を教えていただいてとても参考になります。
ありがとうございました

回答
投稿日時: 22/05/21 12:20:43
投稿者: simple

s = "///aaa(12)___aaa(334)\\\\aaa(556)___(78)\\\aaaXY"
のようなaaaのあとにカッコつき数字が続かないケースはありますか?
そのときは、aaaだけ消すのですか?
もし、
・そういうケースは無い
・あってもその場合は、aaaを単に消すだけでよい
ということなら、下記のようにできますね。
 

Sub test2()
    Dim s As String
    Dim ss As String
    Dim ary, e
    Dim k As Long
    
    s = "///aaa(12)___aaa(334)\\\\aaa(556)___(78)\\\aaaXY"
    
    ary = Split(s, "aaa")
    For k = 0 To UBound(ary)
        e = ary(k)
        If Left(e, 1) = "(" Then
            e = Replace(e, "(", "", 1, 1)
            e = Replace(e, ")", "", 1, 1)
            ary(k) = e
        End If
    Next
    ss = Join(ary, "")
    
    Debug.Print ss  '出力は  ///12___334\\\\556___(78)\\\XY
End Sub

もし、aaaXYというケースがあり、その場合はaaaXYのまま残す前提なら、
上記test2は使えません。aaaは必ず消えるので。
 

ちなみに、aaaXYといったケースがあり、その場合はXYに置換するという前提なら、
前のコードに修正が必要です。
.Pattern = "(?:aaa\((\d+)\)|aaa)"
とします。
単にaaaXYはそのまま残すなら、修正不要です。

ちなみに、Nuboさんが提示してくださったコードは、予め(78)が分かっている前提でしょうか。
多数のケースがあり、事前に分からないケースが普通かななどと思ったりもしますが、
いかがですか?ふと気になったので。

回答
投稿日時: 22/05/21 17:56:33
投稿者: simple

test2のポイントは、
Replace関数は、引数Countを指定して、置換の回数に制限を掛けることができる点です。
マッチが複数個所あっても、一回だけ置換するといったことができるということです。
 
ちなみに、正規表現は1日2日では使いこなせない結構幅広い内容を持つ道具立てです。
(今回のレベルならさほど難しいことはありませんが)
ですので、普通はこれを使わないで済ませる方法があれば、それを使ったほうがよいでしょう。
複雑なテキスト処理では必要になる知識ですが、
そうした機が熟すまで待つということでよいと思います。
つまり、現時点で必須のものではないということです。
 
# Nuboさん、スレをお借りしました。

回答
投稿日時: 22/05/23 08:47:35
投稿者: TOM57

simpleさん、回答ありがとうございます。
色々なパターンを教えて頂いて助かります。
aaaの後()がつかないパターンはないと思っているので
初めに教えて頂いたパターンで大丈夫です。
 
正規表現、以前にも勉強しようとしたのですが、難しく…。
今回教えて頂いたのは理解できたのですが、違う問題が出てきたときには
まだまだ対応できそうにありません。
 
少しずつ理解できるよう頑張りたいと思います。
ありがとうございました。

回答
投稿日時: 22/05/23 11:17:45
投稿者: TOM57

度々すみません。教えてください。
  
aaa(334)←の括弧内に数値だけでなくアルファベット、記号等が入った場合は
下記のようにしたのですが、あってますでしょうか
 
.Pattern = "aaa\((.*?)\)"

回答
投稿日時: 22/05/23 11:58:51
投稿者: simple

質問の件は、大抵はそれでよろしいかと思います。
(カッコのなかに改行コードがあって二行にわたるなどという場合があれば確認してください。)
 
「正規表現 VBA」などで検索すると紹介記事がありますので、概要はそれで把握してください。
ただし、仕様などはやはりきちんとしたものを参照する習慣にしたほうがよいと思います。
お薦めは、こちらです。(VBScriptの正規表現についてのMSの原典を邦訳したものです)
https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc392149(v=msdn.10)
不明点がでてきたら、こちらで確認するとよいと思います。

回答
投稿日時: 22/05/23 12:02:53
投稿者: simple

urlの最後のカッコが抜けてしまうので、
いったんカッコ部分も含めてコピーしてからブラウズしてください。
(単にクリックだけだと、存在しないサイトとなりますので。)

回答
投稿日時: 22/05/23 12:11:24
投稿者: TOM57

 simpleさん
 
何度もすみませんでした。
確認したものの不安になって…
改行コード等は入らないようなので、大丈夫だと思います。
 
お勧めのサイトまで教えて頂き、ありがとうございます。
 
きちんと正規表現をマスターできるよう少しずつ勉強していきます。
 

回答
投稿日時: 22/05/23 17:25:45
投稿者: simple

文法を確認するための材料を示しましたが、
もちろんこれで随意に書けるというわけでもありません。
例に多く当たることが必要かと思います。
いろいろなパターンを紹介した記事がネット上にはあるでしょうから、
それらの所在を確認しておくとよいでしょう。まあ、おいおい学習してください。

投稿日時: 22/05/24 05:30:49
投稿者: Nubo

話題も付きたと思いますので閉じます。