Алгоритм проверки снилс excel

Расчет контрольной суммы снилс

Lhonemzathrum

Дата: Воскресенье, 25.05.2014, 00:09 |
Сообщение № 1

Группа: Пользователи

Ранг: Прохожий

Сообщений: 2


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

Привет всем, есть вопрос насущный, может кто что подскажет. Есть столбец с девятизначными числами, которые являются значениям снилс, но без контрольных сумм. Реально ли в 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Воскресенье, 25.05.2014, 00:09

 

Ответить

AlexM

Дата: Воскресенье, 25.05.2014, 00:43 |
Сообщение № 2

Группа: Друзья

Ранг: Участник клуба

Сообщений: 4257


Репутация:

1046

±

Замечаний:
0% ±


Excel 2003

Покажите файл с СНИЛС и их контрольные суммы. По вашим значениям будут проверяться полученные формулы.



Номер мобильного модема (без голосовой связи)
9269171249 МегаФон, Московский регион.

 

Ответить

MCH

Дата: Воскресенье, 25.05.2014, 01:17 |
Сообщение № 3

Группа: Админы

Ранг: Старожил

Сообщений: 2002


Репутация:

751

±

Замечаний:
±


так нужно?

Код

=ТЕКСТ(ОСТАТ(ОСТАТ(СУММ(ПСТР(A1;{1;2;3;4;5;6;7;8;9};1)*{9;8;7;6;5;4;3;2;1});101);100);»00″)

К сообщению приложен файл:

snils.xlsx
(9.1 Kb)

 

Ответить

krosav4ig

Дата: Воскресенье, 25.05.2014, 02:19 |
Сообщение № 4

Группа: Друзья

Ранг: Старожил

Сообщений: 2346


Репутация:

989

±

Замечаний:
0% ±


Excel 2007,2010,2013

К сообщению приложен файл:

nils.xls
(41.5 Kb)


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

Сообщение отредактировал krosav4igВоскресенье, 25.05.2014, 03:15

 

Ответить

Lhonemzathrum

Дата: Воскресенье, 25.05.2014, 02:33 |
Сообщение № 5

Группа: Пользователи

Ранг: Прохожий

Сообщений: 2


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

MCH, просто шикарно получилось, большое человеческое спасибо!

 

Ответить

zsm

Дата: Среда, 22.11.2017, 05:49 |
Сообщение № 6

Группа: Пользователи

Ранг: Прохожий

Сообщений: 6


Репутация:

0

±

Замечаний:
0% ±


Excel 2003

Добрый день. Подниму темку. А как сделать если СНИЛС начинается с «0»? Например 059-752-471 03.

 

Ответить

Pelena

Дата: Среда, 22.11.2017, 07:49 |
Сообщение № 7

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Код

=ТЕКСТ(ОСТАТ(ОСТАТ(СУММ(ПСТР(ПОДСТАВИТЬ(A1;»-«;»»);{1;2;3;4;5;6;7;8;9};1)*{9;8;7;6;5;4;3;2;1});101);100);»00″)


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

_Boroda_

Дата: Среда, 22.11.2017, 09:20 |
Сообщение № 8

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

Еще вариант с минимальными правками формулы МСН

Код

=ТЕКСТ(ОСТАТ(ОСТАТ(СУММ(ПСТР(A1;{1;2;3;5;6;7;9;10;11};1)*{9;8;7;6;5;4;3;2;1});101);100);»00″)

[p.s.]

как сделать если СНИЛС начинается с «0»?

А какая разница — с нуля или не с нуля? Возможно, у Вас не получалось потому, что у Вас СНИЛС не просто 9 цифр подряд, а с дефисами?[/p.s.]


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

AlexM

Дата: Четверг, 23.11.2017, 19:21 |
Сообщение № 9

Группа: Друзья

Ранг: Участник клуба

Сообщений: 4257


Репутация:

1046

±

Замечаний:
0% ±


Excel 2003

Александр, что-то есть несовпадение результатов разных формул.

К сообщению приложен файл:

0606385.xls
(28.0 Kb)



Номер мобильного модема (без голосовой связи)
9269171249 МегаФон, Московский регион.

 

Ответить

_Boroda_

Дата: Четверг, 23.11.2017, 19:26 |
Сообщение № 10

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

Естественно. Формула писалась для СНИЛСа с дефисами, вот такого 059-752-471 03
А для без дефиса — формула МСН.
А для произвольного — формула Лены


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

