回答編集履歴
2
コメント追記しました。
test
CHANGED
@@ -11,6 +11,14 @@
|
|
11
11
|
|
12
12
|
|
13
13
|
※他の方が回答されているように、Split関数で分割する方法のほうが、わかりやすいかもしれません。
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
※高さが無い場合について、このマクロは本質的に対応できていません。従って実務においては、他の方が
|
18
|
+
|
19
|
+
提示されたSplit関数を使用されるほうがよいとおもいます。ただし正規表現も、覚えておけば絶対に
|
20
|
+
|
21
|
+
損はしないと思いますので、この機会に是非挑戦してみてください。
|
14
22
|
|
15
23
|
|
16
24
|
|
@@ -64,6 +72,12 @@
|
|
64
72
|
|
65
73
|
' ※1文字以上連続する数字の三つの塊が、「x」で繋がっているもの。
|
66
74
|
|
75
|
+
' ※「\d」は、数字を表しています。「+」は、直前の文字が1回以上連続していることを意味しています。
|
76
|
+
|
77
|
+
' ※従って、\d+は、1回以上連続する数字をあらわすことになります。
|
78
|
+
|
79
|
+
' ※これを()で括ることによって、のちほど取り出すことができるようになります。
|
80
|
+
|
67
81
|
|
68
82
|
|
69
83
|
myReg.Pattern = "(\d+)x(\d+)x(\d+)"
|
@@ -82,9 +96,23 @@
|
|
82
96
|
|
83
97
|
|
84
98
|
|
85
|
-
|
99
|
+
' Executeメソッドを用いて、対象となる文字列がパターンに一致した場合、それを
|
86
100
|
|
101
|
+
' Matchコレクションに格納します。要は、後で使えるようにしています。
|
102
|
+
|
103
|
+
' 半角数字も存在するとのことで、StrConv(r, vbLowerCase + vbNarrow)としました。
|
104
|
+
|
105
|
+
' mc(0)となっているのは、パターンに合うものが各文字列に一つしかないためです。
|
106
|
+
|
107
|
+
' 一つの文字列に、パターンに合うものが複数ある場合は、mc(1),mc(2)と続きます。
|
108
|
+
|
109
|
+
' パターンにマッチした場合、一つ目の()がSubmatches(0)となります。後は同じ要領です。
|
110
|
+
|
111
|
+
|
112
|
+
|
113
|
+
Set mc = myReg.Execute(StrConv(r, vbLowerCase + vbNarrow))
|
114
|
+
|
87
|
-
If myReg.test(StrConv(r, vbLowerCase)) Then
|
115
|
+
If myReg.test(StrConv(r, vbLowerCase + vbNarrow)) Then
|
88
116
|
|
89
117
|
buf(i, 1) = mc(0).submatches(2)
|
90
118
|
|
1
ご要望の一部を、マクロに反映しました。
test
CHANGED
@@ -1,4 +1,16 @@
|
|
1
1
|
関数でも可能ですが、関数以外をご希望とのことで、サンプルをご紹介します。
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
※コメントを受けて、一部修正しました。
|
6
|
+
|
7
|
+
修正点1.xの大文字小文字不問(混在も可)
|
8
|
+
|
9
|
+
修正点2.パターンにマッチしない場合、配列に空欄をセット
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
※他の方が回答されているように、Split関数で分割する方法のほうが、わかりやすいかもしれません。
|
2
14
|
|
3
15
|
|
4
16
|
|
@@ -19,6 +31,8 @@
|
|
19
31
|
Dim buf As Variant ' データ格納用配列
|
20
32
|
|
21
33
|
Dim i As Long ' ループカウント用
|
34
|
+
|
35
|
+
Dim j As Integer ' ループカウント用
|
22
36
|
|
23
37
|
|
24
38
|
|
@@ -48,11 +62,11 @@
|
|
48
62
|
|
49
63
|
' パターン定義
|
50
64
|
|
51
|
-
' ※1文字以上連続する数字の三つの塊が、「
|
65
|
+
' ※1文字以上連続する数字の三つの塊が、「x」で繋がっているもの。
|
52
66
|
|
53
67
|
|
54
68
|
|
55
|
-
myReg.Pattern = "(\d+)
|
69
|
+
myReg.Pattern = "(\d+)x(\d+)x(\d+)"
|
56
70
|
|
57
71
|
|
58
72
|
|
@@ -68,9 +82,9 @@
|
|
68
82
|
|
69
83
|
|
70
84
|
|
71
|
-
Set mc = myReg.Execute(r)
|
85
|
+
Set mc = myReg.Execute(StrConv(r, vbLowerCase))
|
72
86
|
|
73
|
-
If myReg.test(r) Then
|
87
|
+
If myReg.test(StrConv(r, vbLowerCase)) Then
|
74
88
|
|
75
89
|
buf(i, 1) = mc(0).submatches(2)
|
76
90
|
|
@@ -78,9 +92,17 @@
|
|
78
92
|
|
79
93
|
buf(i, 3) = mc(0).submatches(0)
|
80
94
|
|
95
|
+
Else
|
96
|
+
|
81
|
-
|
97
|
+
For j = 1 To 3
|
98
|
+
|
99
|
+
buf(i, j) = ""
|
100
|
+
|
101
|
+
Next j
|
82
102
|
|
83
103
|
End If
|
104
|
+
|
105
|
+
i = i + 1
|
84
106
|
|
85
107
|
|
86
108
|
|
@@ -108,4 +130,6 @@
|
|
108
130
|
|
109
131
|
```
|
110
132
|
|
133
|
+
|
134
|
+
|
111
|
-
|
135
|
+
参考になれば、幸いです。
|