Проверка чилийского RUT с использованием Target.Значение в 2 столбцах

#excel #vba

#excel #vba

Вопрос:

Я пытаюсь проверить чилийский RUT (12345678-9), используя математический алгоритм, который работает отлично, но процедура применяется только тогда, когда RUT хранится в одной ячейке. Таким образом, когда пользователь вводит RUT, он отображает MsgBox , сообщая пользователю результат.

 RUT
----------
01234567-8 ' MSGBOX "THIS IS CORRECT/INCORRECT."
  

Теперь наша база данных хранит RUT в двух частях: сам RUT 01234567 и контрольную цифру — число после символа оценки — 8 .
Я думал о способе сохранения и проверки RUT при изменении столбца контрольных цифр, но я не могу понять, как сохранить оба значения одновременно, используя Target.Value .
Наш «шаблон» Excel для базы данных

 RUT          DV
----------------
01234567     8  ' DISPLAY ALERT AS SOON AS DV IS ADDED?
  

Мой код проверяет одну ячейку:

 Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Columns("C")) Is Nothing Then
    On Error Resume Next
    
    rute = Target.Value
    arut = UCase(Target.Value)

    Rut = Replace("0000" amp; Rut, ".", "", 1)
    If InStr(1, Rut, "-") > 0 Then Rut = Left(rute, InStr(1, rute, "-") - 1)
    Rut = Right(rute, 8)
    suma = 0
    For i = 1 To 8
    suma = suma   Val(Mid(rute, i, 1)) * Val(Mid("32765432", i, 1))
    Next i
    dv = 11 - (suma Mod 11)
    If dv = 10 Then dv = "K"
    If dv = 11 Then dv = 0

    'If Right(arut, 1) = CStr(dv) Then MsgBox ("Rut " amp; rute amp; " Correcto")
    If Right(arut, 1) <> CStr(dv) Then MsgBox ("Rut: " amp; rute amp; " Incorrecto.")
    If rute = "" Then MsgBox ("Campo(s) modificado(s).")
End If
End Sub
  

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

ПРИМЕЧАНИЕ: Формула в ячейке невозможна из-за требований.

Комментарии:

1. Вам не нужно использовать только Target.Value — вы можете получить доступ к обеим частям RUT с помощью (например) Target.EntireRow.Cells(1).Value и Target.EntireRow.Cells(2).Value

Ответ №1:

Вот пример (без вашего проверочного кода)

 Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rng As Range, rute, chk, c As Range

    Set rng = Intersect(Target, Me.Range("C:D"))

    If Not rng Is Nothing Then
        For Each c in rng.cells

            rute = c.entirerow.cells(3).value
            chk = c.entirerow.cells(4).value

            'validate rute and chk here and
            '  show msgbox if needed


        Next c   
    End If

End Sub