標題:
[發問]
為什麼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
請查看這裡的 討論
Sub MainProgram()
Dim iWi_St_Ret(2 To 241, 1 To 5), iLo_St_Ret(2 To 241, 1 To 5) As Single
Dim iWi_St_Ret_Perf(2 To 241, 1 To 5), iLo_St_Ret_Perf(2 To 241, 1 To 5) As Single
Dim i, j, k, n As Integer
Dim c, r As Integer
Dim data As Range
Dim A As Variant '加這變數 ****
iRowNo = Sheets("個股報酬率").Range("A65536").End(xlUp).Row
iColumnNo = Sheets("個股報酬率").Range("HV1").End(xlToLeft).Column
For j = 2 To iColumnNo
For i = 1 To 5
iWi_St_Ret_Perf(j, i) = 0
iLo_St_Ret_Perf(j, i) = 0
iWi_St_Ret(j, i) = Application.WorksheetFunction.Large(Range(Cells(2, j), Cells(iRowNo, j)), i)
iLo_St_Ret(j, i) = Application.WorksheetFunction.Small(Range(Cells(2, j), Cells(iRowNo, j)), i)
Set data = Range(Cells(j, 2), Cells(100, j + 1))
A = Application.VLookup(iWi_St_Ret(j, i), data, 2, False)
'A =>有找到傳回數值,反之 傳回錯誤值
iWi_St_Ret_Perf(j, i) = IIf(Not IsError(A), A, 0)
A = Application.VLookup(iLo_St_Ret(j, i), data, 2, False)
iLo_St_Ret_Perf(j, i) = IIf(Not IsError(A), A, 0)
Next i
Next j
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(單精度浮點數) ,是所造成的錯誤的原因
Sub MainProgram()
'Dim iWi_St_Ret(2 To 241, 1 To 5), iLo_St_Ret(2 To 241, 1 To 5) As Single '只有iLo_St_Ret有指定型態
'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 '都有指定型態
Dim iWi_St_Ret() As Double '雙精度浮點數
Dim iLo_St_Ret() As Double '() 動態陣列
Dim iWi_St_Ret_Perf() As Double
Dim iLo_St_Ret_Perf() As Double
Dim i, j, k, n As Integer
Dim c, r As Integer
Dim data As Range
iRowNo = Sheets("個股報酬率").Range("A65536").End(xlUp).Row
iColumnNo = Sheets("個股報酬率").Range("HV1").End(xlToLeft).Column
'ReDim 陳述式 在程序層次中用來重新配置動態陣列變數的儲存空間。
ReDim iWi_St_Ret(2 To iColumnNo, 1 To 5)
ReDim iLo_St_Ret(2 To iColumnNo, 1 To 5)
ReDim iWi_St_Ret_Perf(2 To iColumnNo, 1 To 5)
ReDim iLo_St_Ret_Perf(2 To iColumnNo, 1 To 5)
For j = 2 To iColumnNo
For i = 1 To 5
'iWi_St_Ret_Perf(j, i) = 0 '不必為0
'iLo_St_Ret_Perf(j, i) = 0
Debug.Print iWi_St_Ret(j, i)
iWi_St_Ret(j, i) = Application.WorksheetFunction.Large(Range(Cells(2, j), Cells(iRowNo, j)), i)
iLo_St_Ret(j, i) = Application.WorksheetFunction.Small(Range(Cells(2, j), Cells(iRowNo, j)), i)
'Set data = Range(Cells(j, 2), Cells(100, j + 1)) '另一錯誤點 Cells(j, 2)=>一直是B欄
'Set data = Range(Cells(2, j), Cells(100, j + 1)) '欄位隨著j
Set data = Range(Cells(2, j), Cells(iRowNo, j + 1)) '建議列位用 iRowNo
'Debug.Print data.Address '可看看範圍
iWi_St_Ret_Perf(j, i) = Application.VLookup(iWi_St_Ret(j, i), data, 2, False)
iLo_St_Ret_Perf(j, i) = Application.VLookup(iLo_St_Ret(j, i), data, 2, False)
Next i
Next j
End Sub
複製代碼
作者:
c_c_lai
時間:
2013-11-29 09:47
回復
4#
GBKEE
陣列範圍超出索引範圍。
' ReDim iWi_St_Ret(2 To iRowNo, 1 To 5)
' ReDim iLo_St_Ret(2 To iRowNo, 1 To 5)
' ReDim iWi_St_Ret_Perf(2 To iRowNo, 1 To 5)
' ReDim iLo_St_Ret_Perf(2 To iRowNo, 1 To 5)
ReDim iWi_St_Ret(2 To iColumnNo, 1 To 5)
ReDim iLo_St_Ret(2 To iColumnNo, 1 To 5)
ReDim iWi_St_Ret_Perf(2 To iColumnNo, 1 To 5)
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
Option Explicit
Sub Ex()
Dim Ar(1 To 5, 1 To 10)
Ar(1, 1) = 1 'Ar(1, 1)等同[A1:J5].Cells(1,1)
Ar(5, 10) = 50 'Ar(5, 10)等同[A1:J5].Cells(5,10)
[A1:J5].Cells(1, 1) = Ar(1, 1)
[A1:J5].Cells(5, 10) = Ar(5, 10)
'**************************
Stop
Ar(3, 5) = 25
[A1:J5].Clear
[A1:J5] = Ar
End Sub
複製代碼
作者:
stevenliu555
時間:
2013-11-30 08:00
您好:
太好了,感激指導。都OK了。
歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)