накопление случаев истинного или 1 результата в отдельном столбце

У меня есть около 100 строк, которые включают генератор случайных чисел в столбце и в другом столбце с расчетами = A на основе этого случайного числа и других вещей. Я настроил столбец с оператором if, чтобы проверить, находится ли A в верхнем и нижнем диапазоне, который возвращает «1», если оно истинно (попадание, если хотите), и «0», если нет. Я хочу запустить цикл и подсчитать количество попаданий в эти ячейки с течением времени. По сути, мне нужен столбец, в котором накапливаются результаты, чтобы в конце я мог видеть, в каком диапазоне больше всего совпадений и т. д.


person Tommister    schedule 09.10.2018    source источник
comment
Я так не думаю. countif будет равен 1, когда A равен 1, но вернется к 0 в следующем цикле. Мне нужно, чтобы ячейка накапливалась, поэтому в первый раз, когда A равно 1, ячейка равна 1, в следующий раз, когда A равно 1, ячейка равна 2 и т. д......   -  person Tommister    schedule 09.10.2018
comment
Переберите 100 ячеек и, если есть 1, добавьте 1 к соседней ячейке. Однако неясно, что вы подразумеваете под временем - что вызывает пересчет?   -  person Tim Williams    schedule 09.10.2018
comment
Спасибо, Тим, я попробую. Я использовал поиск цели, чтобы зациклить его. но мог бы использовать макрос. случайные числа пересчитываются при автоматическом вычислении любого листа, поэтому я пытаюсь получить результаты каждой итерации.   -  person Tommister    schedule 09.10.2018


Ответы (1)


Чтобы сделать это проще, давайте сначала скажем, что ваши данные хранятся следующим образом, прежде чем мы начнем, на вашем рабочем листе «ws»:

     A              | B                | C
1    Random Numbers | Calculated Value | Accumulated Value
2    0              | 1                | 
3    5              | 0                | 
4    8              | 1                | 
5    73             | 0                | 
6    2              | 0                | 

[...]

Предположим, мы хотим запустить этот процесс 10 000 раз, чтобы увидеть, какие строки получают самые высокие накопленные значения, представленные в виде суммы вычисленных значений на каждой из предыдущих итераций. Я бы предложил следующее решение VBA:

Sub AccumulateValues
    Dim MaxIterations As Long: MaxIterations = 10000        
    Dim curRow as Long, LastRow as Long, it as Long

    Application.Calculation = xlCalculationManual 'Required to set it to manual

    With ws
        LastRow = .Range("A" & .Rows.Count).End(xlUp).Row

        For it = 1 to MaxIterations

            'Force the Recalculation of Cells in columns A and B:
            Application.Calculate

            For curRow = 2 To LastRow                    
                'Sum the result of this iteration with the accumulated value 
                'until the previous iteration and stores it.
                ws.Cells(curRow, 3) = ws.Cells(curRow, 3) + ws.Cells(curRow, 2)    

            Next curRow
        Next it

    End With

End Sub
person fabio.avigo    schedule 09.10.2018
comment
Спасибо, Фабио, я скопировал и подправил, чтобы начать работать с 8-й строкой и суммировать ячейки в (curRow, 12 и 13). Когда я запускаю его, я получаю ошибку 424 Object Expected. Похоже, он не может пройти первые две строки. - person Tommister; 09.10.2018
comment
Как обычно, я очень расстроен из-за того, что не понимаю значения ошибки, потому что я не полностью понимаю языковые правила. Я попытался отключить несколько вещей и даже изменить переменные на абсолютные и отключить линию Dim. Я получаю разные ошибки в зависимости от того, что я делаю, но он не показывает мне, что код сломался при отладке, поэтому я могу сосредоточиться на проблеме. Я даже изменил имя рабочего листа на ws и имя файла! - person Tommister; 10.10.2018
comment
@Tommister, это может быть ошибка ссылки. Когда я имел в виду назвать ваш рабочий лист как ws, это может быть любое имя, которое вы выберете. Допустим, он называется Sheet1. Попробуйте добавить это перед With: Dim ws as Worksheet: Set ws = ThisWorkbook.Worksheets(Sheet1). В противном случае вы можете просто заменить строку With ws на: With ActiveSheet. - person fabio.avigo; 10.10.2018
comment
Если нет, попробуйте запустить его в VBA шаг за шагом (нажав F8) и, пожалуйста, вернитесь, чтобы сообщить, в какой строке он перестал работать. - person fabio.avigo; 10.10.2018
comment
Вы пробовали предложенное решение, @Tommister? Какой-либо прогресс? - person fabio.avigo; 15.10.2018