我在五张纸上有关于某些股票的财务数据,并试图创建一个函数来计算给定范围的指数移动平均线。
[列 (1( = 日期;列 (2( = 收盘价]
此函数的参数是计算 EMA 所考虑的天数,以及一个整数kol
,用于并排计算几列上的多个 EMA(暂时没有用(。这是我到目前为止的代码:
Public Function MME(Lmme As Double, kol As Long)
Dim Cmme As Range
Dim Todate, rcell As Range
Dim alpha, period, Udate, i, j, k As Long
Dim Ustock As String
Dim wsDest As Worksheet
Udate = ThisWorkbook.Worksheets("UserForm").Range("B2").Value
period = ThisWorkbook.Worksheets("UserForm").Range("B3").Value
Ustock = ThisWorkbook.Worksheets("UserForm").Range("B4").Value
' MsgBox (Udate)
Set wsDest = ThisWorkbook.Sheets(Ustock)
wsDest.Activate
With wsDest.Range("A2:A392")
Set Todate = Cells.Find(What:=Udate, _
LookIn:=xlValues, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False)
If Todate Is Nothing Then
MsgBox ("todate wasn't found")
Else
End If
End With
i = Todate.Row
j = i + period
k = i - Lmme
Set Cmme = Range(Cells(i, 9 + kol), Cells(j, 9 + kol))
alpha = (2 / (Lmme + 1))
With Cmme
For Each rcell In Cmme
If rcell.Row <> i Then
rcell.Formula = "=B" & rcell.Row & "*" & alpha & "+I" & rcell.Row - 1 & "*" & 1 - alpha & ""
Else: rcell.Formula = "=AVERAGE(B" & k & ":B" & i & " ) "
End If
Next rcell
End With
End Function
我在单独的工作表上创建了一个列表,允许用户选择2008年的日期,另一个列表允许他选择股票。所以我确实设置了新变量来解决问题,但它不起作用。
Usaction
、USdate
和Uperiod
是存储用户选择的值的名称范围。但是我在set = period
上收到"错误 91 或需要对象"。
我真的希望 EMA 仅针对特定期间计算,从所选日期开始。编辑:我用我拥有的最新版本更新了代码。我仍然有一个错误 91 在日期编辑2:代码已更新。我不明白为什么找不到日期。在工作表用户窗体上,用户选择的日期在"B2"(USdate
(中。它是通用格式,但是在查找功能中使用CDate,它应该被视为日期,对吗?我尝试使用日期格式,它没有改变任何东西......
编辑3:多亏了布拉尼斯拉夫,我设法通过将每个日期切换到常规格式来使查找工作。既然查找正在工作,无论如何让它使用日期格式工作?以便用户可以看到实际日期,而不是关联的整数。
另一个问题:如何绕过 Cells.Formula 直接在 vba 中操作,并使公式在代码运行后显示在 excel 的编辑栏中,除了 SMA 和 EMA 在范围内操作的结果?
ToDate
已经是一个范围
Set Endate = Todate.Row + period
此外,在达到该点之前,您可以使用 .Find()
来设置ToDate
。由于完全有可能有人输入无效日期或您没有数据的日期,因此我强烈建议添加:
if ToDate is Nothing then
'do some date not found stuff here
else
'do your date found stuff here
End If
您可能还需要考虑将LookIn:=xlFormulas
更改为LookIn:=xlValues
因为我相信您正在寻找单元格值,而不是单元格公式。