Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.01.2013, 14:40   #11
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Можно так (всё не делал, уже не интересно - думаю алгоритм понятен):

Код:
Dim sStr As String, sNum As String

Sub ТНВЭД__tt()
    Dim tm!: tm = Timer
    Dim lRow&, i&

    Application.ScreenUpdating = False

    lRow = [D3].End(xlDown).row

    With Cells(3, "C").Resize(lRow - 2, 1)
        .Clear
        .Font.Size = 7
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlCenter
        .WrapText = True
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
        .Value = "ОК"
        .Interior.ColorIndex = 4
    End With

    For i = 3 To lRow

        sStr = LCase(Cells(i, "K").Value)
        sNum = Left(Cells(i, "D").Value, 4)

        Select Case True
        Case chk1: NotOK i
        Case WorksheetFunction.And(InStr(sStr, "ткан") > 0, Left(Cells(i, "D"), 2) <> "62"): NotOK i
        Case WorksheetFunction.And(InStr(sStr, "трикот") > 0, InStr(LCase(Cells(i, "K")), "пальт") > 0, Left(Cells(i, "D"), 4) <> "6101"): NotOK i
        Case WorksheetFunction.And(InStr(sStr, "трикот") > 0, Cells(i, "P") <= 86, Left(Cells(i, "D"), 4) <> "6111"): NotOK i
        Case WorksheetFunction.And(InStr(sStr, "ткан") > 0, Cells(i, "P") <= 86, Left(Cells(i, "D"), 4) <> "6209"): NotOK i
        Case WorksheetFunction.And(InStr(sStr, "девоч") > 0, InStr(sStr, "трикот") > 0, Left(Cells(i, "D"), 4) = "6101"): NotOK i
        Case WorksheetFunction.And(InStr(sStr, "женщ") > 0, InStr(sStr, "трикот") > 0, Left(Cells(i, "D"), 4) = "6101"): NotOK i
        Case chk8: NotOK i
            'Case WorksheetFunction.And(InStr(sStr, "мужчи") > 0, InStr(sStr, "трикот") > 0, Left(Cells(i, "D"), 4) = "6102"): NotOK i
        Case WorksheetFunction.And(InStr(sStr, "мальч") > 0, InStr(sStr, "трикот") > 0, Left(Cells(i, "D"), 4) = "6102"): NotOK i
        Case WorksheetFunction.And(InStr(sStr, "девоч") > 0, InStr(sStr, "трикот") > 0, Left(Cells(i, "D"), 4) = "6103"): NotOK i
        Case WorksheetFunction.And(InStr(sStr, "женщ") > 0, InStr(sStr, "трикот") > 0, Left(Cells(i, "D"), 4) = "6103"): NotOK i
        Case WorksheetFunction.And(InStr(sStr, "мужчи") > 0, InStr(sStr, "трикот") > 0, Left(Cells(i, "D"), 4) = "6104"): NotOK i
        Case WorksheetFunction.And(InStr(sStr, "мальч") > 0, InStr(sStr, "трикот") > 0, Left(Cells(i, "D"), 4) = "6104"): NotOK i
        Case WorksheetFunction.And(InStr(sStr, "девоч") > 0, InStr(sStr, "трикот") > 0, Left(Cells(i, "D"), 4) = "6105"): NotOK i
        Case WorksheetFunction.And(InStr(sStr, "женщ") > 0, InStr(sStr, "трикот") > 0, Left(Cells(i, "D"), 4) = "6105"): NotOK i
        Case WorksheetFunction.And(InStr(sStr, "мужчи") > 0, InStr(sStr, "трикот") > 0, Left(Cells(i, "D"), 4) = "6106"): NotOK i
        Case WorksheetFunction.And(InStr(sStr, "мальч") > 0, InStr(sStr, "трикот") > 0, Left(Cells(i, "D"), 4) = "6106"): NotOK i
        Case WorksheetFunction.And(InStr(sStr, "девоч") > 0, InStr(sStr, "трикот") > 0, Left(Cells(i, "D"), 4) = "6107"): NotOK i
        Case WorksheetFunction.And(InStr(sStr, "женщ") > 0, InStr(sStr, "трикот") > 0, Left(Cells(i, "D"), 4) = "6107"): NotOK i
        Case WorksheetFunction.And(InStr(sStr, "мужчи") > 0, InStr(sStr, "трикот") > 0, Left(Cells(i, "D"), 4) = "6108"): NotOK i
        Case WorksheetFunction.And(InStr(sStr, "мальч") > 0, InStr(sStr, "трикот") > 0, Left(Cells(i, "D"), 4) = "6108"): NotOK i
        Case WorksheetFunction.And(InStr(sStr, "девоч") > 0, InStr(sStr, "ткан") > 0, Left(Cells(i, "D"), 4) = "6201"): NotOK i
        Case WorksheetFunction.And(InStr(sStr, "женщ") > 0, InStr(sStr, "ткан") > 0, Left(Cells(i, "D"), 4) = "6201"): NotOK i
        Case Cells(i, "E") = "": NotOK i
        End Select
    Next i

    Application.ScreenUpdating = True
    Debug.Print Timer - tm
End Sub

Function chk1() As Boolean
    If InStr(sStr, "трикота") > 0 Then
        If Left(sNum, 2) <> "61" Then
            chk1 = True
        End If
    End If
End Function

