Привет всем, есть вопрос насущный, может кто что подскажет. Есть столбец с девятизначными числами, которые являются значениям снилс, но без контрольных сумм. Реально ли в excel высчитать значения массово для всего столбца? Алгоритм формирования контрольного числа СНИЛС таков (цитирую): 1) Проверка контрольного числа Страхового номера проводится только для номеров больше номера 001—001-998 2) Контрольное число СНИЛС рассчитывается следующим образом: 2.1) Каждая цифра СНИЛС умножается на номер своей позиции (позиции отсчитываются с конца) 2.2) Полученные произведения суммируются 2.3) Если сумма меньше 100, то контрольное число равно самой сумме 2.4) Если сумма равна 100 или 101, то контрольное число равно 00 2.5) Если сумма больше 101, то сумма делится нацело на 101 и контрольное число определяется остатком от деления аналогично пунктам 2.3 и 2.4 Есть мнение, что алгоритмически удобнее сумму не делить нацело на 101, а из суммы циклически вычитать 101 до тех пор, пока остаток от вычитания не будет меньше 102. Хотя по сути это и есть «деление нацело». Работаю в этой сфере, поэтому вопрос животрепещущий. Подскажите кто знает!
Привет всем, есть вопрос насущный, может кто что подскажет. Есть столбец с девятизначными числами, которые являются значениям снилс, но без контрольных сумм. Реально ли в excel высчитать значения массово для всего столбца? Алгоритм формирования контрольного числа СНИЛС таков (цитирую): 1) Проверка контрольного числа Страхового номера проводится только для номеров больше номера 001—001-998 2) Контрольное число СНИЛС рассчитывается следующим образом: 2.1) Каждая цифра СНИЛС умножается на номер своей позиции (позиции отсчитываются с конца) 2.2) Полученные произведения суммируются 2.3) Если сумма меньше 100, то контрольное число равно самой сумме 2.4) Если сумма равна 100 или 101, то контрольное число равно 00 2.5) Если сумма больше 101, то сумма делится нацело на 101 и контрольное число определяется остатком от деления аналогично пунктам 2.3 и 2.4 Есть мнение, что алгоритмически удобнее сумму не делить нацело на 101, а из суммы циклически вычитать 101 до тех пор, пока остаток от вычитания не будет меньше 102. Хотя по сути это и есть «деление нацело». Работаю в этой сфере, поэтому вопрос животрепещущий. Подскажите кто знает!Lhonemzathrum
Сообщение отредактировал Lhonemzathrum - Воскресенье, 25.05.2014, 00:09
Public Function VerSnils(snilstxt As String, v As Boolean) Dim i%, j%, ms$ Dim kt$, s$ Dim t t = Trim(snilstxt): kt = Right(t, 2) Do While InStr(1, t, "-") > 0 t = Replace(t, "-", "") Loop t = (Mid(t, 1, 9)) Do While InStr(1, t, " ") > 0 t = Replace(t, " ", "") Loop t = Val(t) For i = 1 To 9 j = j + (10 - i) * (t \ (10 ^ (9 - i)) Mod 10) Next i Select Case j Case 100, 101: s = "00" Case Is > 101: s = CStr(j Mod 101) Case Else: s = CStr(j) End Select If v Then VerSnils = CBool(IIf(kt = s, 1, 0)) Else VerSnils = s End If End Function
[/vba]
[vba]
Код
Public Function VerSnils(snilstxt As String, v As Boolean) Dim i%, j%, ms$ Dim kt$, s$ Dim t t = Trim(snilstxt): kt = Right(t, 2) Do While InStr(1, t, "-") > 0 t = Replace(t, "-", "") Loop t = (Mid(t, 1, 9)) Do While InStr(1, t, " ") > 0 t = Replace(t, " ", "") Loop t = Val(t) For i = 1 To 9 j = j + (10 - i) * (t \ (10 ^ (9 - i)) Mod 10) Next i Select Case j Case 100, 101: s = "00" Case Is > 101: s = CStr(j Mod 101) Case Else: s = CStr(j) End Select If v Then VerSnils = CBool(IIf(kt = s, 1, 0)) Else VerSnils = s End If End Function
Естественно. Формула писалась для СНИЛСа с дефисами, вот такого 059-752-471 03 А для без дефиса - формула МСН. А для произвольного - формула Лены
Естественно. Формула писалась для СНИЛСа с дефисами, вот такого 059-752-471 03 А для без дефиса - формула МСН. А для произвольного - формула Лены_Boroda_