teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

コメント追記しました。

2017/01/16 23:27

投稿

Wolf
Wolf

スコア38

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

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

2017/01/16 23:26

投稿

Wolf
Wolf

スコア38

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