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

回答編集履歴

5

コード微修正

2020/08/21 11:44

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -77,7 +77,7 @@
77
77
  Dim pos As Long
78
78
  pos = InStrRev(FilePath, "\")
79
79
  If pos > 0 Then
80
- ConvExtRefer = Left(FilePath, pos - 1) & "[" & Mid(FilePath, pos + 1) & "]"
80
+ ConvExtRefer = Left(FilePath, pos) & "[" & Mid(FilePath, pos + 1) & "]"
81
81
  End If
82
82
  End Function
83
83
  ```

4

微修正

2020/08/21 11:44

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -81,7 +81,7 @@
81
81
  End If
82
82
  End Function
83
83
  ```
84
-
84
+ ---
85
85
  **コードの解説を少ししておきます。**
86
86
  まず、ワークシート関数の意味を理解しておきましょう。
87
87
  MATCHを使って一致する位置を検索する。一致する値がないとエラーを返す。
@@ -101,4 +101,4 @@
101
101
  シート上のセルをループで一つずつ参照する必要がない。
102
102
  ということです。この2つは重くなる二大原因ですので、これを回避できることで格段の高速化が可能になります。
103
103
 
104
- ---
104
+ ちみみに、セル結合があっても、MATCHでの検索は問題ないです。

3

説明追記

2020/08/12 14:08

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -45,7 +45,7 @@
45
45
 
46
46
  Sub hikaku3()
47
47
  Const conFormula = _
48
- "=IF(I1=""一致"",""一致"",IF(IFERROR(MATCH(G1,{外部参照}説明!C$1:C$1000,0),-1)=-1,""不一致"",""一致""))"
48
+ "=IF(I1=""一致"",""一致"",IF(ISNUMBER(MATCH(G1,{外部参照}説明!CC$1:CC$1000,0)),""不一致"",""一致""))"
49
49
 
50
50
  Books(0) = "C:\test\book0.xlsx"
51
51
  Books(1) = "C:\test\book1.xlsx"
@@ -82,7 +82,7 @@
82
82
  End Function
83
83
  ```
84
84
 
85
- コードの解説を少ししておきます。
85
+ **コードの解説を少ししておきます。**
86
86
  まず、ワークシート関数の意味を理解しておきましょう。
87
87
  MATCHを使って一致する位置を検索する。一致する値がないとエラーを返す。
88
88
  IFERRORでエラーを-1に変換。
@@ -99,4 +99,6 @@
99
99
  このように、式を使ってデータを参照する方法のメリットは、
100
100
  ブックを一つずつ開く必要がない。
101
101
  シート上のセルをループで一つずつ参照する必要がない。
102
- ということです。この2つは重くなる二大原因ですので、これを回避できることで格段の高速化が可能になります。
102
+ ということです。この2つは重くなる二大原因ですので、これを回避できることで格段の高速化が可能になります。
103
+
104
+ ---

2

説明追記

2020/08/12 14:03

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -62,7 +62,7 @@
62
62
  f = Replace(conFormula, "{外部参照}", ConvExtRefer(b))
63
63
  .Offset(, 1).Formula = f
64
64
  .Offset(, 1).Value = .Offset(, 1).Value
65
- .Offset(, 2).Value = .Offset(, 1).Value 'I列を作業列として使用
65
+ .Offset(, 2).Value = .Offset(, 1).Value 'I列に前の検索結果保存
66
66
  Next
67
67
  .Offset(, 2).Clear
68
68
  End With
@@ -80,6 +80,23 @@
80
80
  ConvExtRefer = Left(FilePath, pos - 1) & "[" & Mid(FilePath, pos + 1) & "]"
81
81
  End If
82
82
  End Function
83
+ ```
83
84
 
85
+ コードの解説を少ししておきます。
86
+ まず、ワークシート関数の意味を理解しておきましょう。
87
+ MATCHを使って一致する位置を検索する。一致する値がないとエラーを返す。
88
+ IFERRORでエラーを-1に変換。
89
+ IF関数でー1を"不一致"それいがいを"一致"に変換。
90
+ このようにワークシート関数を組み合わせて、検索結果から"不一致"、"一致"を返す式を作成します。
84
91
 
92
+ VBAでセル範囲に式を設定することは、
93
+ ユーザーがセル範囲の先頭セルに式を設定してから、セル範囲最後までフィルハンドルをドラッグして式を自動入力することと同じ意味になります(オートフィル機能)。
94
+
95
+ 式を設定して取得した値(一致、不一致)は、Valueで上書きすることで、式が値に変換されます。
96
+
97
+ あとは、{外部参照}の部分を、実際のファイルパスを外部参照式に変換したもので置き換えて、複数ファイルを参照できるようにしてます。
98
+
99
+ このように、式を使ってデータを参照する方法のメリットは、
85
- ```
100
+ ブックを一つずつ開く必要がない。
101
+ シート上のセルをループで一つずつ参照する必要がない。
102
+ ということです。この2つは重くなる二大原因ですので、これを回避できることで格段の高速化が可能になります。

1

コード追記

2020/08/12 13:08

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -18,7 +18,7 @@
18
18
  Sub hikaku1()
19
19
  Const conFormula = "=IF(IFERROR(MATCH(G1,パス[ブック名]説明!CC:CC,0),-1)=-1,""不一致"",""一致"")"
20
20
 
21
- Dim Path As sring
21
+ Dim Path As string
22
22
  Path = "C:\test\"
23
23
  Dim FileName As String
24
24
  FileName = "book.xlsx"
@@ -35,4 +35,51 @@
35
35
  ```
36
36
 
37
37
  とりあえず一つのファイルと比較する場合のコードです。
38
- これができることを確認できたら、ループで複数のファイルと比較するように修正していきましょう。
38
+ これができることを確認できたら、ループで複数のファイルと比較するように修正していきましょう。
39
+
40
+ ---
41
+ 配列に格納された複数ブックを検索して一致する値があるかチェックする場合のコード例
42
+
43
+ ```vba
44
+ Dim Books(200) As String 'ファイルのパスとブック名(book.xlsxなど)が合わさったものを格納
45
+
46
+ Sub hikaku3()
47
+ Const conFormula = _
48
+ "=IF(I1=""一致"",""一致"",IF(IFERROR(MATCH(G1,{外部参照}説明!C$1:C$1000,0),-1)=-1,""不一致"",""一致""))"
49
+
50
+ Books(0) = "C:\test\book0.xlsx"
51
+ Books(1) = "C:\test\book1.xlsx"
52
+ '・・・中略
53
+ Books(200) = "C:\test\book200.xlsx"
54
+
55
+ Application.ScreenUpdating = False
56
+ Application.Calculation = xlCalculationManual
57
+
58
+ With ThisWorkbook.Worksheets("イベント").Range("G1").CurrentRegion.Columns(1)
59
+ Dim b
60
+ For Each b In Books
61
+ Dim f As String
62
+ f = Replace(conFormula, "{外部参照}", ConvExtRefer(b))
63
+ .Offset(, 1).Formula = f
64
+ .Offset(, 1).Value = .Offset(, 1).Value
65
+ .Offset(, 2).Value = .Offset(, 1).Value 'I列を作業列として使用
66
+ Next
67
+ .Offset(, 2).Clear
68
+ End With
69
+
70
+ Application.Calculation = xlCalculationManual
71
+ Application.ScreenUpdating = True
72
+ End Sub
73
+
74
+ 'ファイルパスを外部参照式に変換
75
+ 'C:\test\book1.xlsx → C:\test[book1.xlsx]
76
+ Public Function ConvExtRefer(FilePath As Variant) As String
77
+ Dim pos As Long
78
+ pos = InStrRev(FilePath, "\")
79
+ If pos > 0 Then
80
+ ConvExtRefer = Left(FilePath, pos - 1) & "[" & Mid(FilePath, pos + 1) & "]"
81
+ End If
82
+ End Function
83
+
84
+
85
+ ```