Option Explicit
Sub 運用輸入窗找A欄最接近數字並在儲存格變黃底色_1()
Dim Brr, T1, Y, A#, T#, i&, xA As Range, xR, U As Range
'↑宣告變數 (Brr, T1, Y)是通用變數,(A,T)是有小數點雙精度數字,(i)是長整數,(xA,xR)是儲存格
Set Y = CreateObject("Scripting.Dictionary")
'↑令 Y是字典
xR = InputBox("請輸入查詢最接近數字的基準數字(可有小數點)", "查A欄最接近數字", 4786)
'↑令xR 是傳回在對話方塊中輸入的資訊(對話方塊提示文字,對話方塊左上角文字,輸入窗預設文字)
If IsNumeric(xR) = False Then MsgBox "非數字無法執行!": Exit Sub
'↑如果xR 這輸入的文字經判斷不是數字,就顯示提視窗,操作者按確定後 結束程式執行
Set xA = Range([A1], Cells(Rows.Count, "A").End(xlUp))
'↑令xA 是[A1]到A欄最後一個有內容儲存格之間的存格(物件)
xA.Interior.ColorIndex = xlNone
'↑令xA 的底色是無色
Brr = xA
'↑令是陣列! 倒入xA儲存格的值
For i = 1 To UBound(Brr)
'↑設順迴圈!從1 到 Brr陣列縱向最大列號
If IsNumeric(Brr(i, 1)) = False Or Brr(i, 1) = "" Then GoTo 111
'↑如果迴圈Brr陣列值經過判斷:不是數字 或 是空字元!就跳到 111位置繼續執行
Set U = Cells(i, 1)
'↑令U 是物件(迴圈儲存格)
T = Abs(Brr(i, 1) - xR)
'↑令T 是 (迴圈Brr陣列值 - 基準數字)經過絕對值運算的數字
T1 = T & "|"
'↑令T1 是T連接 "|"符號的字串
If InStr(Y(T), Brr(i, 1) & " ") = 0 Then
'↑用T變數 當key查Y字典item,如果item裡面沒有包含 (迴圈Brr陣列值連接" "空白字)的字串
Y(T) = IIf(Y.Exists(T) = Empty, " ", Y(T) & " " & Brr(i, 1))
'↑用T變數當key,IIf判斷式回傳的值當item
'IIf判斷式:用T變數當key查察Y字典裡的item是不是初始值!,
'若正確(" "),否則(Y(T) & " " & Brr(i, 1))
End If
If Y.Exists(T1) = Empty Then
'↑如果用T1變數當key查察Y字典是初始值
Set Y(T1) = U
'↑令T1變數當key,item是 是物件(迴圈儲存格)!放入Y字典裡
Else
Set Y(T1) = Union(Y(T1), U)
'↑否則!令Y字典裡key是T1變數的item再納入 物件(迴圈儲存格)!
'成為儲存格集
End If
111
Next
A = WorksheetFunction.Min(Y.KEYS)
'↑令A 是Y字典裡面key的 最小值
Y(A & "|").Interior.ColorIndex = 6
'↑用 最小值連接 "|"符號當key查察Y字典裡的item,令item的底色是 黃色
MsgBox Y(A)
'↑用 最小值當key查察Y字典裡的item!在提示窗顯示
Set Brr = Nothing
Set Y = Nothing
'↑令Brr,Y 這兩容器從記憶體裡釋放掉!
End Sub作者: Andy2483 時間: 2022-12-1 14:11
Option Explicit
Function 最接近數字(基準數字 As Double, 大或小 As String, 範圍 As Range)
Dim Brr, T1, Y, A#, T#, i&, xA As Range, xR, U As Range, M
'↑宣告變數 (Brr, T1, Y)是通用變數,(A,T)是有小數點雙精度數字,(i)是長整數,(xA,xR)是儲存格
Application.Volatile
'↑將使用者定義的函數標示為易變。
'每當工作表上任何儲存格發生計算時,都必須重新計算易變函數。
Set Y = CreateObject("Scripting.Dictionary")
'↑令 Y是字典
xR = 基準數字
If IsNumeric(xR) = False Then MsgBox "非數字無法執行!": Exit Function
'↑如果xR 這輸入的文字經判斷不是數字,就顯示提視窗,操作者按確定後 結束程式執行
Set xA = 範圍
'↑令xA 是[A1]到A欄最後一個有內容儲存格之間的存格(物件)
Brr = xA
'↑令是陣列! 倒入xA儲存格的值
M = 大或小
For i = 1 To UBound(Brr)
'↑設順迴圈!從1 到 Brr陣列縱向最大列號
If IsNumeric(Brr(i, 1)) = False Or Brr(i, 1) = "" Then GoTo 111
'↑如果迴圈Brr陣列值經過判斷:不是數字 或 是空字元!就跳到 111位置繼續執行
Set U = Cells(i, 1)
'↑令U 是物件(迴圈儲存格)
T = Brr(i, 1) - xR
If (M = "小" And T > 0) Or (M = "大" And T < 0) Then GoTo 111
'↑令T 是 (迴圈Brr陣列值 - 基準數字)經過絕對值運算的數字
If InStr(Y(T), Brr(i, 1) & " ") = 0 Then
'↑用T變數 當key查Y字典item,如果item裡面沒有包含 (迴圈Brr陣列值連接" "空白字)的字串
Y(T) = IIf(Y.Exists(T) = Empty, "", Brr(i, 1))
End If
111
Next
If M = "小" Then
A = WorksheetFunction.Max(Y.KEYS)
'↑令A 是Y字典裡面key的 最大值
ElseIf M = "大" Then
A = WorksheetFunction.Min(Y.KEYS)
'↑令A 是Y字典裡面key的 最小值
End If
最接近數字 = Y(A)
'↑用 最小值當key查察Y字典裡的item!在提示窗顯示
Set Brr = Nothing
Set Y = Nothing
'↑令Brr,Y 這兩容器從記憶體裡釋放掉!
End Function