Here's one alternative:
Private Sub Workbook_Open()
BuildMKR
End Sub
Option Explicit
Public MKRTable As Variant
Sub BuildMKR()
MKRTable = Array(WorksheetFunction.Transpose(Sheets("markers").Range("E6:e25").Value), WorksheetFunction.Transpose(Sheets("markers").Range("F6:F25").Value), WorksheetFunction.Transpose(Sheets("markers").Range("C6:C25").Value))
MKRTable = WorksheetFunction.Transpose(MKRTable)
End Sub
Option Base 1
Public Function WName(ByVal XCP As Range, ByVal YCP As Range, ByVal SD As String) As String
Dim i As Long, _
n As Long, _
Nmin As Long, _
Nmax As Long, _
MinIndex As Long, _
Dist As Single, _
MinDist As Single
'Initialize constants corresponding to columns in MRKTable
Const XMKR As Long = 1
Const YMKR As Long = 2
Const WMKR As Long = 3
If IsEmpty(MKRTable) Then Call BuildMKR
Select Case SD
Case Is = "TsdA"
Nmin = Range("markers!$B$2")
Nmax = Range("markers!$B$3")
Debug.Print "comment case A "; SD; Nmin; Nmax
Case Is = "TsdB"
Nmin = Range("markers!$C$2")
Nmax = Range("markers!$C$3")
Debug.Print "comment case B "; SD; Nmin; Nmax
End Select
MinDist = Sqr((XCP - MKRTable(Nmin, XMKR)) ^ 2 + (YCP - MKRTable(Nmin, YMKR)) ^ 2)
MinIndex = Nmin
For n = Nmin + 1 To Nmax
'Debug.Print "n = "; n
Dist = Sqr((XCP - MKRTable(n, XMKR)) ^ 2 + (YCP - MKRTable(n, YMKR)) ^ 2)
If Dist < MinDist Then
MinDist = Dist
MinIndex = n
End If
If MinDist = 0 Then
Exit For
End If
Next n
If MinDist > 3 Then
MKRTable(MinIndex, WMKR) = "DISTerr>3m"
End If
WName = MKRTable(MinIndex, WMKR)
End Function
Bookmarks