«Как рассчитать количество ячеек, которые изменились из общего числа» - PullRequest
0 голосов
/ 22 марта 2019

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

1. Compare a range on two spreadsheets to find mismatches.
2. Calculate (not format) how many cells are different and then send that 
   resultant value a target cell on another spreadsheet in the workbook.
   EX: If 2 out of 10 cells do not match then the target cell 
       value should be 2
3. Replicate this process for about 6 other parameters in the workbook 
   (That is the easy part I think).

Я использовал / дал следующие функции VBA, чтобы попытаться получить результат: WorksheetFunction.sum Evaulate (SumProduct)

Я не верю, что проблема заключается в самом коде сравнения (поскольку я только что позаимствовал некоторые примеры из Интернета, которые я видел). Но в функции, которая возникает после оператора Else.Код работает и отлаживается нормально, однако ответа не получается.Код ниже, сделайте предположения, что переменные объявлены (для целей космоса).

Worksheets("Generalized Report").Activate
strRangeToCheck = "F2:F10000" 'Range can change depending on amount of data on sheets'

varSheetA = Worksheets("Contract").Range(strRangeToCheck)
varSheetB = Worksheets("As Built").Range(strRangeToCheck)

'Loop thru and do the comparison cell by cell via an array
For iRow = LBound(varSheetA, 1) To UBound(varSheetA, 1)
    For iCol = LBound(varSheetA, 2) To UBound(varSheetA, 2)
        If varSheetA(iRow, iCol) = varSheetB(iRow, iCol) Then
            ' Cells are identical.
            ' Do nothing.
        Else
            ' Cells are different.

            ' Calculate how many cells are different
            Worksheet("Generalized Report").Activate
            Worksheet("Generalized Report").Range("A8") = Evaluate("=SUMPRODUCT(--('Contract'!F2:F10000<>'As Built'!F2:F10000)")

В этом конкретном случае я ожидаю значение 0 (поскольку это тестовые данные), но значение должно равняться количеству ячеек, которые отличаются.Следующие 3 вещи происходят с моим кодом на основе моих настроек:

  1. Ответ не получен
  2. #Value! ошибка
  3. Для уже назначенного

Спасибо за ваше время.

1 Ответ

0 голосов
/ 23 марта 2019

Я бы посчитал различия в VBA вместо того, чтобы пытаться использовать формулу SUMPRODUCT:

Dim DifferenceCount as Long
Worksheets("Generalized Report").Activate
strRangeToCheck = "F2:F10000" 'Range can change depending on amount of data on sheets'

varSheetA = Worksheets("Contract").Range(strRangeToCheck)
varSheetB = Worksheets("As Built").Range(strRangeToCheck)

'Loop thru and do the comparison cell by cell via an array
For iRow = LBound(varSheetA, 1) To UBound(varSheetA, 1)
    For iCol = LBound(varSheetA, 2) To UBound(varSheetA, 2)
        If varSheetA(iRow, iCol) = varSheetB(iRow, iCol) Then
            ' Cells are identical.
            ' Do nothing.
        Else
            ' Cells are different.
            DifferenceCount = DifferenceCount + 1
        End If
    Next iCol
Next iRow
Worksheet("Generalized Report").Range("A8") = DifferenceCount

Редактировать

Когда я думаю об этом, есть две другие альтернативы, использующие вашу формулу ...

Во-первых, весь ваш макрос может быть

Worksheet("Generalized Report").Range("A8") = Evaluate("=SUMPRODUCT(--('Contract'!F2:F10000<>'As Built'!F2:F10000)")

Это приведет к результату формулы в A8.

Второй вариант - просто использовать формулу =SUMPRODUCT(--('Contract'!F2:F10000<>'As Built'!F2:F10000) прямо в A8.

Код в вашем вопросе оценивает формулу несколько раз в двух циклах, если у вас есть несколько ячеек, которые не совпадают. Это не нужно и может быть очень медленным для большой / сложной электронной таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...