AlexM

Дата: Четверг, 23.11.2017, 20:55 |
Сообщение № 11

Группа: Друзья

Ранг: Участник клуба

Сообщений: 4257


Репутация:

1046

±

Замечаний:
0% ±


Excel 2003

Работает как у Лены

Код

=ПРАВБ(0&ОСТАТ(СУММ(ПСТР(ПОДСТАВИТЬ(A1;»-«;);{1;2;3;4;5;6;7;8;9};1)*{9;8;7;6;5;4;3;2;1});101);2)

и массивная

Код

=ПРАВБ(0&ОСТАТ(СУММ(ПСТР(ПОДСТАВИТЬ(A2;»-«;);СТОЛБЕЦ(A:I);1)*(10-СТОЛБЕЦ(A:I)));101);2)



Номер мобильного модема (без голосовой связи)
9269171249 МегаФон, Московский регион.

Сообщение отредактировал AlexMЧетверг, 23.11.2017, 21:07

 

Ответить

Луна

Дата: Понедельник, 14.10.2019, 15:51 |
Сообщение № 12

Группа: Пользователи

Ранг: Прохожий

Сообщений: 1


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

AlexM, есть один снилс, не проходит проверку Вашей формулой, не могу разобраться почему.


«ничего» не понятно, но очень интересно

 

Ответить

 

dixus

Пользователь

Сообщений: 14
Регистрация: 10.12.2015

Здравствуйте товарищи.
Помогите реализовать на VBA Exel 2010 алгоритм проверки СНИЛС при вводе номера снилс в textbox на userForm, выделить красным если неправильный СНИЛС (т.е. контрольное значение не соответствует номеру) и в этом случае вывести сообщение «Проверьте правильность ввода СНИЛС»
Алгоритм проверки контрольного числа КАРТОЧКИ ПЕНСИОННОГО СТРАХОВАНИЯ:
Номер карточки пенсионного страхования (он же СНИЛС) проверяется на валидность контрольным числом. СНИЛС имеет вид: «XXX-XXX-XXX YY», где XXX—XXX-XXX — собственно номер, а YY — контрольное число.
Проверка контрольного числа Страхового номера проводится только для номеров больше номера 001—001-998
Контрольное число СНИЛС рассчитывается следующим образом:
1. Каждая цифра СНИЛС умножается на номер своей позиции (позиции отсчитываются с конца)
2. Полученные произведения суммируются
3. Если сумма меньше 100, то контрольное число равно самой сумме
4. Если сумма равна 100 или 101, то контрольное число равно 00
5. Если сумма больше 101, то сумма делится нацело на 101 и контрольное число определяется остатком от деления аналогично пунктам 3 и 4.
Конкретные примеры:
Указан СНИЛС 112-233-445 95
Проверяем правильность контрольного числа:
цифры номера 1 1 2 2 3 3 4 4 5
номер позиции 9 8 7 6 5 4 3 2 1
Сумма = 1х9 + 1х8 + 2х7 + 2х6 + 3х5 + 3х4 + 4х3 + 4х2 + 5х1 = 95
95 / !101! =95
Контрольное число 95 — указано верно.

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

Были подобные темы , в поиск: проверка ИНН

 

dixus

Пользователь

Сообщений: 14
Регистрация: 10.12.2015

#3

15.12.2015 23:23:10

Цитата
Kuzmich написал: Были подобные темы , в поиск: проверка ИНН

Не то. Хотя все равно немного пригодилось для другого, прикрутил выдачу ошибки при вводе нецифр и пробела в ИНН и СНИЛС. Проверку СНИЛС не нашел поиском

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

Доброе время суток
И что у вас не получается? Можно посмотреть?

 

dixus

Пользователь

Сообщений: 14
Регистрация: 10.12.2015

Прикладываю файл примера, что хочется получить и снимок

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

Я бы регулярками проверял ввод в Texbox1 с шаблоном «^(d{3})-?(d{3})-?(d{3})$» проверял бы правильность ввода первых 9 цифр — сразу бы получал в SubMatches три числа из трёх цифр. Для Texbox2 шаблоном «^d{2}$» проверял ввод двух цифр. Далее по вашим пунктам выбирал бы, используя Mid, очередную цифру из SubMatches с конца, находил бы требуемую сумму, а затем бы сравнивал с числом в Textbox2. Если всё правильно, соединял бы числовые подстроки в одну строку и преобразовывал в число с записью в ячейку. Если, нет то сообщение и фокус ввода на Textbox1.
Как-то так.

 

