返回列表 上一主題 發帖

如何去找離自己最近的值?

如何去找離自己最近的值?

求值.rar (7.45 KB)
版上大大,請問如同附件中的檔案標示,如何函數尋找離自己最近的值去做相減呢?

回復 24# 准提部林


   我再試試看

TOP

本帖最後由 准提部林 於 2024-2-17 11:47 編輯

回復 23# 藍天麗池


檔案測不了//
可用另一方式:利用一儲存格(例如:V4)輸入陣列公式, 執行時用V4去COPY
    If Not Intersect(Target, [B5:B210000]) Is Nothing Then
       Range("V4").Copy Range("V" & Target.Row)

TOP

本帖最後由 藍天麗池 於 2024-2-15 21:40 編輯

回復 22# 准提部林

TEST.rar (806.63 KB) 這個
我自己猜想是裡面多個陣列相加減的原因,是不是要將陣列分開來相加減才不會出現錯誤,我另一個檔案把她拆開就沒事,但是不用VBA的方式直接打在儲存格上卻可以,我就覺得有點奇怪了

TOP

回復 21# 藍天麗池


上傳檔案看看~~

TOP

回復 19# 准提部林


        准大跟你請教一下,上次我根據你教我的第3點去錄製,之後執行程式,出現"無法設定種類range的formulaArray屬性"的錯誤訊息,以下是我的程式碼,是有哪邊出錯嗎?(出現錯誤的地方在Range("V" & Target.Row).FormulaArray這邊)

Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    If Not Intersect(Target, [B5:B210000]) Is Nothing Then
        Range("V" & Target.Row).FormulaArray = "=IF(AND(RC[-20]=R[-1]C[-20],RC[-19]=R[-1]C[-19],RC[-18]=R[-1]C[-18],RC[-17]=R[-1]C[-17],RC[-16]=R[-1]C[-16]),RC[-10]-R[-1]C[-10]+RC[-9]-R[-1]C[-9]+RC[-8]-R[-1]C[-8]+RC[-7]-R[-1]C[-7]+RC[-6]-R[-1]C[-6],IF(OR(R4C2:R[-1]C6=RC[-20]),RC[-10]-MOD(MAX((R4C2:R[-1]C6=RC[-20])*(ROW(R1C1:R[-4]C1)*10^5+R4C12:R[-1]C16)),10^5),0)+IF(OR(R4C2:R[-1]C6=RC[-19]),RC[-9]-MOD(MAX((R4C2:R[-1]C6=RC[-19])*(ROW(R1C1:R[-4]C1)*10^5+R4C12:R[-1]C16)),10^5),0)+IF(OR(R4C2:R[-1]C6=RC[-18]),RC[-8]-MOD(MAX((R4C2:R[-1]C6=RC[-18])*(ROW(R1C1:R[-4]C1)*10^5+R4C12:R[-1]C16)),10^5),0)+IF(OR(R4C2:R[-1]C6=RC[-17]),RC[-7]-MOD(MAX((R4C2:R[-1]C6=RC[-17])*(ROW(R1C1:R[-4]C1)*10^5+R4C12:R[-1]C16)),10^5),0)+IF(OR(R4C2:R[-1]C6=RC[-16]),RC[-6]-MOD(MAX((R4C2:R[-1]C6=RC[-16])*(ROW(R1C1:R[-4]C1)*10^5+R4C12:R[-1]C16)),10^5),0))"
      
     ElseIf Not Intersect(Target, [C5:C210000]) Is Nothing Then
        Range("W" & Target.Row).FormulaArray = "=IF(AND(RC[-16]=R[-1]C[-16],RC[-15]=R[-1]C[-15],RC[-14]=R[-1]C[-14],RC[-13]=R[-1]C[-13],RC[-12]=R[-1]C[-12]),RC[-6]-R[-1]C[-6]+RC[-5]-R[-1]C[-5]+RC[-4]-R[-1]C[-4]+RC[-3]-R[-1]C[-3]+RC[-2]-R[-1]C[-2],IF(OR(R4C7:R[-1]C11=RC[-16]),RC[-6]-MOD(MAX((R4C7:R[-1]C11=RC[-16])*(ROW(R1C1:R[-4]C1)*10^5+R4C17:R[-1]C21)),10^5),0)+IF(OR(R4C7:R[-1]C11=RC[-15]),RC[-5]-MOD(MAX((R4C7:R[-1]C11=RC[-15])*(ROW(R1C1:R[-4]C1)*10^5+R4C17:R[-1]C21)),10^5),0)+IF(OR(R4C7:R[-1]C11=RC[-14]),RC[-4]-MOD(MAX((R4C7:R[-1]C11=RC[-14])*(ROW(R1C1:R[-4]C1)*10^5+R4C17:R[-1]C21)),10^5),0)+IF(OR(R4C7:R[-1]C11=RC[-13]),RC[-3]-MOD(MAX((R4C7:R[-1]C11=RC[-13])*(ROW(R1C1:R[-4]C1)*10^5+R4C17:R[-1]C21)),10^5),0)+IF(OR(R4C7:R[-1]C11=RC[-12]),RC[-2]-MOD(MAX((R4C7:R[-1]C11=RC[-12])*(ROW(R1C1:R[-4]C1)*10^5+R4C17:R[-1]C21)),10^5),0))"
   End If
   Application.EnableEvents = True
        

