回答編集履歴
3
コード追記
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
コード追記
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
説明追記
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
|
+
その場合は、配列数式を手作業で入力してから、値貼り付けで値化するといいでしょう。
|