dixus

Пользователь

Сообщений: 14
Регистрация: 10.12.2015

кнопка цитирования не для ответа [МОДЕРАТОР]

Проблема в том, что я только начинаю методом тыка использовать макросы и формы, поэтому сам так не обработаю. Мне бы код для этого примера в textbox, допилю сам

Изменено: dixus16.12.2015 14:18:35

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#8

17.12.2015 06:04:32

Доброе время суток

Цитата
dixus написал:
Мне бы код для этого примера в textbox, допилю сам

Честно говоря, ничего интересного не вижу в написании подобного кода — только затраты своего времени. Может кому-то будет и интересно, подождите.

 

JeyCi

Пользователь

Сообщений: 3357
Регистрация: 27.11.2013

#9

17.12.2015 11:05:07

Цитата
dixus написал: Мне бы код … допилю сам

ищите по форуму примеры CreateObject(«VBScript.RegExp») — для работы с регулярными выражениями…
совсем подробно здесь —

Объект RegExp

Изменено: JeyCi17.12.2015 11:05:27

чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах)

 

ProMiNick

Пользователь

Сообщений: 1
Регистрация: 04.12.2019

решение без всякого ВБА: тупо через условную подсветку, при заполненном поля класс — тестирует остальные поля, в том числе и подсвечивает СНИЛС, если он не соответствует формату ХХХХХХХХХХХ, где каждый Х — это обязательная цифра (обязательность возможных лидирующих нулей гарантирует только текстовый формат), и где последние 2 цифры расчитываются методом нахождения контрольных сумм для СНИЛС.
работает во всяких отечественных ПО(которые импортозамещение вместо офиса) так как клоны не поддерживают ВБА. В самом МС excel разумеется тоже это работает.

Прикрепленные файлы

  • Каркас.xlsx (11.15 КБ)

 

Юрий М

Модератор

Сообщений: 60577
Регистрация: 14.09.2012

Контакты см. в профиле

#11

04.12.2019 13:24:43

Цитата
ProMiNick написал:
через условную подсветку

Это Вы так называете Условное форматирование? ))

 

GRIM

Пользователь

Сообщений: 232
Регистрация: 21.09.2016

#12

05.12.2019 13:39:46

Похоже на то?

Прикрепленные файлы

  • Пример СНИЛС.xlsm (31.86 КБ)

Изменено: GRIM06.12.2019 21:55:41

Правила расчета контрольного числа СНИЛС

Номер страхового свидетельства обязательного пенсионного страхования состоит из 11 цифр, девять из которых являются его номером, а две последние – контрольным числом. Последнее используется для проверки вероятной ошибки самого номера. Иногда число указано неверно. Чтобы определить ошибку, необходимо проверить его значение. О том, как правильно рассчитать контрольное число СНИЛС, читайте в данной статье.

Алгоритм проверки

Проверка номера СНИЛС на корректность осуществляется с помощью контрольного числа. Сам номер записан в виде

NNN-NNN-NNN KK, где:

NNN-NNN-NNN – номер;

КК – контрольное число.

При этом важно учитывать, что:

  • вычисления подходят для номеров больше 001-001-998;
  • в номере СНИЛС не должно быть трех одинаковых цифр, идущих подряд друг за другом.

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

  • каждый элемент N умножить на порядковый номер, исчисляемый в противоположном порядке (для первого элемента N порядковый номер будет 9, для второго – 8 и т.д.);
  • полученные значения суммировать между собой.

Контрольное число СНИЛС

Определение контрольного числа

Полученное значение сравнивается относительно цифры 100. Если оно:

  • меньше 100, то контрольное число равно самой сумме;
  • равно 100 или 101, то контрольное число – 00;
  • больше 101, то его необходимо нацело разделить на 101. Если значение меньше 300, допустимо находить его не делением, а вычитанием из него цифры 101, до тех пор, пока полученная цифра не будет меньше 100. Полученное значение определяется по двум пунктам, указанным выше.

Пример. Для примера использован следующий номер СНИЛС: 160-722-773 54. Для осуществления проверки необходимо определить порядок каждого значения и умножить его на это число, а затем суммировать их между собой. Таким, образом: (1*9) + (6*8) + (0*7) + (7*6) + (2*5) + (2*4) + (7*3) + (7*2) + (3*1) = 9 + 48 + 0 + 42 + 10 + 8 + 21 + 14 + 3 = 155. Полученное число больше 101, но меньше 300, значит из него необходимо произвести вычитание 155 — 101 = 54. Как видно из полученного результата, контрольное значение верное.

