2014-01-11 5 views
0

У меня есть очень простая проблема, но почему-то просто не найти ее. Я попытался написать небольшую программу, которая берет данные цены акций с рабочего листа и вычисляет скользящую среднюю его за определенный период времени.VBA: Как вывести расчетное решение в новый рабочий лист?

До сих пор это не было проблемой.

Моей проблема теперь в том, что я хочу, чтобы решение, т.е. скользящего среднего в новом листе в колонке B и эквивалентное stockprices в столбце 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

Вы пробовали мое предложение, знаете о макросах? –

ответ

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 

Я думаю, это делает то, что вы были после.

0

Предложение: после расчета посмотрите на результат, теперь включите макросъемку, выполните свою копию на лист адресата, теперь остановите макрос. Ваш код готов! Это делается, превзойдя его.

Макросъемка дает вам огромный импульс при программировании в Excel.

Попробуйте.

Вот link как сделать макрос, если вы не знаете, как это сделать. Я действительно рекомендую вам изучить его, в основном большая часть вашего кода в силовых листах может быть сгенерирована для вас через макросы, а также поможет вам быстрее изучить язык excel vba.

+0

Хотя это на первый взгляд хороший совет, вы узнаете много вредных привычек от изучения записанных макросов - подумайте обо всех операциях '.Select' и т. Д. Вы рискуете научиться множеству неэффективных методов и пропустите много хороших методов. Я рекомендую это только в крайнем случае; а не «быстрее выучить язык». Это ярлык, но не для правильного назначения. – Floris

+0

@Floris Согласен, но это помогает понять в начале :) –

1

Вы должны быть в состоянии указать таблицу, которую необходимо изменить в передней части диапазона:

Worksheets("MovingAverage").Range("B1").Value = "MA" + CStr(maLength) 

сделать то же самое, когда вы выбираете диапазон, и он должен работать, как вы хотели.

1

Внутри Sub CopyToNewSheet перед ActiveSheet.Paste линии, добавьте это:

WorkSheets("MovingAverage").Activate 

Причина этого в том, что даже если вы только что добавили лист, это еще не ActiveSheet.

+0

Это сработало, но вместо «Sub CopyToNewSheet» я написал его в часть «Sub CalculateMA». – user3186278