VBA:如何将计算出的解决scheme放入新的工作表中?
我有一个非常基本的问题,但不知何故只是找不到解决scheme。 我试图写一个小程序,它从工作表中获取给定的股票价格,并计算给定时间段内的移动平均值。
到目前为止,这不是一个问题。
我现在的问题是,我想要解决scheme,即列B中的新工作表中的移动平均数以及A列中的等同股票价格。
我已经编写了代码来创build一个新的工作表,如下所示:
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
这里的问题是,这不会将计算出来的解决scheme放到新的工作表中,而是放到旧的工作表中。
你有什么想法,我必须改变,以便将解决scheme发布到其他工作表中?
非常感谢。
你的帮助表示赞赏。
你遇到一个非常普遍的问题:当你不指定你正在谈论的工作表时,你不能保证哪一个Excel将会select。 正确的做法是明确地告诉Excel。 作为一个好处,当你使用对象而不是.Selection
,事情会更快…所以当你创build新的工作表时,给它一个名字; 那么你可以参考它。
尝试以下修改你的最后一段代码:
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
我想这是你以后的样子。
您应该能够在您的范围之前指定要修改的工作表:
Worksheets("MovingAverage").Range("B1").Value = "MA" + CStr(maLength)
当你select范围时,做同样的事情,它应该如何工作。
在Sub CopyToNewSheet
,在ActiveSheet.Paste
行之前,添加以下内容:
WorkSheets("MovingAverage").Activate
这背后的原因是因为即使你只是添加一个表,它还不是ActiveSheet
。
build议:经过计算,看看结果,现在开启macros录制,执行你的复制到目标表单,现在停止macros。 你的代码准备好了! 这是通过擅长自我完成的。
在Excel中进行编程时,macros录制function可以大幅度提升。
试试看。
如果你不知道如何做macros,这里有一个链接 。 我真的鼓励你学习它,基本上你的电源表中的大部分代码都可以通过macros为你生成,也可以帮助你更快地学习excel vba语言。