返回列表 上一主題 發帖

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

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

本帖最後由 yen956 於 2015-12-6 13:16 編輯

下列VBA中,有一段match須引用1維陣列,
故先將2維陣列先轉成1維陣列再引用(紅色部分),
請問紅色部分如何正確引用(如何精簡)?
  1. Public arW, arL
  2. '取得寛度與長度界限的陣列, 供Match用
  3. Sub init()
  4.     ReDim arW(3) As Integer
  5.     ReDim arL(3, 3) As Integer
  6.     Dim W1 As Integer, L1 As Integer
  7.     arW(0) = Split(Cells(3, 3), "~")(1)    '寛度的上限
  8.     For W1 = 0 To 2
  9.         arW(W1 + 1) = Split(Cells(W1 * 3 + 3, 3), "~")(0) '寛度按降冪排
  10.         For L1 = 0 To 2
  11.             arL(W1, L1) = Split(Cells(W1 * 3 + L1 + 3, 5), "~")(0)   '長度按升冪排
  12.         Next
  13.         arL(W1, L1) = Split(Cells(W1 * 3 + L1 + 2, 5), "~")(1)     '長度的上限
  14.     Next
  15. End Sub

  16. Private Sub CommandButton1_Click()
  17.     Dim I As Integer, J As Integer, arL2(3) As Integer
  18.     Dim MHW, MHL, IDW As String, IDL As String
  19.     init
  20.     For I = 4 To [G4].End(xlDown).Row
  21.         MHW = Application.Match(Cells(I, 8), arW, -1)
  22.         IDW = Application.Index([B1:B11], MHW * 3, 1)
  23. [color=Red]        For J = 0 To 3
  24.             arL2(J) = arL(MHW - 1, J)    '將2維陣列轉為1維陣列
  25.         Next
  26.         MHL = Application.Match(Cells(I, 9), arL2, 1)[/color]
  27.         '長度代號分[D3:D5,D6:D9,D10:D12]三區
  28.         IDL = Application.Index([D3:D5,D6:D8,D9:D11], MHL, 1, MHW)
  29.         Cells(I, 10) = IDW & "_" & IDL
  30.     Next
  31. End Sub
複製代碼
(註:VBA可正常運作)
       For J = 0 To 3
            arL2(J) = arL(MHW - 1, J)    '將2維陣列轉為1維陣列
        Next
        MHL = Application.Match(Cells(I, 9), arL2, 1)

多條件判斷編製名稱1206.rar (11.7 KB)

回復 7# c_c_lai
c大你好:
准大的function本來就相當不錯,
我的主題:如何將2維陣列化為1維陣列供 Match 用,
已在6#得到stillfish00大大的指導,
謝謝c大一再指導, 謝謝!!

TOP

回復 6# stillfish00
謝謝stillfish00大大:
原來用 array + index就可以化2維陣列為1維陣列,
不必用For ...next轉換, 真是太好了, 謝謝!!

TOP

本帖最後由 c_c_lai 於 2015-12-8 14:59 編輯

回復 15# 准提部林
觀察前後檔案存檔後之的 Icon 顯示:
F.png
您提及的狀況也極有可能,謝謝您!

TOP

回復 14# c_c_lai


是否可能 get_wl 已用在〔定義名稱〕,才會產生#REF~~

TOP

回復 13# 准提部林
終於問題解決了,剛剛重新從#1下載
便直接做結果 OK了,再回到原先有問題的先前
問題檔案,怎麼做怎麼錯,極有可能那支檔案
裡有潛在問題,不管它了!
謝謝您耐心地回覆,再次謝謝!

TOP

回復 12# c_c_lai


=get_wl(B$3:E$11,H4,J4)  > =get_wl(B$3:E$11,H4,I4)

第三個參數在i欄,
不過就算用J4,公式結果為空白(因無符合區間值),也不會有#REF或#Value錯誤,
會不會是版本問題?(我是2000)

TOP

回復 11# 准提部林
能否幫我檢查看看,到底差異性在哪裡?
謝謝您!
多條件判斷編製名稱1206_v0.rar (15.5 KB)

TOP

回復 10# c_c_lai


參考檔:
多條件判斷編製名稱1206_v01.rar (9.08 KB)

若還有問題,可將檔案上傳!!

TOP

本帖最後由 c_c_lai 於 2015-12-8 13:21 編輯

回復 9# 准提部林
謝謝您回覆,我使用您#3樓的程式
測的手都軟了,還是一樣 (無論是在任何欄位,包含J4)
依然是 #REF!。甚至寫了兩支測試程式,都 PASS:
  1. Function AddCol(h, i) As String
  2.     AddCol = h + i
  3. End Function

  4. Function AddCol2(w, h, i) As String  '  故意帶入 w 參數
  5.     AddCol2 = h + i
  6. End Function
複製代碼

唯獨 =get_wl(B$3:E$11,H4,J4) 不行:

問題應該出在程式碼內部無法參照到 B$3:E$11,
但用 VBA 檢測也找不出問題點。

TOP

        靜思自在 : 人生不一定球球是好球,但是有歷練的強打者,隨時都可以揮棒。
返回列表 上一主題