我有一个非常基本的问题,但不知何故只是找不到它的解决方案。 我试着编写一个小程序,它从工作表中获取给定的股票价格,并在给定的时间段内计算它的移动平均值。
到目前为止,这不是问题。
我现在的问题是,我想要解决方案,即B列中新工作表中的移动平均线和A列中的等效股票价格。
我已经编写了代码来创建一个新工作表,如下所示:
Sub CopyToNewSheet()
Selection.Copy
Sheets.Add(After:=Sheets(1)).Name = "MovingAverage"
ActiveSheet.Paste
Application.CutCopyMode = False
End Sub
到目前为止,此工作正常。该计划的下一部分现在应该是移动平均线的计算。我尝试了这个,也有效:
Sub CalculateMA(maLength As Integer)
Application.ScreenUpdating = False
Columns("B:B").Delete
Range("B1").Value = "MA" + CStr(maLength)
Range("B1").Offset(maLength, 0).Select
Do While IsEmpty(Selection.Offset(0, -1)) = False
Selection.Value = WorksheetFunction.Average(Range(Selection.Offset(-maLength + 1, -1), Selection.Offset(0, -1)))
Selection.Offset(1, 0).Select
Loop
End Sub
这里的问题是,这不会将计算出的解决方案放入新工作表中,而是放入旧工作表中。
您是否有任何想法,我必须更改哪些内容,以便将解决方案发布到其他工作表中?
非常感谢。
感谢您的帮助。
答案 0 :(得分:1)
您应该能够在范围前指定要修改的工作表:
Worksheets("MovingAverage").Range("B1").Value = "MA" + CStr(maLength)
选择范围时,请执行相同操作,并按预期方式进行操作。
答案 1 :(得分:1)
在Sub CopyToNewSheet
行内ActiveSheet.Paste
,添加以下内容:
WorkSheets("MovingAverage").Activate
这背后的原因是因为即使你刚刚添加了一张表,它还不是ActiveSheet
。
答案 2 :(得分:0)
建议:计算完毕后,查看结果,现在打开宏录制,执行复制到目标工作表,现在停止宏。你的代码准备好了!这是通过优秀自我完成的。
在Excel中编程时,宏录制为您提供了巨大的推动力。
尝试一下。
如果您不知道如何,这是一个link如何做宏。 我真的很鼓励你学习它,基本上你的电源表中的大部分代码都可以通过宏为你生成,也可以帮助你更快地学习excel vba语言。
答案 3 :(得分:0)
您遇到了一个非常常见的问题:当您没有指定您正在讨论的工作表时,您无法保证Excel会选择哪一个。正确的方法是明确地告诉Excel。作为一个好处,当你使用对象而不是.Selection
时,事情会更快......所以当你创建新的工作表时,给它一个名字;然后你可以参考它。
尝试对上一段代码进行以下修改:
Sub CalculateMA(maLength As Integer)
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim sourceCell As Range
Dim destCell As Range
Application.ScreenUpdating = False
Set ws1 = ActiveWorkbook.Sheets("stockData") ' whatever the name is...
Set ws2 = ActiveWorkbook.Sheets("movingAverage")
ws2.Columns("B:B").Delete
ws2.Range("B1").Value = "MA" + CStr(maLength)
Set sourceCell = ws1.Cells(maLength, 1)
Set destCell = ws2.Cells(maLength, 2)
Do While IsEmpty(sourceCell) = False
destCell.Value = WorksheetFunction.Average(Range(sourceCell.Offset(-maLength + 1, 0), sourceCell))
Set sourceCell = sourceCell.Offset(1, 0)
Set destCell = destCell.Offset(1, 0)
Loop
Application.ScreenUpdating = True
End Sub
我认为这就是你所追求的。