返回列表 上一主題 發帖

[發問] 為什麼VLOOKUP不能執行?

[發問] 為什麼VLOOKUP不能執行?

請問:

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

每月報酬率 r2.zip (51.06 KB)

謝謝。

stevenliu555
Engr<i>[12]<strong>

您好:

太好了,感激指導。都OK了。
Engr<i>[12]<strong>

TOP

回復 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
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 6# GBKEE
您好:

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

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

謝謝
Engr<i>[12]<strong>

TOP

回復 5# c_c_lai
4#已更正,又掉芝麻了,感謝告知,
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 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)
複製代碼

TOP

本帖最後由 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
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

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小值得右邊儲存格的值沒有得到,不知道為什麼?

麻煩指導
Engr<i>[12]<strong>

TOP

回復 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
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

        靜思自在 : 盡多少本份,就得多少本事。
返回列表 上一主題