回答編集履歴

2

コメント追記しました。

2017/01/16 23:27

投稿

Wolf
Wolf

スコア38

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
- Set mc = myReg.Execute(StrConv(r, vbLowerCase))
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

ご要望の一部を、マクロに反映しました。

2017/01/16 23:26

投稿

Wolf
Wolf

スコア38

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文字以上連続する数字の三つの塊が、「X」で繋がっているもの。
65
+ ' ※1文字以上連続する数字の三つの塊が、「x」で繋がっているもの。
52
66
 
53
67
 
54
68
 
55
- myReg.Pattern = "(\d+)X(\d+)X(\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
- i = i + 1
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
+ 参考になれば幸いです。