返回列表 上一主題 發帖

[發問] 如何在match中引用2維陣列

回復 8# c_c_lai


#REF與儲存格參照有關, 應與自訂函數無關, 若K4也是同公式卻可正常顯示, 就要查看看原因?
自訂函數大致與一般公式類似, 只是提供參數或儲存範圍讓程式去運算~~

TOP

本帖最後由 c_c_lai 於 2015-12-8 10:24 編輯

回復 3# 准提部林
請教版大,
請問我在K11欄內輸入  =get_wl(B$3:E$11,H4,I4)
為何會出現 #REF! 字樣?
自訂函數在 Excel 要如何設定其定義讓它能被引用?
P.S. 真不好意思我對 Excel  如何使用內在函數,以及
       自訂函數 (Function) 如何在欄內應用方面所知有限。
謝謝您指教!

TOP

回復 5# yen956
我將准提部林版大的自訂函數稍稍修改了一些,
你用 [F8] 去 Debug 一次,便會全盤明瞭了。
我將結果改寫到 K 欄,以便你進行比對寫入值。
  1. '  自訂函數,彈性較好些:  By 准提部林
  2. '  J4.公式:=get_wl(B$3:E$11,H4,I4)
  3. Function GET_WL(xA As Variant, Va As Range, Vb As Range) As String
  4.     Dim Arr, AA, j&, Jm%, T$
  5.    
  6.     Arr = xA
  7.     For j = 1 To UBound(Arr)
  8.         If Arr(j, 2) <> "" Then
  9.             Jm = 0:  AA = Split(Arr(j, 2) & "~", "~")
  10.             If Va > Val(AA(0)) And Va <= Val(AA(1)) Then T = Arr(j, 1): Jm = 1
  11.         End If
  12.         If Jm = 1 Then
  13.             AA = Split(Arr(j, 4) & "~", "~")
  14.             If Vb > Val(AA(0)) And Vb <= Val(AA(1)) Then GET_WL = T & "_" & Arr(j, 3): Exit For
  15.         End If
  16.     Next j
  17. End Function

  18. Sub Ex()
  19.     Dim cts As Integer
  20.    
  21.     For cts = 0 To 5
  22.        [K4].Offset(cts) = GET_WL(Range("B$3:E$11"), [H4].Offset(cts), [I4].Offset(cts))
  23.     Next cts
  24. End Sub
複製代碼

TOP

回復 5# yen956



Index 函數可以忽略第三參數,只取出某 row 成為一維陣列
但因原本該函數是設計給工作表 Range 用 , 故須注意 :
1. 二維陣列 row 數不可超過65536
2. 取出的一維陣列,index是由1開始而不是0
3. 二維陣列過大時,該函數效率很差。
表達不清、題意不明確、沒附檔案格式、沒有討論問題的態度~~~~~~以上愛莫能助。

TOP

本帖最後由 yen956 於 2015-12-7 10:27 編輯

自言自語:
雖然在監看視窗中, 可以看得到二維陣列arL()
的一維表示式:arL(0),arL(1),..
但在VBA中郤不能使用arL(0),arL(1),..的表示式,
(會出現索引超出範圍的錯誤!)
故,二維陣列若要給match引用,還是要轉成一維陣列,
似無法精簡.
(當然, 准大的VBA非當精簡,又提供另一思路, 真的很不錯)

陣列索引.jpg

TOP

回復 3# 准提部林
謝謝准大, 非常好用又精簡的VBA,
正在用剛學來的監看視窗研究中,
對於如何使用2維陣列中的某一陣列的表達式
也在大大的這個VBA中得到解答, 謝謝!!

TOP

Function GET_WL(xA, Va, Vb) As String
Dim Arr, AA, j&, Jm%, T$
Arr = xA.Value
For j = 1 To UBound(Arr)
  If Arr(j, 2) <> "" Then
    Jm = 0:  AA = Split(Arr(j, 2) & "~", "~")
    If Va > Val(AA(0)) And Va <= Val(AA(1)) Then T = Arr(j, 1): Jm = 1
  End If
  If Jm = 1 Then
    AA = Split(Arr(j, 4) & "~", "~")
    If Vb > Val(AA(0)) And Vb <= Val(AA(1)) Then GET_WL = T & "_" & Arr(j, 3): Exit For
  End If
Next j
End Function

=============================
另一參考,自訂函數,彈性較好些:
J4.公式:=get_wl(B$3:E$11,H4,I4)

TOP

Sorry, 應該放在程式區才對, 只好將錯就錯!!

TOP

        靜思自在 : 好事要提得起,是非要放得下,成就別人即是成就自己。
返回列表 上一主題