子程序返回全0

时间:2016-11-05 22:52:28

标签: excel vba excel-vba

我试图从用户定义的函数返回值,但返回的所有值都是0。我觉得我分配给变量wk1和wk2的值并没有在函数中使用。

子程序的目标是计算股票的每周回报,给出工作表中提供的价格"价格"。

我对VBA不是很了解,所以感谢任何帮助

感谢您的帮助!

Public Sub wklyrtn()
Dim wk1, wk2 As Long
Dim row As Long, column As Long
Dim matrix1(2 To 261, 2 To 11) As Integer



Sheets("Prices").Select
Selection.Activate

For row = 2 To 261
    For column = 2 To 11
        wk2 = Cells(row, column).Value
        wk1 = Cells(row + 1, column).Value
        matrix1(row, column) = Rtrn(wk1, wk2)
    Next column
Next row

Sheets("Returns").Select
Selection.Activate

For row = 2 To 261
    For column = 2 To 11
        Cells(row, column) = matrix1(row, column)
    Next column
Next row


End Sub

Public Function Rtrn(wk1, wk2)
Dim delt As Long
Application.Volatile True

delt = wk2 - wk1
Rtrn = delt / wk1

End Function

3 个答案:

答案 0 :(得分:1)

试试这个。不确定您要对Matrix尝试做什么。但这将为您提供所需的价值。您需要引用一个对象(您的工作表),而不是使用select(总是要避免使用set来尝试引用一个对象。

Option Explicit

Public Sub wklyrtn()
Dim wk1 As Long, wk2 As Long
Dim row As Long, column As Long
Dim matrix1(2 To 261, 2 To 11) As variant
Dim wks As Worksheet, wks2 As Worksheet

Set wks = ThisWorkbook.Sheets("Prices")

With wks
For row = 2 To 261
    For column = 2 To 11
        wk2 = wks.Cells(row, column).Value
        wk1 = wks.Cells(row + 1, column).Value
        matrix1(row, column) = Rtrn(wk1, wk2)
    Next column
Next row
End With

Set wks2 = ThisWorkbook.Sheets("Returns")

With wks2
For row = 2 To 261
    For column = 2 To 11
        wks2.Cells(row, column) = matrix1(row, column)
    Next column
Next row
End With


End Sub

答案 1 :(得分:0)

connect(authentication_source='admin')

答案 2 :(得分:0)

除了使用Variant变量(正如您已经被告知的那样)之外,您可以利用数组来加速宏执行并缩短代码:

Option Explicit

Public Sub wklyrtn()
    Const ROWMIN As Long = 2
    Const ROWMAX As Long = 261
    Const COLMIN As Long = 2
    Const COLMAX As Long = 11

    Dim row As Long, column As Long
    Dim data As Variant, matrix1 As Variant

    With Sheets("Prices")
        data = .Range(.Cells(ROWMIN, COLMIN), .Cells(ROWMAX + 1, COLMAX)).Value '<--| read all needed values into 'data' array (it needs one row more at the bottom)
    End With

    ReDim matrix1(1 To ROWMAX - ROWMIN + 1, 1 To COLMAX - COLMIN + 1) As Double '<--| size  returned valuse array accordingly to chosen rows and column indexes ranges
    For row = 1 To ROWMAX - ROWMIN + 1
        For column = 1 To COLMAX - COLMIN + 1
            matrix1(row, column) = Rtrn(data(row + 1, column), data(row, column)) '<-- store returned values into 'matrix1' array
        Next column
    Next row

    Sheets("Returns").Cells(2, 2).Resize(ROWMAX - ROWMIN + 1, COLMAX - COLMIN + 1 + 1).Value = matrix1 '<--| write returned values from 'matrix1' array into cells
End Sub

Public Function Rtrn(wk1, wk2)
    Dim delt As Long
    Application.Volatile True

    delt = wk2 - wk1
    Rtrn = delt / wk1
End Function