Дорогие читатели!

Наши статьи рассказывают о типовых способах решения юридических
вопросов, но каждый случай носит уникальный характер.
Если вы хотите узнать, как решить именно Вашу проблему —
обращайтесь в форму онлайн-консультанта

Это быстро и бесплатно! Или звоните нам по телефонам (круглосуточно):

Если вы хотите узнать, как решить именно Вашу проблему — позвоните нам по телефону.
Это быстро и бесплатно!

Читать еще

  • Наличие у гражданина Российской Федерации свидетельства пенсионного страхования говорит о том, что он прошел государственную регистрацию в системе ОМС …

  • С каждым днем учащаются случаи обмана граждан РФ, где фигурирует использование номера СНИЛС. Наибольшее количество вопросов, возникающих у граждан по …

  • В Российской Федерации разрешены любые верования и конфессии, если они не противоречат Конституции РФ. Поэтому для тех граждан (в том числе, православ …

  • Случается, что страхового свидетельства обязательного пенсионного страхования, в котором указан страховой номер индивидуального лицевого счета (СНИЛС) …

Перейти к основному содержанию

В начало

Электронные ресурсы


Свернуть



Развернуть

ЭЛЕКТРОННЫЕ КАТАЛОГИ
ПОЛНОТЕКСТОВЫЕ КНИГИ
ПОЛНОТЕКСТОВАЯ КОЛЛЕКЦИЯ КНИТУ
ПОЛНОТЕКСТОВАЯ ПЕРИОДИКА

###


Требуемые условия завершения

Проверка по методу контрольных сумм- https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D1%87%D0%B8%D1%81%D0%BB%D0%BE

  1. Создать файл excel для проверки документа. Ячейки номеров снилс сделать крупнее стандартных и цветными. Ячейки сделать списком с выбором одной из 10 цифр(первая не ноль). Список значений в виде выпадающего меню формируется в разделе -Данные- проверка данных). Тип данных –выбрать список. Через точку с запятой перечислить цифры.
  1. В ячейке справа сделать проверку номера и вывод да или нет(проверка по контрольной сумме)

=ЕСЛИ(I10*2+J10*3=5;»yes»;»no»)

Последнее изменение: суббота, 18 января 2020, 11:15

На платформе Moodle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
Option Explicit
 
