Сравнивая 2 числа в VBA - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь сравнить 2 3-значные числа. Это мой текущий код с использованием вложенного Ifs

If Mid(Num1, 1, 1) = Mid(Num2, 1, 1) Then  
'Check first number against first number

If Mid(Num1, 2, 1) = Mid(Num2, 2, 1) Then 
 'Check second number against second number


   If Mid(Num1, 3, 1) = Mid(Num2, 3, 1) Then  
    'Check third number against third number 

        Digits = 3

    Else

        Digits = 2

    End If

И это только одна маленькая часть этого. Также мне нужно проверить, в каком порядке они совпадают. Так что, является ли это точным соответствием, все 3 цифры совпадают в любом порядке, или если 1 или 2 цифры совпадают в любом порядке.

Проблема в том, что у меня много операторов If, использующих этот метод, поскольку мне приходится сравнивать каждую комбинацию цифр для проверки на совпадение 1 цифры, 2 цифры, 3 цифры и т. Д. Есть ли лучший способ?

Ответы [ 3 ]

1 голос
/ 13 марта 2019

В своем ответе я возвращаю совпадающие цифры, чтобы вы могли проверить, есть ли какие-либо и какие. Также работает с любым количеством цифр.

Public Function CheckForMatch(ByVal curNum As String, ByVal winNumber As String) As String

    Dim i As Long, j As Long

     Dim hit As String
     hit = vbNullString

     For i = 1 To Len(curNum)
        j = InStr(1, winNumber, Mid(curNum, i, 1), vbTextCompare)
        If j > 0 Then
            hit = hit & Mid(curNum, i, 1)
        End If
    Next i

    CheckForMatch = hit
End Function

Public Sub Test()

    Dim check As String

    check = CheckForMatch("75214", "13672")

    If Len(check) > 0 Then
        Debug.Print "Numbers " & check & " are a match."
        ' 721
    Else
        Debug.Print "No match. Sorry."
    End If

End Sub

ПРИМЕЧАНИЕ: использование InStr() здесь было вдохновлено ответом, который Rawplus дал мне.

1 голос
/ 13 марта 2019

Может быть упрощено до function с помощью простой for петли

Private Function digitMatch(ByVal num1 as String, ByVal num2 as String) As Byte
 ' num1 and num2 are strings, because of presumption they can start with 0
 ' (i.e. 042 is valid 3 digit number format, otherwise they can be integers as well)

  Dim i As Byte
  Dim matches As Byte: matches = 0

  For i = 1 To Len(num1)
     If InStr(1, num2, Mid(num1, i, 1)) <> 0 Then
        matches = matches + 1
     End If
  Next i

  digitMatch = matches

End Function

так, например. digitMatch(023, 053) вернется 2 или digitMatch(123, 321) вернет 3

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

Попробуйте (это будет работать корректно, только если curNum и WinningNumber длиной 3 цифры):

'straight match
If curNum = WinningNumber Then
    M = 3
    s = 3
'matched the first 2 straight
ElseIf InStr(1, WinningNumber, Left(curNum, 2)) > 0 Then
    M = 2
    s = 2
    If InStr(1, WinningNumber, Right(curNum, 1)) > 0 Then M = M + 1
'matched the last 2 straight
ElseIf InStr(2, WinningNumber, Right(curNum, 2)) > 0 Then
    M = 2
    s = 2
    If InStr(1, WinningNumber, Left(curNum, 1)) > 0 Then M = M + 1
'any other scenario
Else
    s = 0
    For i = 1 To 3
        n = Mid(WinningNumber, i, 1)
        If InStr(1, curNum, n) > 0 Then
            M = M + 1
        End If
    Next
End If

Debug.Print "Matched digits: " & M
Debug.Print "Straight: " & s

Я уверен, что есть лучший способ сделать это, но для меня это был самый простой способ написать это быстро.

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