Visual Basi c Ошибка при попытке расчета среднего - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь создать макрос, который собирает как плоское число #, так и среднее из существующих значений на листе. Я получаю сообщение об ошибке в строке, где я пытаюсь вычислить переменную avgScore путем деления суммированного значения vulnScore на значение счетчика. Я получаю сообщение об ошибке «Runtime 6» в строке «avgScore = vulnScore / counter». Он работает с набором данных длиной 77 строк. Я пытался преобразовать переменные в Long (единственное реальное предложение, которое я нашел), но это не сработало. переменная 'element' предназначена для массива размером около 26, содержащего строковые переменные.

Dim counter As Long
Dim vulnScore As Long
Dim avgScore As Long
vulnScore = 0
counter = 0
avgScore = 0

Dim rowNum As Integer
''''''''''''''''''''
For Each element In arr
vulnScore = 0
counter = 0
avgScore = 0
'get #'s for putting into Treg
'''''''''
For i = 2 To Cells(Rows.Count, 3).End(xlUp).Row
If Cells(i, 3).Value = element Then
'# of times that server is listed
counter = counter + 1
'combining vulnerability scores for that server
vulnScore = vulnScore + Cells(i, 7).Value
End If
Next i
avgScore = vulnScore / counter
'''''''''

'find Treg column/row
colNum = WorksheetFunction.Match("Findings Variance (4/15 vs Current)", ActiveWorkbook.TREG.Range("1:1"), 0)
rowNum = WorksheetFunction.Match(element, ActiveWorkbook.TREG.Range("1:1"), 0)
Cells(rowNum, colNum - 1).Value = avgScore
Cells(rowNum, colNum - 2).Value = counter
'''''''''
Next element

Пример: он извлекает данные из этого листа, которые будут активными при запуске макроса enter image description here

Пример: вставка данных в два пустых столбца на этом листе (TREG) enter image description here

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

попробуйте добавить этот код:

debug.print("Vulnscore: " & vulnScore & " Counter: " & counter & " avgScore: " & vulnScore / counter)

прямо перед вашей строкой

avgScore = vulnScore / counter

И посмотрите, что напечатано

0 голосов
/ 19 февраля 2020

Вы заявляете в своем комментарии к ответу NautMeg, что обе переменные равны 0, когда это происходит. Это уже дает вам половину ответа: если counter равно 0, вы получите ошибку деления на ноль (ошибка времени выполнения 11). За исключением деления 0 на 0, в этом случае VBA не сгенерирует деление на ноль, оно выдаст ошибку переполнения (ошибка времени выполнения 6).

Вы можете попробовать его, открыв ближайшее окно ( Ctrl + G ) и введите:

? 1/0

-> Ошибка выполнения 11

? 0/0

-> Ошибка выполнения 6

В любом случае вы должны решить, что хотите видеть на своем листе. Может быть, изменить свой код на что-то вроде

colNum = WorksheetFunction.Match("Findings Variance (4/15 vs Current)", ActiveWorkbook.TREG.Range("1:1"), 0)
rowNum = WorksheetFunction.Match(element, ActiveWorkbook.TREG.Range("1:1"), 0)
if counter > 0 then 
    avgScore = vulnScore / counter        
    Cells(rowNum, colNum - 1).Value = avgScore
Else
    Cells(rowNum, colNum - 1).Value = ""
End IF
Cells(rowNum, colNum - 2).Value = counter
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...