Const c1 = "алан.александр.алексей.альберт.анатолий.андрей.антон.арсен.арсений.артем.артемий.артур.богдан.борис.вадим.валентин.валерий.василий.виктор.виталий.владимир.владислав.всеволод.вячеслав.геннадий.георгий.герман.глеб.гордей.григорий.давид.дамир.даниил.демид.демьян.денис.дмитрий.евгений.егор.елисей.захар.иван.игнат.игорь.илья.ильяс.камиль.карим.кирилл.клим.константин.лев.леонид.макар.максим.марат.марк.марсель.матвей.мирон.мирослав.михаил.назар.никита.николай.олег.павел.петр.платон.прохор.рамиль.ратмир.ринат.роберт.родион.роман.ростислав.руслан.рустам.савва.савелий.святослав.семен.сергей.станислав.степан.тамерлан.тимофей.тимур.тихон.федор.филипп.шамиль.эдуард.эльдар.эмиль.эрик.юрий.ян.ярослав"
Const c2 = "агата.агния.аделина.аида.аксинья.александра.алена.алина.алиса.алия.алла.альбина.амелия.амина.анастасия.ангелина.анна.антонина.ариана.арина.валентина.валерия.варвара.василина.василиса.вера.вероника.виктория.виолетта.владислава.галина.дарина.дарья.диана.дина.ева.евангелина.евгения.екатерина.елена.елизавета.есения.жанна.зарина.злата.илона.инна.ирина.камилла.карина.каролина.кира.клавдия.кристина.ксения.лариса.лейла.лиана.лидия.лилия.лина.лия.любовь.людмила.майя.маргарита.марианна.марина.мария.мелания.мила.милана.милена.мирослава.надежда.наталья.нелли.ника.нина.оксана.олеся.ольга.полина.регина.сабина.светлана.софия.стефания.таисия.тамара.татьяна.ульяна.эвелина.элина.эльвира.эльмира.эмилия.юлия.яна.ярослава"
Const c3 = "александрович.алексеевич.анатольевич.андреевич.антонович.аркадьевич.артемович.бедросович.богданович.борисович.валентинович.валерьевич.васильевич.викторович.витальевич.владимирович.владиславович.вольфович.вячеславович.геннадиевич.георгиевич.григорьевич.данилович.денисович.дмитриевич.евгеньевич.егорович.ефимович.иванович.иваныч.игнатьевич.игоревич.ильич.иосифович.исаакович.кириллович.константинович.леонидович.львович.максимович.матвеевич.михайлович.николаевич.олегович.павлович.палыч.петрович.платонович.робертович.романович.саныч.северинович.семенович.сергеевич.станиславович.степанович.тарасович.тимофеевич.федорович.феликсович.филиппович.эдуардович.юрьевич.яковлевич.ярославович"
Const c4 = "александровна.алексеевна.анатольевна.андреевна.антоновна.аркадьевна.артемовна.богдановна.борисовна.валентиновна.валерьевна.васильевна.викторовна.виталиевна.владимировна.владиславовна.вячеславовна.геннадиевна.георгиевна.григорьевна.даниловна.денисовна.дмитриевна.евгеньевна.егоровна.ефимовна.ивановна.игоревна.ильинична.иосифовна.кирилловна.константиновна.леонидовна.львовна.максимовна.матвеевна.михайловна.николаевна.олеговна.павловна.петровна.платоновна.робертовна.романовна.семеновна.сергеевна.станиславовна.степановна.тарасовна.тимофеевна.федоровна.феликсовна.филипповна.эдуардовна.юрьевна.яковлевна.ярославовна"
Const c5 = "абрамов.александров.алексеев.андреев.антонов.афанасьев.баранов.белов.беляев.богданов.борисов.быков.васильев.виноградов.власов.волков.воробьев.воронин.гаврилов.герасимов.голубев.григорьев.гусев.давыдов.данилов.денисов.дмитриев.егоров.ефимов.жуков.зайцев.захаров.иванов.ильин.исаев.казаков.калинин.карпов.киселев.климов.ковалев.козлов.комаров.коновалов.королев.крылов.кудрявцев.кузнецов.кузьмин.куликов.лазарев.лебедев.макаров.максимов.марков.мартынов.маслов.матвеев.медведев.мельников.миронов.михайлов.морозов.назаров.никитин.николаев.новиков.орлов.осипов.павлов.петров.поляков.пономарев.попов.прохоров.родионов.романов.савельев.семенов.сергеев.сидоров.смирнов.соколов.соловьев.сорокин.степанов.тарасов.тимофеев.титов.тихонов.федоров.федотов.филатов.филиппов.фомин.фролов.чернов.чернышев.щербаков.яковлев"
Const frmSnils = "000-000-000 00", frmINN10 = "0000-00000-0", frmINN12 = "0000-000000-00"
Const inn10 = "2 4 10 3 5 9 4 6 8", inn12_1 = "7 2 4 10 3 5 9 4 6 8", inn12_2 = "3 7 2 4 10 3 5 9 4 6 8"
 
#If Win64 Then
   Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#Else
   Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If
 
Dim WithEvents Tx As MSForms.TextBox, WithEvents cb As MSForms.CommandButton
Dim WithEvents cbb1 As CommandBarButton, WithEvents cbb2 As CommandBarButton
Dim colCueBan As New Collection
 
 
 
Function OnlyNum$(ByVal text$)
        Dim i&
        'Возврат всех чисел из текста
        For i = 1 To Len(text)
            If Mid$(text, i, 1) Like "#" Then OnlyNum = OnlyNum & Mid$(text, i, 1)
        Next
