回答編集履歴
2
コメント追記しました。
answer
CHANGED
@@ -6,6 +6,10 @@
|
|
6
6
|
|
7
7
|
※他の方が回答されているように、Split関数で分割する方法のほうが、わかりやすいかもしれません。
|
8
8
|
|
9
|
+
※高さが無い場合について、このマクロは本質的に対応できていません。従って実務においては、他の方が
|
10
|
+
提示されたSplit関数を使用されるほうがよいとおもいます。ただし正規表現も、覚えておけば絶対に
|
11
|
+
損はしないと思いますので、この機会に是非挑戦してみてください。
|
12
|
+
|
9
13
|
```VBA
|
10
14
|
Sub Sample()
|
11
15
|
|
@@ -31,6 +35,9 @@
|
|
31
35
|
|
32
36
|
' パターン定義
|
33
37
|
' ※1文字以上連続する数字の三つの塊が、「x」で繋がっているもの。
|
38
|
+
' ※「\d」は、数字を表しています。「+」は、直前の文字が1回以上連続していることを意味しています。
|
39
|
+
' ※従って、\d+は、1回以上連続する数字をあらわすことになります。
|
40
|
+
' ※これを()で括ることによって、のちほど取り出すことができるようになります。
|
34
41
|
|
35
42
|
myReg.Pattern = "(\d+)x(\d+)x(\d+)"
|
36
43
|
|
@@ -40,8 +47,15 @@
|
|
40
47
|
|
41
48
|
For Each r In myRng
|
42
49
|
|
50
|
+
' Executeメソッドを用いて、対象となる文字列がパターンに一致した場合、それを
|
51
|
+
' Matchコレクションに格納します。要は、後で使えるようにしています。
|
52
|
+
' 半角数字も存在するとのことで、StrConv(r, vbLowerCase + vbNarrow)としました。
|
53
|
+
' mc(0)となっているのは、パターンに合うものが各文字列に一つしかないためです。
|
54
|
+
' 一つの文字列に、パターンに合うものが複数ある場合は、mc(1),mc(2)と続きます。
|
55
|
+
' パターンにマッチした場合、一つ目の()がSubmatches(0)となります。後は同じ要領です。
|
56
|
+
|
43
|
-
Set mc = myReg.Execute(StrConv(r, vbLowerCase))
|
57
|
+
Set mc = myReg.Execute(StrConv(r, vbLowerCase + vbNarrow))
|
44
|
-
If myReg.test(StrConv(r, vbLowerCase)) Then
|
58
|
+
If myReg.test(StrConv(r, vbLowerCase + vbNarrow)) Then
|
45
59
|
buf(i, 1) = mc(0).submatches(2)
|
46
60
|
buf(i, 2) = mc(0).submatches(1)
|
47
61
|
buf(i, 3) = mc(0).submatches(0)
|
1
ご要望の一部を、マクロに反映しました。
answer
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
関数でも可能ですが、関数以外をご希望とのことで、サンプルをご紹介します。
|
2
2
|
|
3
|
+
※コメントを受けて、一部修正しました。
|
4
|
+
修正点1.xの大文字小文字不問(混在も可)
|
5
|
+
修正点2.パターンにマッチしない場合、配列に空欄をセット
|
6
|
+
|
7
|
+
※他の方が回答されているように、Split関数で分割する方法のほうが、わかりやすいかもしれません。
|
8
|
+
|
3
9
|
```VBA
|
4
10
|
Sub Sample()
|
5
11
|
|
@@ -9,6 +15,7 @@
|
|
9
15
|
Dim mc As Object ' Match Case
|
10
16
|
Dim buf As Variant ' データ格納用配列
|
11
17
|
Dim i As Long ' ループカウント用
|
18
|
+
Dim j As Integer ' ループカウント用
|
12
19
|
|
13
20
|
' 正規表現使用準備
|
14
21
|
|
@@ -23,9 +30,9 @@
|
|
23
30
|
ReDim buf(1 To myRng.Count, 1 To 3)
|
24
31
|
|
25
32
|
' パターン定義
|
26
|
-
' ※1文字以上連続する数字の三つの塊が、「
|
33
|
+
' ※1文字以上連続する数字の三つの塊が、「x」で繋がっているもの。
|
27
34
|
|
28
|
-
myReg.Pattern = "(\d+)
|
35
|
+
myReg.Pattern = "(\d+)x(\d+)x(\d+)"
|
29
36
|
|
30
37
|
' ループ処理
|
31
38
|
|
@@ -33,13 +40,17 @@
|
|
33
40
|
|
34
41
|
For Each r In myRng
|
35
42
|
|
36
|
-
Set mc = myReg.Execute(r)
|
43
|
+
Set mc = myReg.Execute(StrConv(r, vbLowerCase))
|
37
|
-
If myReg.test(r) Then
|
44
|
+
If myReg.test(StrConv(r, vbLowerCase)) Then
|
38
45
|
buf(i, 1) = mc(0).submatches(2)
|
39
46
|
buf(i, 2) = mc(0).submatches(1)
|
40
47
|
buf(i, 3) = mc(0).submatches(0)
|
48
|
+
Else
|
41
|
-
|
49
|
+
For j = 1 To 3
|
50
|
+
buf(i, j) = ""
|
51
|
+
Next j
|
42
52
|
End If
|
53
|
+
i = i + 1
|
43
54
|
|
44
55
|
Next
|
45
56
|
|
@@ -53,4 +64,5 @@
|
|
53
64
|
|
54
65
|
End Sub
|
55
66
|
```
|
67
|
+
|
56
|
-
|
68
|
+
参考になれば、幸いです。
|