Board logo

標題: [發問] 為什麼VLOOKUP不能執行? [打印本頁]

作者: stevenliu555    時間: 2013-11-28 16:41     標題: 為什麼VLOOKUP不能執行?

請問:

為什麼附加檔案之下列VBA碼不能執行?
           iLo_St_Ret_Perf(j, i) = Application.WorksheetFunction.VLookup(iLo_St_Ret(j, i), data, 2, False)

[attach]16894[/attach]

謝謝。

stevenliu555
作者: GBKEE    時間: 2013-11-28 17:28

回復 1# stevenliu555

請查看這裡的 討論
  1. Sub MainProgram()
  2. Dim iWi_St_Ret(2 To 241, 1 To 5), iLo_St_Ret(2 To 241, 1 To 5) As Single
  3. Dim iWi_St_Ret_Perf(2 To 241, 1 To 5), iLo_St_Ret_Perf(2 To 241, 1 To 5) As Single
  4. Dim i, j, k, n As Integer
  5. Dim c, r As Integer
  6. Dim data As Range
  7. Dim A As Variant      '加這變數 ****

  8. iRowNo = Sheets("個股報酬率").Range("A65536").End(xlUp).Row
  9. iColumnNo = Sheets("個股報酬率").Range("HV1").End(xlToLeft).Column

  10. For j = 2 To iColumnNo
  11.     For i = 1 To 5
  12.         iWi_St_Ret_Perf(j, i) = 0
  13.         iLo_St_Ret_Perf(j, i) = 0
  14.         iWi_St_Ret(j, i) = Application.WorksheetFunction.Large(Range(Cells(2, j), Cells(iRowNo, j)), i)
  15.         iLo_St_Ret(j, i) = Application.WorksheetFunction.Small(Range(Cells(2, j), Cells(iRowNo, j)), i)
  16.         Set data = Range(Cells(j, 2), Cells(100, j + 1))
  17.         A = Application.VLookup(iWi_St_Ret(j, i), data, 2, False)
  18.         'A =>有找到傳回數值,反之 傳回錯誤值
  19.         iWi_St_Ret_Perf(j, i) = IIf(Not IsError(A), A, 0)
  20.         A = Application.VLookup(iLo_St_Ret(j, i), data, 2, False)
  21.         iLo_St_Ret_Perf(j, i) = IIf(Not IsError(A), A, 0)
  22.     Next i
  23. Next j
  24. End Sub
複製代碼

作者: stevenliu555    時間: 2013-11-28 21:37     標題: RE: 為什麼VLOOKUP不能執行?