End Function
 
 
Private Sub tx_LostFocus(objLost As Object, Got$)
 
    Dim s$, ss$, Filtr$, i&, j&, d#, a$(), v, InpErr As Boolean
 
    If Got = "cb7" Then Exit Sub 'Для всех полей игнорируется кнопка "Очистить все"
    
    
    If Got Like "cb#*" Then
        Select Case Got
        Case "cb11", "cb12" 'Проверка ввода если фокус переведен на эти кнопки
        Case Else: Exit Sub 'Проверка не нужна
        End Select
    End If
    
    s = objLost.text
    If s = "" Then Exit Sub
    
    Select Case objLost.Name
    Case "tx1" 'Проверка ФИО
 
        s = LCase(s)
        'Находим первый алфавитый символ
        For i = 1 To Len(s)
            If Mid$(s, i, 1) Like "[a-zа-яё]" Then Exit For
        Next: s = Mid$(s, i)
       
 
        'Убираем передний пробел у точки и добавляем его справа
        While InStr(s, " .") > 0: s = Replace(s, " .", "."): Wend: s = Replace(s, ".", ". ")
        'Убираем лишние пробелы
        s = Trim(s): While InStr(s, "  ") > 0: s = Replace(s, "  ", " "): Wend
        'Объеденяем слова с дефисом
        s = Replace(Replace(s, "- ", "-"), " -", "-")
        'Проверка расстановки знаков
        InpErr = InpErr Or InStr(s, "-.") Or InStr(s, ".-")
        'Проверка написания в одной расскладке
 
        ss = Replace(Replace(Replace(s, ".", ""), "-", ""), " ", "")
        If Len(ss) >= 3 Then
            If Left(ss, 1) Like "[!a-zа-яё]" Then
                InpErr = True
            Else
                Filtr = IIf(Left(ss, 1) Like "[a-z]", "[!a-z]", "[!а-яё]")
                For i = 2 To Len(ss)
                    If Mid$(ss, i, 1) Like Filtr Then InpErr = True: Exit For
                Next
            End If
        Else: InpErr = True
        End If
        'Каждое слово с большой буквы
        a = Split(s, "-"): For i = 0 To UBound(a): a(i) = UCase(Left$(a(i), 1)) & Mid$(a(i), 2): Next: s = Join(a, "-") 'Между дефисом
        a = Split(s): For i = 0 To UBound(a): a(i) = UCase(Left$(a(i), 1)) & Mid$(a(i), 2): Next: s = Join(a) 'Между пробелом
        
        'Проверка трех слов ФИО
        InpErr = InpErr Or UBound(a) <> 2
        If InpErr Then MsgValidate objLost, "Неверный ввод ФИО/Текст должен иметь одну расскладку/без специальных знаков и цифр,/состоять из трех отдельных слов./Допускается дефис и точка": Exit Sub
        objLost.text = s
    Case "tx2" 'Проверка Даты
        If IsDate(objLost.text) Then
            objLost.text = CDate(s)
        Else
            If InpErr Then MsgValidate objLost, "Неверная дата или формат даты/Допустимые форматы: /[дата.месяц.год]  [дата/месяц/год]  [дата.месяц]/[дата-месяц-год]  [1 янв 2019] "
        End If
    Case "tx3" 'Проверка СНИЛС
        s = OnlyNum(s): d = 0
        If Len(s) <> 11 Then
            InpErr = True
        ElseIf CDbl(s) < 1001999 Then
            InpErr = True
        Else
            For i = 1 To 9: d = d + (10 - i) * Mid$(s, i, 1): Next
            If Format((d Mod 101) Mod 100, "00") <> Right$(s, 2) Then InpErr = True
        End If
        If InpErr Then MsgValidate objLost, "Неверный ввод СНИЛС/Необходимо ввести 11 цифр./Требуется совпадение контрольной суммы.": Exit Sub
        SetText objLost, s, frmSnils
        
    Case "tx4" 'Проверка ИНН
        s = OnlyNum(s)
        If Len(s) = 10 Then 'Расчет для юр-лиц
            a = Split(inn10): d = 0
            For i = 0 To UBound(a)
                d = d + a(i) * Mid$(s, i + 1, 1)
            Next
            If ((d Mod 11) Mod 10) <> Mid$(s, i + 1, 1) Then InpErr = True
            
        ElseIf Len(s) = 12 Then 'Расчет для физ-лиц
            For j = 1 To 2
                a = Split(Choose(j, inn12_1, inn12_2)): d = 0
                For i = 0 To UBound(a)
                    d = d + a(i) * Mid$(s, i + 1, 1)
                Next
                If ((d Mod 11) Mod 10) <> Mid$(s, i + 1, 1) Then InpErr = True
            Next
        End If
        If InpErr Then MsgValidate objLost, "Неверный ИНН/Для юридических лиц 10 цифр, для физических 12./Требуется совпадение контрольной суммы.": Exit Sub
    End Select
    
End Sub
 
Sub SetText(Tx As Object, text$, Optional ByVal TxFormat$)
    If text = "" Then Exit Sub
    With Tx
        .text = Format(text, TxFormat)
        .ForeColor = vbWindowText
    End With
End Sub
 
