Страницы: 1
RSS
Формула определеяющая тип контрагента (как сделать из макроса функцию)
 
Добрый день!
В файле есть макрос для определения типа конрагента (просто пример, понятно, что очень примитивно).
Как сделать из него функцию, где бы в качесстве аргумента можно было указать ячейку и соответственно результат был выведен в ячейку, куда ввел формулу.

Спасибо.

И код для примера.
Код
Sub Category()
For i = 1 To 5
If Cells(i, 1).Value Like "*ООО*" Then
    Cells(i, 2).Value = "Юр.лицо"
ElseIf Cells(i, 1).Value Like "*АО*" Then
    Cells(i, 2).Value = "Юр.лицо"
ElseIf Cells(i, 1).Value Like "*ИП*" Then
    Cells(i, 2).Value = "ИП"
Else
    Cells(i, 2).Value = "Физ.лицо"
End If
Next
End Sub
 
Код
Function Category(s$) As String
    If s Like "*ООО*" Then
        Category = "Юр.лицо"
    ElseIf s Like "*АО*" Then
        Category = "Юр.лицо"
    ElseIf s Like "*ИП*" Then
        Category = "ИП"
    Else
        Category = "Физ.лицо"
    End If
End Function

Но мне больше нравится так:
Код
Function Category(s$) As String
    Select Case True
    Case s Like "*ООО*": Category = "Юр.лицо"
    Case s Like "*АО*": Category = "Юр.лицо"
    Case s Like "*ИП*": Category = "ИП"
    Case Else: Category = "Физ.лицо"
    End Select
End Function
Изменено: Hugo - 16.05.2020 20:48:53
 
Hugo, с языка сняли вопрос) хотел спросить как покрасивей все эти условия уложить)
Спасибо огромное, все работает.
 
Я там добавил тип функции -  As String
Обращаю Ваше внимание на Select Case True - обычно это в примерах не пишется, но такой вариант часто удобно применять.
P.S. Да и вообще смотрю это недокументировано :(
Цитата


Select Case Statement

Executes one of several groups of statements, depending on the value of an expression.

Syntax

Select Case testexpression
[Case expressionlist-n
[statements-n]]
...

[Case Else
[elsestatements]]

End Select

The Select Case statement syntax has these parts:

Part Description
testexpression Required. Any numeric expression or string expression.
expressionlist-n Required if a Case appears. Delimited list of one or more of the following forms: expression, expression To expression, Is comparisonoperator expression. The To keyword specifies a range of values. If you use the To keyword, the smaller value must appear before To. Use the Is keyword with comparison operators (except Is and Like) to specify a range of values. If not supplied, the Is keyword is automatically inserted.
statements-n Optional. One or more statements executed if testexpression matches any part of expressionlist-n.
elsestatements Optional. One or more statements executed if testexpression doesn't match any of the Case clause.
True - это ведь не  numeric expression и не string expression...
Изменено: Hugo - 16.05.2020 20:56:02
 
Hugo, спасибо)
А подскажите, условие наличие кавычки в ячейке как в данном случае записать?
На оба ругается красным цветом.
Код
Case s Like "*"*": Category = "Юр.лицо"
Case s Like "*"""*": Category = "Юр.лицо"
Изменено: whateverlover - 16.05.2020 21:02:58
 
Цитата
Hugo написал:
Но мне больше нравится так:
а мне все не нравятся ибо Case s Like "*АО*" может найтись и в названии  ИП Мао Олеся Андреевна если оно будет записано прописными.
По вопросам из тем форума, личку не читаю.
 
БМВ,  а если добавить пробел или кавычки, смотря как в тексте?
 
Цитата
Niko.x87 написал:
а если добавить
это будет уже третье решение , да и конечно пример надуман но кто знает что будет в реальной жизни. Будет какой-нить ИПАТИЙ и припишут ему ИП.
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
кто знает что будет в реальной жизни
Бывает такой:
ЖАНАОЗЕН, ИП Абышева Гульшат Озбекбаевна
типа конрагента будет "Юр.лицо"
 
Чтоб Ипатии не проскакивали можно например так усложнить:
Код
Function Category(s$) As String
    s = Trim(s)
    Select Case True
    Case s Like "ООО *": Category = "Юр.лицо"
    Case s Like "* ООО *": Category = "Юр.лицо"
    Case s Like "АО *": Category = "Юр.лицо"
    Case s Like "* АО *": Category = "Юр.лицо"
    Case s Like "ИП *": Category = "ИП"
    Case s Like "* ИП *": Category = "ИП"
    Case Else: Category = "Физ.лицо"
    End Select
End Function
 
Можно тут же упростить
Код
Function Category(s$) As String
    s = " " & Trim(s)
    Select Case True
    Case s Like "* ООО *": Category = "Юр.лицо"
    Case s Like "* АО *": Category = "Юр.лицо"
    Case s Like "* ИП *": Category = "ИП"
    Case Else: Category = "Физ.лицо"
    End Select
End Function
Только вот что делать с ПАО (тот же Газпром), НАО, ФКУ, НОУ, ДОУ и т.д. Целый справочник получается...
 
Цитата
Hugo написал:
Чтоб Ипатии не проскакивали
может тогда уж регулярками?
Код
Function Category$(txt$)
    With CreateObject("VBScript.RegExp")
        .Pattern = "(\s|^)(ООО|АО)(\s|$)"
        If .Test(txt) Then Category = "Юр.лицо": Exit Function
        .Pattern = "(\s|^)(ИП)(\s|$)"
        If .Test(txt) Then Category = "ИП": Exit Function
        Category = "Физ.лицо"
    End With
End Function
Изменено: buchlotnik - 17.05.2020 02:08:52
Соблюдение правил форума не освобождает от модераторского произвола
 
Бывает в тексте  ТОО или АО английскими буквами :(
также Ип, ИП, иП  , короче  много нюансов нужно учитывать
Изменено: azma - 17.05.2020 09:58:19
Страницы: 1
Наверх