我试图从用户定义的函数返回值,但返回的所有值都是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
答案 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