Sub Any_Click(ByVal DesText$)
    Dim s$, i&, j&, d#, v, b As Boolean
    Randomize Timer
    Select Case DesText
    Case "cb1_1", "cb1_2" 'Генерация ФИО
        b = DesText = "cb1_1"
        v = IIf(b, Array(c5, c1, c3), Array(c5, c2, c4))
        For i = 0 To UBound(v)
            v(i) = Split(v(i), ".")
            s = s & " " & v(i)(Fix(Rnd * (UBound(v(i)) + 1)))
        Next
        v = Split(Mid$(s, 2))
        For i = 0 To UBound(v)
            If i = 0 And Not b Then v(i) = v(i) & "а"
            v(i) = UCase(Left$(v(i), 1)) & Mid$(v(i), 2)
        Next
        SetText Controls("tx1"), Join(v)
    Case "cb2" '--------------Генерация даты с 1900 по 2019 годов
        SetText Controls("tx2"), CDate(Fix(Rnd * 43465) + 2)
    Case "cb3" 'Генерация СНИЛС
        s = Space(11): d = 0
        For i = 1 To 9
            j = IIf(i = 2, Fix(Rnd * 9) + 1, Fix(Rnd * 10))
            Mid$(s, i, 1) = j
            d = d + (10 - i) * j
        Next
        Mid$(s, i, 2) = Format(((d Mod 101) Mod 100), "00")
        SetText Controls("tx3"), s, frmSnils
    Case "cb4_1", "cb4_2" 'Генерация ИНН
        If DesText = "cb4_1" Then
            s = Space(12)
            v = Split(inn12_1): d = 0
            For i = 1 To 10
                j = IIf(i = 2, Fix(Rnd * 9) + 1, Fix(Rnd * 10))
                Mid$(s, i, 1) = j
                d = d + v(i - 1) * j
            Next
            Mid$(s, i, 1) = (d Mod 11) Mod 10
            v = Split(inn12_2): d = 0
            For i = 1 To 11
                d = d + v(i - 1) * Mid$(s, i, 1)
            Next
            Mid$(s, i, 1) = (d Mod 11) Mod 10
        Else
            s = Space(10)
            v = Split(inn10): d = 0
            For i = 1 To 9
                j = IIf(i = 2, Fix(Rnd * 9) + 1, Fix(Rnd * 10))
                Mid$(s, i, 1) = j
                d = d + v(i - 1) * j
            Next
            Mid$(s, i, 1) = (d Mod 11) Mod 10
        End If
        SetText Controls("tx4"), s, IIf(DesText = "cb4_1", frmINN12, frmINN10)
    Case "cb11" '-------------------------Вывод на лист"
        With ActiveSheet '----------Здесь можно назначить свой лист напр. Sheet("Лист1")
            i = .Cells(.Rows.Count, 1).End(xlUp).Row
            If i = 1 Then
                j = 0: For Each v In Controls
                    If v.Name Like "tx#*" Then
                        j = j + 1: With .Cells(i, j)
                            .Font.Bold = True
                            .HorizontalAlignment = xlCenter
                            .Value = colCueBan(v.Name)
                            .CurrentRegion.EntireColumn.AutoFit
                        End With
                    End If
                Next
            End If
            j = 0: For Each v In Controls
                If v.Name Like "tx#*" Then
                    j = j + 1: With .Cells(i + 1, j)
                        If v.ForeColor = vbWindowText Then
                            .Value = v.text
                            .CurrentRegion.EntireColumn.AutoFit
                        End If
                    End With
                End If
            Next
        End With
    Case "cb12" 'Копирование"
        
        For Each v In Controls
            If v.Name Like "tx#*" Then
                If v.ForeColor = vbWindowText Then
                    s = s & vbLf & colCueBan(v.Name) & vbTab & v.text
                End If
            End If
        Next
        With New DataObject
            .Clear
            .SetText Mid$(s, 2)
            .PutInClipboard
        End With
        
    Case "cb13" 'Очистить все"
        For Each v In Controls
            If v.Name Like "tx#*" Then v.text = ""
        Next
        CheckBaner
    End Select
End Sub
 
 
 
Private Sub cbb1_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
    Any_Click Ctrl.DescriptionText
End Sub
 
Private Sub cbb2_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
    Any_Click Ctrl.DescriptionText