Function chk8() As Boolean
    If InStr(sStr, "мужчи") > 0 Then
        If InStr(sStr, "трикот") > 0 Then
            If sNum = "6102" Then
                chk8 = True
            End If
        End If
    End If
End Function


Sub NotOK(i&)
    With Cells(i, "C")
        .Value = "OШИБКА"
        .Interior.ColorIndex = 3
        .Font.Size = 5
    End With
End Sub
Как писал выше:
Цитата:
Ну и добавлять условия нет проблем - добавляем case и функцию с условиями.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 25.01.2013, 14:53   #12
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

лично я заменил бы везде
Код:
WorksheetFunction.And(InStr(sStr, "мальч") > 0, InStr(sStr, "трикот") > 0, Left(Cells(i, "D"), 4) = "6104")
на что-то вроде этого:
Код:
sStr like "*мальч*трикот*" AND Cells(i, "D") like "6104*"
И короче по длине, и проще для восприятия
EducatedFool вне форума Ответить с цитированием
Старый 25.01.2013, 15:09   #13
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

А если нужно проверять и на *трикот*мальч* ?

И опять же - зачем проверять Cells(i, "D") like "6104*", если первое условие неверно? Может там строк полмиллиона...
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 25.01.2013, 17:31   #14
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Перевёл на массивы (все условия прописывать лень):
Код:

Dim sStr As String, sNum As String, a()

Sub ТНВЭД_arr()
    Dim tm!: tm = Timer
    Dim lRow&, i&

    Application.ScreenUpdating = False

    lRow = [D3].End(xlDown).row

    With Cells(3, "C").Resize(lRow - 2, 9)
        With .Columns(1)
            .Clear
            .Font.Size = 7
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlCenter
            .WrapText = True
            .Orientation = 0
            .AddIndent = False
            .IndentLevel = 0
            .ShrinkToFit = False
            .ReadingOrder = xlContext
            .MergeCells = False
            .Value = "ОК"
            .Interior.ColorIndex = 4
        End With
        a = .Value
    End With

    For i = 1 To lRow - 2

        sStr = LCase(a(i, 9))
        sNum = Left(a(i, 2), 4)

        Select Case True
        Case a(i, 3) = "": NotOK i
        Case chk1: NotOK i
            'тут добавить вызовов функций с условиями
        Case chk8: NotOK i
        End Select
    Next i

    Cells(3, "C").Resize(lRow - 2, 1).Value = a

    Application.ScreenUpdating = True
    Debug.Print Timer - tm
End Sub

Function chk1() As Boolean
    If InStr(sStr, "трикота") > 0 Then
        If Left(sNum, 2) <> "61" Then
            chk1 = True
        End If
    End If
End Function

Function chk8() As Boolean
    If InStr(sStr, "мужчи") > 0 Then
        If InStr(sStr, "трикот") > 0 Then
            If sNum = "6102" Then
                chk8 = True
            End If
        End If
    End If
End Function


Sub NotOK(i&)
    With Cells(i + 2, "C")
        .Interior.ColorIndex = 3
        .Font.Size = 5
    End With
    a(i, 1) = "OШИБКА"
End Sub
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 25.01.2013 в 23:55.
Hugo121 вне форума Ответить с цитированием
Старый 26.01.2013, 01:12   #15
nerv
Форумчанин
 
Аватар для nerv
 
Регистрация: 26.04.2010
Сообщений: 450
По умолчанию

Код:
Text1 = LCase(Cells(i, "K").Value)
Text2 = Cells(i, "D").Value

Case WorksheetFunction.And(InStr(Text1, "ткан") > 0, Left(Cells(i, "D"), 2) <> "62")
Case WorksheetFunction.And(InStr(Text1, "мужчи") > 0, InStr(Text1, "трикот") > 0, Left(Cells(i, "D"), 4) = "6104")


ok = InValid(Text1, "ткан", Text2, "<>", "62")
ok = InValid(Text1, A("мужчи", "трикот"), Text2, "=", "6104")


Function InValid(ByVal Text1 As String, _
                 ByRef Arr As Variant, _
                 ByVal Text2 As String, _
                 ByVal Operation As String, _
                 ByVal Line2 As String) As Boolean
    Dim Elem As Variant
    
    For Each Elem In IIf(IsArray(Arr), Arr, Array(Arr))
        If Not InStr(Text1, Elem) Then
            Exit Function
        End If
    Next
    
    Select Case Operation
        Case "<>"
            If Left(Text2, Len(Line2)) = Line2 Then
                Exit Function
            End If
        Case "="
        If Left(Text2, Len(Line2)) <> Line2 Then
            Exit Function
        End If
    End Select
    
    InValid = True
End Function


' финт ушами
Function A(ParamArray param())
    A = param()
End Function
Тишина – самый громкий звук

Последний раз редактировалось nerv; 26.01.2013 в 01:17.
nerv вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизировать код strannick Microsoft Office Excel 9 14.11.2012 00:59
Оптимизировать код satka Microsoft Office Access 2 01.12.2011 14:36
Оптимизировать код) Pein95 Паскаль, Turbo Pascal, PascalABC.NET 1 11.11.2011 18:42
Оптимизировать код. Манжосов Денис :) Общие вопросы Delphi 1 20.10.2008 19:06
Оптимизировать код NeiL Помощь студентам 2 21.02.2008 08:57