Макрос VBA не обновляет ячейки автоматически

У меня есть лист, который вычисляет несколько ключевых финансовых переменных на основе изменения одной ячейки (допущения предварительно вычисляются, но каждый раз, когда изменяется ячейка, Excel должен вычислять, обычно каждая из них выполняется очень быстро).

Используя поле со списком ActiveX (чтобы разрешить пользователю управление/возможность поиска и т. д.), я разрешаю пользователю изменять ячейку B1:

Private Sub ComboBox1_Change()
Application.EnableEvents = False
Range("B1").Value = ComboBox1.ListIndex + 2
End Sub  

Текущая проблема, которую я пытаюсь решить, заключается в попытке объединить их в пакеты, чтобы я мог итеративно запускать пользовательский список.

В приведенном ниже примере (это не конечный результат, который я хочу, просто доказательство того, что я могу легко изменить ячейку B1), я пытаюсь изменить ячейку B1 на значения 1, затем 2, затем 3 и посмотреть, каковы результаты и позже адаптирует это, чтобы оно было более гибким, чем просто 1, 2, 3

Private Sub CommandButton2_Click()
Dim counter As Integer
For counter = 1 To 3
Application.EnableEvents = False
Worksheets("Hurdle Evaluation").Range("B1").Value = counter
Worksheets("MOBCashFlow").Calculate
Worksheets("Hurdle Evaluation").Calculate

Worksheets("IterateNPV").Range("A2").Value = counter
Worksheets("IterateNPV").Range("B2").Value = Worksheets("Hurdle Evaluation").Range("F5").Value
Worksheets("IterateNPV").Range("C2").Value = Worksheets("Hurdle Evaluation").Range("F6").Value
Worksheets("IterateNPV").Range("D2").Value = Worksheets("Hurdle Evaluation").Range("G5").Value
Worksheets("IterateNPV").Range("E2").Value = Worksheets("Hurdle Evaluation").Range("G6").Value
Worksheets("IterateNPV").Range("F2").Value = Worksheets("Hurdle Evaluation").Range("J5").Value
Range("A2").EntireRow.Insert
Next counter
End Sub  

Результаты (показаны ниже):

3   $10,134,808.14  $9,194,031.64   $10,134,808.14  $9,194,031.64   758.129033
2   $10,134,808.14  $9,194,031.64   $10,134,808.14  $9,194,031.64   758.129033
1   $10,134,808.14  $9,194,031.64   $10,134,808.14  $9,194,031.64   758.129033  

показывает, что базовая ячейка либо не изменяется, либо изменяется и перезаписывается предыдущим макросом (эти значения являются правильными значениями для элемента, выбранного в поле со списком). Я ищу любые творческие решения, чтобы вручную перезаписать эту ячейку B1, которая связана с ComboBox.

Спасибо.


person CitricAcid    schedule 11.12.2017    source источник
comment
Application.EnableEvents = False этот параметр является постоянным: он не включится снова после выхода вашего Sub - вы должны сбросить его в своем коде. Вы можете попробовать CalculateFull вместо Calculate - трудно понять, какой из них вам может понадобиться, не зная, как настроены ваши формулы.   -  person Tim Williams    schedule 12.12.2017
comment
В приведенном выше примере я изменил код, чтобы лучше выделить проблему: Worksheets("IterateNPV").Range("A2").Value = Counter на Worksheets("IterateNPV").Range("A2").Value = Worksheets("Hurdle Evaluation").Range("B1").Value, и он по-прежнему возвращает тот же результат. B1 в оценке препятствий либо не изменяется, либо предыдущий макрос, упомянутый выше, влияет на него. Я также пытался удалить флаг enableevents и пробовал CalculateFull и CalculateFullRebuild безрезультатно.   -  person CitricAcid    schedule 12.12.2017
comment
Какой лист активен, когда это выполняется?   -  person Tim Williams    schedule 12.12.2017
comment
IterateNPV — это активный лист, содержащий макрос. Имеется в виду добавить, что первый столбец в отредактированном примере не 1, 2, 3, как в приведенном выше примере, а 4356 4356 4356, указывающий, что ячейка B1 не изменяется по сравнению с этим макросом.   -  person CitricAcid    schedule 12.12.2017
comment
Я не могу объяснить, что вы видите, на основе предоставленного кода. counter должно изменяться в цикле, но значение 4356 не могло быть получено из опубликованного вами кода.   -  person Tim Williams    schedule 12.12.2017
comment
4356 происходит из поля со списком, которое определяет B1 в предыдущем макросе выше. Итак, поскольку в поле со списком есть активный выбор, B1 кажется заблокированным для этого числа. Я пытаюсь найти способ отключить первую подпрограмму в списке: Private Sub ComboBox1_Change() Application.EnableEvents = False Range("B1").Value = ComboBox1.ListIndex + 2 End Sub   -  person CitricAcid    schedule 12.12.2017
comment
Если вы удалите поле со списком, это сработает?   -  person Tim Williams    schedule 12.12.2017
comment
Да, если я удалю поле со списком, код сработает. Я хочу, чтобы поле со списком существовало, где пользователь может изменить ячейку B1, поэтому это обязательная функциональность (хотя я полностью открыт для других решений, как этого добиться). Большое спасибо за вашу помощь :)   -  person CitricAcid    schedule 12.12.2017
comment
Связан ли ваш список со списком с B1 (через Свойства ›› LinkedCell)? Если да, то это ваша проблема. Очистите эту ссылку, и она должна работать: вы уже обновляете ячейку с помощью обработчика кликов, поэтому ее не нужно связывать напрямую. Кстати, EnableEvents не влияет на события управления ActiveX, поэтому установка значения False здесь не поможет.   -  person Tim Williams    schedule 12.12.2017
comment
К сожалению, в свойствах нет связанной ячейки, но есть куча других свойств, которые могут быть виновниками, которые я еще не исследовал. Потрачу некоторое время на поиски там   -  person CitricAcid    schedule 12.12.2017
comment
Также было бы неплохо показывать числа по возрастанию, а не по убыванию. Если это ваш случай, измените For counter = 1 to 3 на For counter = 1 to 3 step -1   -  person Luuklag    schedule 12.12.2017


Ответы (1)


Нашел решение, которое работает, но все еще не уверен, почему оно работает
Вместо ссылки на изменения ячейки ("B1") я изменил его, чтобы изменить индекс:

For counter = 1 To 3
Worksheets("Hurdle Evaluation").ComboBox1.ListIndex = counter
Worksheets("MOBCashFlow").Calculate
Worksheets("Hurdle Evaluation").Calculate

Worksheets("IterateNPV").Range("A2").Value = counter
Range("A2").EntireRow.Insert
Next counter
End Sub  
person CitricAcid    schedule 12.12.2017