Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Visual Basic Новый топик    Ответить
 Перевод кода в VBA из Delphi  [new]
kristin
Member

Откуда:
Сообщений: 7
Здравствуйте! Такая задача: мне дали код программы, которая работает в Delphi(см приложение 1), она проверяет правильность ИНН в соответствии с приведенным алгоритмом. Мне нужно перетащить этот код в макрос в VBA в Excel(е), чтобы он работал. В Excel(е) есть столбец ИНН, нужно чтоб при запуске макроса шла проверка на соответствие ИНН данным условиям, если ИНН не проходит проверку, то в столбце напротив выдавалось сообщение об ошибке.
Я просто совсем не владею Delphi, а время на изучение нет совсем, отчет нужно сдать на днях. Поэтому очень надеюсь на вашу помощь!

Пример: ИНН Сообщение об ошибке:
7740000051
6163024016
111111 Ошибочное ИНН
3443051345
3603006255

Рабочий код программы в Delphi:

unit checkINN;
interface
uses SysUtils, Dialogs;

type
TDinamicIntArr = array [1..11] of Integer;

function isINNValid(INN: String): Boolean;

implementation

function isINNValid(INN: String): Boolean;
var mult_10, mult_12_1, mult_12_2 : TDinamicIntArr;
SumMult1, SumMult2, Kontr1, Kontr2, i: Integer;
begin
SumMult1:=0;
SumMult2:=0;

//Массив множителей для 10-значного ИНН
mult_10[1]:=2;
mult_10[2]:=4;
mult_10[3]:=10;
mult_10[4]:=3;
mult_10[5]:=5;
mult_10[6]:=9;
mult_10[7]:=4;
mult_10[8]:=6;
mult_10[9]:=8;
//************************************

//Массив множителей для 12-значного ИНН (1 контр.цифра)
mult_12_1[1]:=7;
mult_12_1[2]:=2;
mult_12_1[3]:=4;
mult_12_1[4]:=10;
mult_12_1[5]:=3;
mult_12_1[6]:=5;
mult_12_1[7]:=9;
mult_12_1[8]:=4;
mult_12_1[9]:=6;
mult_12_1[10]:=8;
//************************************

//Массив множителей для 12-значного ИНН (2 контр.цифра)
mult_12_2[1]:=3;
mult_12_2[2]:=7;
mult_12_2[3]:=2;
mult_12_2[4]:=4;
mult_12_2[5]:=10;
mult_12_2[6]:=3;
mult_12_2[7]:=5;
mult_12_2[8]:=9;
mult_12_2[9]:=4;
mult_12_2[10]:=6;
mult_12_2[11]:=8;
//************************************

if( length(INN)=10 ) then
begin
//10 значный ИНН
for i:=1 to 9 do
begin
SumMult1:=SumMult1 + ( StrToInt(Copy(INN, i, 1)) * mult_10 );
end;

Kontr1:=(SumMult1 mod 11) mod 10;

if( Kontr1 = StrToInt(Copy(INN, Length(INN), 1)) ) then
begin Result:=True; end
else
begin Result:=False; end;
end
else
begin
//12 значный ИНН
for i:=1 to 10 do
begin
SumMult1:=SumMult1 + ( StrToInt(Copy(INN, i, 1)) * mult_12_1 );
end;

Kontr1:=(SumMult1 mod 11) mod 10;

for i:=1 to 11 do
begin
SumMult2:=SumMult2 + ( StrToInt(Copy(INN, i, 1)) * mult_12_2 );
end;

Kontr2:=(SumMult2 mod 11) mod 10;

if( (Kontr1 = StrToInt(Copy(INN, Length(INN)-1, 1))) AND (Kontr2 = StrToInt(Copy(INN, Length(INN), 1))) ) then
begin Result:=True; end
else
begin Result:=False; end;
end;

end;
end.
18 авг 08, 21:56    [6080918]     Ответить | Цитировать Сообщить модератору
 Re: Перевод кода в VBA из Delphi  [new]
AndrF
Member

Откуда:
Сообщений: 1964
Разбираться с твоим кодом лень, потому держи просто функцию проверки ИНН:

Public Function ПроверкаИНН(sInn As String) As Boolean
    sInn = Trim$(sInn)
    Select Case Len(sInn)
        Case 10: ПроверкаИНН = ПроверкаИНН10(sInn)
        Case 12: ПроверкаИНН = ПроверкаИНН12(sInn)
    End Select
End Function

Private Function ПроверкаИНН10(sInn As String) As Boolean
    Dim i As Integer, s As String, j As Integer, v As Variant
    
    v = Array(2, 4, 10, 3, 5, 9, 4, 6, 8, 0)
    For i = 1 To 10
        s = Mid$(sInn, i, 1)
        If Not IsNumeric(s) Then Exit Function
        j = j + CInt(v(i - 1)) * CInt(s)
    Next i
    j = j Mod 11
    If j > 9 Then j = j Mod 10
    ПроверкаИНН10 = (j = CInt(s))
End Function

Private Function ПроверкаИНН12(sInn As String) As Boolean
    Dim i As Integer, s As String, j As Integer, v As Variant
    
    v = Array(3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8, 0)
    
    For i = 1 To 12
        s = Mid$(sInn, i, 1)
        If Not IsNumeric(s) Then Exit Function
        j = j + CInt(v(i - 1)) * CInt(s)
    Next i
    j = j Mod 11
    If j > 9 Then j = j Mod 10
    If j <> CInt(s) Then Exit Function
    
    j = 0
    For i = 1 To 11
        j = j + CInt(v(i)) * CInt(Mid$(sInn, i, 1))
    Next i
    j = j Mod 11
    If j > 9 Then j = j Mod 10
    
    ПроверкаИНН12 = (j = CInt(s))
End Function
19 авг 08, 17:06    [6084889]     Ответить | Цитировать Сообщить модератору
Все форумы / Visual Basic Ответить