VBA:如何将计算出的解决方案放入新工作表中?

时间:2014-01-11 23:36:00

标签: excel vba worksheet moving-average

我有一个非常基本的问题,但不知何故只是找不到它的解决方案。 我试着编写一个小程序,它从工作表中获取给定的股票价格,并在给定的时间段内计算它的移动平均值。

到目前为止,这不是问题。

我现在的问题是,我想要解决方案,即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

这里的问题是,这不会将计算出的解决方案放入新工作表中,而是放入旧工作表中。

您是否有任何想法,我必须更改哪些内容,以便将解决方案发布到其他工作表中?

非常感谢。

感谢您的帮助。

4 个答案:

答案 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

我认为这就是你所追求的。