Буду очень благодарен за помощь. Необходимо сделать макрос, который бы менял значения в некоторых диапазонах ячеек на другие значения, а затем для каждого сценария вытаскивал результирующий показатель.
Чтобы было более понятно прилагаю файл с примером. Надо чтобы значения в строчках 3-6, подменялись значениями в диапазонах, расположены правее. И для каждого сценария (1-6) считался итоговый показатель, который потом вытаскивался на лист в ячейки B14-B19.
Если кто-то знает, каким должен быть макрос, буду очень благодарен за ответ. Спасибо! )
Добрый день!
Буду очень благодарен за помощь. Необходимо сделать макрос, который бы менял значения в некоторых диапазонах ячеек на другие значения, а затем для каждого сценария вытаскивал результирующий показатель.
Чтобы было более понятно прилагаю файл с примером. Надо чтобы значения в строчках 3-6, подменялись значениями в диапазонах, расположены правее. И для каждого сценария (1-6) считался итоговый показатель, который потом вытаскивался на лист в ячейки B14-B19.
Если кто-то знает, каким должен быть макрос, буду очень благодарен за ответ. Спасибо! )Isay7
Но формула, к сожалению, не подойдет, так как этот пример условный. Взаимосвязь гораздо сложнее с кучей дополнительных факторов (их количество исчисляется тысячами), которые влияют друг на друга, и 1 формулой это невозможно описать. Да и сценариев предполагается не 6, а больше 1000.
Поэтому составил такой простенький примерчик, чтобы понять суть, а потом уже инкорпорировать логику в сложную финансовую модель.
Спасибо, что уделили внимание.
Но формула, к сожалению, не подойдет, так как этот пример условный. Взаимосвязь гораздо сложнее с кучей дополнительных факторов (их количество исчисляется тысячами), которые влияют друг на друга, и 1 формулой это невозможно описать. Да и сценариев предполагается не 6, а больше 1000.
Поэтому составил такой простенький примерчик, чтобы понять суть, а потом уже инкорпорировать логику в сложную финансовую модель.Isay7
Sub ertert() Dim i& With Range("B2:I2") For i = 1 To 6 .Offset(1).Value = .Offset(i, 12).Value .Offset(2).Value = .Offset(i, 22).Value .Offset(3).Value = .Offset(i, 32).Value .Offset(4).Value = .Offset(i, 42).Value Range("B13").Offset(i).Value = WorksheetFunction.Sum(.Offset(7).Value) Next i End With End Sub
[/vba]
вот, например: [vba]
Код
Sub ertert() Dim i& With Range("B2:I2") For i = 1 To 6 .Offset(1).Value = .Offset(i, 12).Value .Offset(2).Value = .Offset(i, 22).Value .Offset(3).Value = .Offset(i, 32).Value .Offset(4).Value = .Offset(i, 42).Value Range("B13").Offset(i).Value = WorksheetFunction.Sum(.Offset(7).Value) Next i End With End Sub
Sub Calc() Dim n&, r&, c& Dim Cena(), Kurs(), Prodaga(), Invest(), Discont(), Resultat()
' копируем данные с листа в массивы Cena = Range("N3:U8").Value Kurs = Range("X3:AE8").Value Prodaga = Range("AH3:AO8").Value Invest = Range("AS3:AZ8").Value Discont = Range("B8:I8").Value
' объявляем массив для результатов n = UBound(Cena) ReDim Resultat(n, 1)
' расчет по формуле: Результат = (Цена * Курс * Продажа + Инвестиции) * Дисконт For c = 1 To UBound(Cena, 2) For r = 1 To n Resultat(r, 1) = Resultat(r, 1) + (Cena(r, c) * Kurs(r, c) * Prodaga(r, c) + Invest(r, c)) * Discont(1, c) Next r, c
' сохраняем результат на лист Range("B14").Resize(n) = Resultat End Sub
[/vba]
Вот так будет быстро считать:
[vba]
Код
Option Explicit Option Base 1
Sub Calc() Dim n&, r&, c& Dim Cena(), Kurs(), Prodaga(), Invest(), Discont(), Resultat()
' копируем данные с листа в массивы Cena = Range("N3:U8").Value Kurs = Range("X3:AE8").Value Prodaga = Range("AH3:AO8").Value Invest = Range("AS3:AZ8").Value Discont = Range("B8:I8").Value
' объявляем массив для результатов n = UBound(Cena) ReDim Resultat(n, 1)
' расчет по формуле: Результат = (Цена * Курс * Продажа + Инвестиции) * Дисконт For c = 1 To UBound(Cena, 2) For r = 1 To n Resultat(r, 1) = Resultat(r, 1) + (Cena(r, c) * Kurs(r, c) * Prodaga(r, c) + Invest(r, c)) * Discont(1, c) Next r, c
' сохраняем результат на лист Range("B14").Resize(n) = Resultat End Sub
Всем спасибо за попытку помочь. В особенности спасибо nilem, в итоге решил пользоваться его макросом, так как там нету привязки к тому, какой формулой считается итоговое значение, что было важно для меня. Единственное, не подскажите, можно ли как-то сделать так, чтобы изначальный сценарий, которого нету в списке сценариев для перебора, все равно оставался после прогонял макроса?) Понимаю, что данные изначального сценария можно просто дополнительно поставить в качестве последнего сценария, но хотелось бы к этому не прибегать, если можно. Спасибо!
Всем спасибо за попытку помочь. В особенности спасибо nilem, в итоге решил пользоваться его макросом, так как там нету привязки к тому, какой формулой считается итоговое значение, что было важно для меня. Единственное, не подскажите, можно ли как-то сделать так, чтобы изначальный сценарий, которого нету в списке сценариев для перебора, все равно оставался после прогонял макроса?) Понимаю, что данные изначального сценария можно просто дополнительно поставить в качестве последнего сценария, но хотелось бы к этому не прибегать, если можно. Спасибо!Isay7
Сообщение отредактировал Isay7 - Пятница, 17.07.2015, 14:55
Sub ertert() Dim i&, v() With Range("B2:I2") v = .Resize(7).Formula ' запоминаем данные сценария, которого нет в списке For i = 1 To 6 .Offset(1).Value = .Offset(i, 12).Value .Offset(2).Value = .Offset(i, 22).Value .Offset(3).Value = .Offset(i, 32).Value .Offset(4).Value = .Offset(i, 42).Value Range("B13").Offset(i).Value = Range("B11").Value ' чтоб уж прям совсем уйти от привязки к сценарию (вернее, почти совсем) Next .Resize(7).Formula = v ' восстанавливаем данные сценария, которого не было в списке End With End Sub
[/vba]
так?[vba]
Код
Sub ertert() Dim i&, v() With Range("B2:I2") v = .Resize(7).Formula ' запоминаем данные сценария, которого нет в списке For i = 1 To 6 .Offset(1).Value = .Offset(i, 12).Value .Offset(2).Value = .Offset(i, 22).Value .Offset(3).Value = .Offset(i, 32).Value .Offset(4).Value = .Offset(i, 42).Value Range("B13").Offset(i).Value = Range("B11").Value ' чтоб уж прям совсем уйти от привязки к сценарию (вернее, почти совсем) Next .Resize(7).Formula = v ' восстанавливаем данные сценария, которого не было в списке End With End Sub