回復 2# GBKEE
感謝指導,您的指導我了解了,但是我的疑問是為什麼下面這個VBA碼的A是錯誤
A = Application.VLookup(iLo_St_Ret(j, i), data, 2, False)
當j=2, i=1時,(iLo_St_Ret(j, i)= -5.2863,用VLOOKUP函數時,應該得到隔壁儲存格的3.2559
把它放在工作表的儲存格裡,它的值也是隔壁儲存格的3.2559

此檔案裡,我要寫的VBA是選取B欄第1大值,得到其右邊儲存格的值,然後選取B欄第1小值,得到其右邊儲存格的值,然後做其他計算,
然而第1大值得右邊儲存格的值有得到,第1小值得右邊儲存格的值沒有得到,不知道為什麼?

麻煩指導
作者: GBKEE    時間: 2013-11-29 08:21

本帖最後由 GBKEE 於 2013-11-29 09:57 編輯

回復 3# stevenliu555
工作表VLookup的範圍要用Double(雙精度浮點數)
原本程式中 iLo_St_Ret(2 To 241, 1 To 5) As Single(單精度浮點數) ,是所造成的錯誤的原因
  1. Sub MainProgram()
  2. 'Dim iWi_St_Ret(2 To 241, 1 To 5), iLo_St_Ret(2 To 241, 1 To 5) As Single  '只有iLo_St_Ret有指定型態
  3. 'Dim iWi_St_Ret_Perf(2 To 241, 1 To 5) As Single, iLo_St_Ret_Perf(2 To 241, 1 To 5) As Single  '都有指定型態

  4. Dim iWi_St_Ret() As Double  '雙精度浮點數
  5. Dim iLo_St_Ret() As Double  '() 動態陣列
  6. Dim iWi_St_Ret_Perf() As Double
  7. Dim iLo_St_Ret_Perf() As Double
  8. Dim i, j, k, n As Integer
  9. Dim c, r As Integer
  10. Dim data As Range
  11. iRowNo = Sheets("個股報酬率").Range("A65536").End(xlUp).Row
  12. iColumnNo = Sheets("個股報酬率").Range("HV1").End(xlToLeft).Column
  13. 'ReDim 陳述式  在程序層次中用來重新配置動態陣列變數的儲存空間。
  14. ReDim iWi_St_Ret(2 To iColumnNo, 1 To 5)
  15. ReDim iLo_St_Ret(2 To iColumnNo, 1 To 5)
  16. ReDim iWi_St_Ret_Perf(2 To iColumnNo, 1 To 5)
  17. ReDim iLo_St_Ret_Perf(2 To iColumnNo, 1 To 5)

  18. For j = 2 To iColumnNo
  19.     For i = 1 To 5
  20.         'iWi_St_Ret_Perf(j, i) = 0     '不必為0
  21.         'iLo_St_Ret_Perf(j, i) = 0
  22.        Debug.Print iWi_St_Ret(j, i)
  23.         iWi_St_Ret(j, i) = Application.WorksheetFunction.Large(Range(Cells(2, j), Cells(iRowNo, j)), i)
  24.         iLo_St_Ret(j, i) = Application.WorksheetFunction.Small(Range(Cells(2, j), Cells(iRowNo, j)), i)
  25.         'Set data = Range(Cells(j, 2), Cells(100, j + 1))  '另一錯誤點 Cells(j, 2)=>一直是B欄
  26.         'Set data = Range(Cells(2, j), Cells(100, j + 1))  '欄位隨著j
  27.         Set data = Range(Cells(2, j), Cells(iRowNo, j + 1)) '建議列位用 iRowNo
  28.         'Debug.Print data.Address             '可看看範圍
  29.         iWi_St_Ret_Perf(j, i) = Application.VLookup(iWi_St_Ret(j, i), data, 2, False)
  30.         iLo_St_Ret_Perf(j, i) = Application.VLookup(iLo_St_Ret(j, i), data, 2, False)
  31.     Next i
  32. Next j
  33. End Sub
複製代碼

作者: c_c_lai    時間: 2013-11-29 09:47

回復 4# GBKEE
陣列範圍超出索引範圍。
  1.     '  ReDim iWi_St_Ret(2 To iRowNo, 1 To 5)
  2.     '  ReDim iLo_St_Ret(2 To iRowNo, 1 To 5)
  3.     '  ReDim iWi_St_Ret_Perf(2 To iRowNo, 1 To 5)
  4.     '  ReDim iLo_St_Ret_Perf(2 To iRowNo, 1 To 5)
  5.     ReDim iWi_St_Ret(2 To iColumnNo, 1 To 5)
  6.     ReDim iLo_St_Ret(2 To iColumnNo, 1 To 5)
  7.     ReDim iWi_St_Ret_Perf(2 To iColumnNo, 1 To 5)
  8.     ReDim iLo_St_Ret_Perf(2 To iColumnNo, 1 To 5)
複製代碼

作者: GBKEE    時間: 2013-11-29 09:59

回復 5# c_c_lai
4#已更正,又掉芝麻了,感謝告知,
作者: stevenliu555    時間: 2013-11-29 16:36

回復 6# GBKEE
您好:

太好了,真的可以耶。感謝。

另外,再請教一點如下:
陣列數值如何貼上儲存格,例如,陣列kkk(1 to 5, 1 to 10)的數值, 如何儲存到range("A1:J5")內的儲存格?

謝謝
作者: GBKEE    時間: 2013-11-29 18:24

回復 7# stevenliu555
  1. Option Explicit
  2. Sub Ex()
  3. Dim Ar(1 To 5, 1 To 10)
  4.     Ar(1, 1) = 1   'Ar(1, 1)等同[A1:J5].Cells(1,1)
  5.     Ar(5, 10) = 50 'Ar(5, 10)等同[A1:J5].Cells(5,10)
  6.     [A1:J5].Cells(1, 1) = Ar(1, 1)
  7.     [A1:J5].Cells(5, 10) = Ar(5, 10)
  8.     '**************************
  9.     Stop
  10.     Ar(3, 5) = 25
  11.     [A1:J5].Clear
  12.     [A1:J5] = Ar
  13. End Sub
複製代碼

作者: stevenliu555    時間: 2013-11-30 08:00

您好:

太好了,感激指導。都OK了。




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)