End Sub

TOP

回復 19# 准提部林


    感謝准大的回覆,我再研究看看

TOP

本帖最後由 准提部林 於 2024-2-7 10:24 編輯

回復 17# 藍天麗池


2.這個陣列公式輸入完沒問題後,我再去點K2讓她呈現編輯狀態,
然後什麼都不改,在按ENTER,之後她會出現#VALUE,為啥{}會消失不見?又為啥自己加{}卻沒辦法有陣列的效果了呢?


只要點進儲存格, 不管裡面是空格/文字或公式, 它就達到 CHANGE 效果

問題(3)//點"錄製巨集" >> 點進公式編輯. 三鍵完成 > 停止錄製
公式對儲存格有"相對參照/絕對參照"之分, 在不同位置產生不同參照, 若不熟悉其運作, 使用錄製出來的程式碼較不會有問題~~

剛入EXCEL之門, 還是要自行多多GOOGLE, 或再多花時間看看論壇帖子吧!  
因為回答起來太花時間~~~回答了問題又會問更多///

TOP

本帖最後由 准提部林 於 2024-2-7 10:09 編輯

回復 17# 藍天麗池

觀察陣列公式, 得善用"F9", 以下公式逐一輸入至 K5, 在"編輯狀態"下, 按F9看看//
(1) =($C$1:$F4=C5)  按F9,
    可看到//{FALSE,FALSE,FALSE,FALSE;FALSE,TRUE,FALSE,FALSE;TRUE,FALSE,FALSE,FALSE;FALSE,FALSE,FALSE,FALSE}
(2) =($C$1:$F4=C5)*(ROW($A$1:$A4)*10^5+$G$1:$J4)
    //{0,0,0,0;0,200005,0,0;300012,0,0,0;0,0,0,0}

(3) =MAX(($C$1:$F4=C5)*(ROW($A$1:$A4)*10^5+$G$1:$J4)) ... 這時只會出現一個結果//300012...mod尾數12就是結果

在完整公式下,
=IF(OR($C$1:$F4=C5),G5-MOD(MAX(($C$1:$F4=C5)*(ROW($A$1:$A4)*10^5+$G$1:$J4)),10^5),"")
選取紅色字段, 再按F9, 即為(2)的結果

TOP

回復 14# 准提部林


    另外,准大我有些地方不太了解,我有用GPT先查了一下還是不太懂,在跟您請教一下

      1.MOD(MAX(($C$1:$F2=C3)*(ROW($A$1:$A2)*10^5+$G$1:$J2)),10^5) 這邊這串我不太了解它的原理MAX、ROW、MOD、10^5,這些分開我都看得懂,但合在一起我就不懂了,可以麻煩准大幫我說明一下嗎?
      
      2.這個陣列公式輸入完沒問題後,我再去點K2讓她呈現編輯狀態,然後什麼都不改,在按ENTER,之後她會出現#VALUE,為啥{}會消失不見?又為啥自己加{}卻沒辦法有陣列的效果了呢?

      3.也是同上面的問題,假如我有以下的程式碼,在這裡的部分要填入Range("V" & Target.Row).Formula = "{=IF(OR($C$1:$F1=C2),G2-MOD(MAX(($C$1:$F1=C2)*(ROW($A$1:$A1)*10^5+$G$1:$J1)),10^5),"")"},但又因為{}自己加會沒效果,那我程式碼又應該如何更改呢?

Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    If Not Intersect(Target, [B5:B210000]) Is Nothing Then
        Range("V" & Target.Row).Formula = "這裡"
      
     ElseIf Not Intersect(Target, [C5:C210000]) Is Nothing Then
        Range("W" & Target.Row).Formula = "這裡"
   End If
   Application.EnableEvents = True
        

End Sub

准大抱歉,問題比較多,想說這個論壇有很多厲害的前輩在,想多多學習,還請准大不吝賜教

TOP

        靜思自在 : 一個人不怕錯,就怕不改過,改過並不難。
返回列表 上一主題