End Sub
 
 
Private Sub cb_Click()
    Dim v, i&, j&
    Select Case cb.Name
    Case "cb1", "cb4"
        On Error Resume Next
        Application.CommandBars("mnu").Delete
        With Application.CommandBars.Add("mnu", msoBarPopup)
            For i = 1 To 2
                
                With .Controls.Add(msoControlButton)
                    Select Case cb.Name
                    Case "cb1": .Caption = Choose(i, "Мужчина", "Женщина")
                    Case "cb4": .Caption = Choose(i, "Физ. лицо", "Юр. лицо")
                    End Select
                    .FaceId = 59
                    .DescriptionText = cb.Name & "_" & i
                End With
            Next
            Set cbb1 = .Controls(1)
            Set cbb2 = .Controls(2)
            If Application.WindowState = xlMinimized Then Any_Click cb.Name & "_" & 1 Else .ShowPopup
 
        End With
 
    Case Else 'Прочие кнопки без меню
        Any_Click cb.Name
    End Select
End Sub
 
 
Private Sub MsgValidate(obj As Object, ByVal text$, Optional ByVal buttons = vbExclamation, Optional ByVal delemiter = "/")
    '
    'Вывод сообщений
    '
    obj.SetFocus
    MsgBox Replace(text, delemiter, vbLf), buttons
End Sub
 
Private Sub CheckBaner()
    Dim Focus$, v
    Focus = ActiveControl.Name
    For Each v In Controls
        If v.Name Like "tx#*" Then
            If v.text = "" And v.Name <> Focus Then
                v.ForeColor = vb3DShadow
                v.text = colCueBan(v.Name)
            ElseIf v.ForeColor = vb3DShadow And v.Name = Focus Then
                v.ForeColor = vbWindowText
                v.text = ""
            End If
        End If
    Next
End Sub
 
Private Sub NewFocus(ByVal Lost$, ByVal Got$)
    
    If Got Like "tx#*" Then
        Set Tx = Controls(Got)
        Tx.SetFocus
    ElseIf Got Like "cb#*" Then
         Set cb = Controls(Got)
    End If
    If Lost Like "tx#*" Then
        tx_LostFocus Controls(Lost), Got
    End If
    CheckBaner
End Sub
 
 
 
 
Private Sub UserForm_Activate()
    Dim curCtrl$
    curCtrl = ActiveControl.Name
    Controls("cb1").SetFocus
    CheckBaner
    Do: DoEvents: Sleep 10
        If curCtrl <> ActiveControl.Name Then _
        NewFocus curCtrl, ActiveControl.Name: curCtrl = ActiveControl.Name
    Loop
End Sub
 
Private Sub UserForm_Initialize()
    Const r = 7, tp = 4, fields = 4
    Dim i&, j&, ctProgId$, ctName$, cLeft&, ctWidth&, s$
    
    For i = 1 To fields
        cLeft = r
        For j = 1 To 2
            ctProgId = "forms." & Choose(j, "textbox", "commandbutton") & ".1"
            ctName = Choose(j, "tx", "cb") & i
            ctWidth = Choose(j, r * 30, r * 4)
            With Controls.Add(ctProgId, ctName, 1)
                .Move cLeft, (i - 1) * r * tp + r, ctWidth, r * (tp - 1)
                s = Choose(i, "ФИО", "Дата рождения", "СНИЛС", "ИНН")
                If .Name Like "tx#*" Then
                    colCueBan.Add s, .Name
                ElseIf .Name Like "cb#*" Then
                    .Caption = "G"
                    .ControlTipText = "Сгенерировать " & s
                End If
                cLeft = cLeft + .Width + r
            End With
        Next
    Next
    
    cLeft = r
    For j = 1 To 3
        ctWidth = r * 10
        With Controls.Add("forms.commandbutton.1", "cb" & 10 + j, 1)
            .Move cLeft, (i - 1) * r * tp + r, ctWidth, r * (tp - 1)
            .Caption = Choose(j, "Вывести на лист", "Копировать", "Очистить все")
            cLeft = cLeft + .Width + r
        End With
    Next
    With Me
         .Move .Left, .Top, r * 40, r * 26
         .Caption = "Ввод данных"
    End With
 
End Sub
 
Private Sub UserForm_Terminate()
    End
End Sub

Понравилась статья? Поделить с друзьями:
  • Алгоритм построения диаграмм в microsoft excel
  • Алгоритм построения графиков excel
  • Алгоритм построения графика excel
  • Алгоритм поиска решений excel
  • Алгоритм подготовки таблицы к печати excel