Сравнить значения листа (текст и арифметика) - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть книга Excel с 2 листами, каждый из которых состоит из 60 строк и 7 столбцов (первый столбец состоит из текста, остальные только цифры).

Я нашел код VBA для сравнениязначения 2 листов.Если есть разница, ячейка заполняется красным, но существует проблема с колонками, содержащими цифры:

Cell in 1st Sheet Value: 6102.75

Cell in 1st Sheet Value: 6102.75000001

->Ячейка выделена красным.

Какие изменения я должен внести в код, чтобы не выделять ячейку, если числа равны до 4 химическим точкам?Я думаю, что мне нужно внести изменения в код, чтобы сравнить отдельно для текста и чисел.

Sub compareSheets(shtBefore As String, shtAfter As String)
Dim mycell As Range
Dim mydiffs As Integer

For Each mycell In ActiveWorkbook.Worksheets(shtAfter).UsedRange

If Not mycell.Value = ActiveWorkbook.Worksheets(shtBefore).Cells(mycell.Row, mycell.Column).Value Then

mycell.Interior.Color = vbRed

mydiffs = mydiffs + 1

Next

'Display a message box stating the number of differences found

MsgBox mydiffs & " differences found", vbInformation

ActiveWorkbook.Sheets(shtAfter).Select

End Sub

Ждем ваших комментариев

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Вы можете использовать функцию Format, чтобы определить количество десятичных знаков, которые вы хотите сравнить, и использовать функцию IsNumeric, чтобы проверить, является ли значение числом или нет.

Пример кода:

Cell A1: 6102.75    
Cell A2: 6102.75000001

Sub test
  'Since in your example both worksheets share the same layout, you only need to check
  'if one of the values is numeric, since the other value will automaticly be the same
  If IsNumeric(Cells(1,1).Value) Then
    MsgBox (Format(Cells(1,1).Value, "0.0000") = Format(Cells(1,1).Value, "0.0000"))
  Else
    MsgBox Cells(1,1).Value = Cells(1,2).Value
  End If      
End Sub

Первый параметр Format - это значение, которое вы хотите отформатировать

Второй параметр Format - это строка, определяющая формат

для 4 нулей.после точки задайте количество десятичных знаков


РЕДАКТИРОВАТЬ: Так как @jeeped постет решение с использованием функции Round.

Обратите внимание, что с помощьюфункция Format обрезает остальные десятичные разряды вместо округления.

Так что 6102,75 и 6102,75005 будут по-прежнему равны.


EDIT2:

@ jeeped улучшил Format-String, поэтому даже нет необходимости проверять, является ли значение числом или текстом.

Обновленный пример кода:

Cell A1: 6102.75    
Cell A2: 6102.75000001

Sub test
  MsgBox Format(Cells(1, 1).Value, "0.0000;@") = Format(Cells(1, 2).Value, "0.0000;@")
End Sub

Используя эту строку формата, функция вернет число, сокращенное до 4 десятичных цифр, если это число, или вернет текст enire, если этотекст.

0 голосов
/ 21 сентября 2018

Используйте IsNumeric, чтобы определить, являются ли два значения числами, затем округлите, чтобы усечь десятичные дроби до 4 разрядов.

Sub compareSheets(shtBefore As String, shtAfter As String)

    Dim mycell As Range
    Dim mydiffs As Integer

    For Each mycell In ActiveWorkbook.Worksheets(shtAfter).UsedRange
        if isnumeric(mycell.Value) and isnumeric(ActiveWorkbook.Worksheets(shtBefore).Cells(mycell.Row, mycell.Column).Value) then

            If round(mycell.Value, 4) <> round(ActiveWorkbook.Worksheets(shtBefore).Cells(mycell.Row, mycell.Column).Value, 4) Then

                mycell.Interior.Color = vbRed
                mydiffs = mydiffs + 1

            end if

        elseif mycell.Value <> ActiveWorkbook.Worksheets(shtBefore).Cells(mycell.Row, mycell.Column).Value then

            mycell.Interior.Color = vbRed
            mydiffs = mydiffs + 1

        end if

    Next mycell 

    'Display a message box stating the number of differences found

    MsgBox mydiffs & " differences found", vbInformation

    ActiveWorkbook.Sheets(shtAfter).Select

End Sub
...