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

回答編集履歴

3

コード追記

2021/11/08 23:42

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -42,4 +42,23 @@
42
42
  Worksheets(1).Range("H2").Resize(UBound(res)).Value = res
43
43
  End Sub
44
44
  ```
45
- こちらも2秒弱でした。
45
+ こちらも2秒弱でした。
46
+
47
+ 追記
48
+ ---
49
+ あれから少し気になったので、配列数式をコピーできないか試してみました。下記でできるようです。
50
+ ただし、365での確認ですので、古いバージョンのエクセルで実際にできるかは分かりません。
51
+
52
+ ```vba
53
+ Sub Test()
54
+ Dim lastRow As Long
55
+ With Worksheets(1)
56
+ lastRow = .Range("A2").End(xlDown).Row
57
+ .Range("h2").FormulaArray = "=INDEX(C2:G2,MATCH(MIN(ABS(C2:G2-B2)),ABS(C2:G2-B2),0))"
58
+ .Range("h2").Copy Destination:=.Range("h3:h" & lastRow)
59
+ With .Range("h2:h" & lastRow)
60
+ .Value = .Value
61
+ End With
62
+ End With
63
+ End Sub
64
+ ```

2

コード追記

2021/11/08 23:42

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -14,4 +14,32 @@
14
14
  ---
15
15
  追記
16
16
  Excel365で試したのでうまくいきましたが、スピル機能のないバージョンだとうまくいかないかも。
17
- その場合は、配列数式を手作業で入力してから、値貼り付けで値化するといいでしょう。
17
+ その場合は、配列数式を手作業で入力してから、値貼り付けで値化するといいでしょう。
18
+
19
+ ---
20
+
21
+ VBAでセル範囲のデータを配列に格納してループで走査する方法でやってみました。
22
+
23
+ ```vba
24
+ Sub test2()
25
+ Dim tbl() As Variant
26
+ tbl = Worksheets(1).Range("B2:G" & Worksheets(1).Range("A2").End(xlDown).Row).Value
27
+ Dim res() As Variant: ReDim res(1 To UBound(tbl), 1 To 1)
28
+ Dim r As Long, c As Long
29
+ For r = 1 To UBound(tbl)
30
+ Dim minDiff As Date, nearTime As Date
31
+ nearTime = tbl(r, 2)
32
+ minDiff = Abs(nearTime - tbl(r, 1))
33
+ For c = 3 To 6
34
+ Dim diff As Date: diff = Abs(tbl(r, c) - tbl(r, 1))
35
+ If minDiff > diff Then
36
+ minDiff = diff
37
+ nearTime = tbl(r, c)
38
+ End If
39
+ Next
40
+ res(r, 1) = nearTime
41
+ Next
42
+ Worksheets(1).Range("H2").Resize(UBound(res)).Value = res
43
+ End Sub
44
+ ```
45
+ こちらも2秒弱でした。

1

説明追記

2021/11/08 14:34

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -9,4 +9,9 @@
9
9
  End Sub
10
10
  ```
11
11
 
12
- 20万のサンプルデータを作成して計測してみましたが、2秒弱で終わりました。
12
+ 20万のサンプルデータを作成して計測してみましたが、2秒弱で終わりました。
13
+
14
+ ---
15
+ 追記
16
+ Excel365で試したのでうまくいきましたが、スピル機能のないバージョンだとうまくいかないかも。
17
+ その場合は、配列数式を手作業で入力してから、値貼り付けで値化するといいでしょう。