检查项目位置VBA

时间:2015-12-06 13:15:41

标签: excel vba excel-vba

我有一个excel文件,其中有一个非常大的项目列表放在某个位置。该项目的位置取决于许多事情。颜色,形状,是否包裹,尺寸,重量等。

因此,例如一台10公斤以下的电视,蓝色,未打开,进入位置1.

但是电视,蓝色的,未打开的,超过10公斤进入位置5。

现在我知道我可以用一个(相当长的)IF语句列表检查位置,检查每个可能的组合以查看位置是否正确。这里的例子非常简单,但真正的列表变得非常大。

我的问题是(我对excel / vba的了解有限)是否有更快的方法可以做到这一点?

处理的excel文件包含A列中的项目和其他列中的所有其他特征。

问题:我有很长的项目列表,我必须根据(比方说)5个变量分配给一个位置。使用IF语句执行此操作将创建一个非常长的语句列表。有更快的方法吗?

https://docs.google.com/spreadsheets/d/1ZFu-0YfBubQBUKQb3piqS3YJ2nSlKSTf4TktIsf-LuA/edit?usp=sharing

示例文件,请注意文件中的列之间还有其他列,但这些列不相关。

2 个答案:

答案 0 :(得分:1)

回答你的问题:

  

我的问题是(凭借我对excel / vba的了解有限)   做一个更快的方法吗?

     

问题:我有很长的项目清单   必须根据(比方说)5个变量分配到一个位置。   使用IF语句执行此操作会创建一个很长的列表   声明。有更快的方法吗?

绝对!下面的方法\代码需要大约10秒。

让我们首先总结一下要应用的标准:

enter image description here

正如您所看到的,项目的分类取决于两个变量而不是五个。

以下代码将帮助您应用相应的条件。 由于您的条件中未定义Country\Priority个组合,因此分配给Location的默认值为!Err,以表示缺少的条件。

注意:只提供根据问题应用规则所需的代码,OP应该能够生成所有其他必要的代码。

Sub Rng_Classify_Items()
Dim rTrg As Range   'Range to apply the rules
Dim sCtry As String, sPCod As String, sLoct As String
Dim bItmN As Byte, bCtry As Byte, bPCod As Byte, bLoct As Byte
Dim lRow As Long

    Rem Set Target Range
    'OP should be capable of producing this code
    '...    

    With rTrg

        Rem Set Field Positions
        On Error GoTo ExitTkn
        bItmN = Application.Match("Itemnumber", .Rows(1), 0)
        bCtry = Application.Match("Country", .Rows(1), 0)
        bPCod = Application.Match("Priority Code", .Rows(1), 0)
        bLoct = Application.Match("Location", .Rows(1), 0)
        On Error GoTo 0

        For lRow = 2 To .Rows.Count

            Rem Validate Item Number
            If .Cells(lRow, bItmN).Value2 <> Empty Then

                Rem Validate Rules
                sCtry = UCase(.Cells(lRow, bCtry).Value2)
                sPCod = UCase(.Cells(lRow, bPCod).Value2)
                sLoct = "!Err"  'Default Location applied to Country\Priority combinations not classified
                Select Case sCtry

                Case "414", "784"
                    If sPCod = "GREEN" Then sLoct = "Bicycling Holland"

                Case "CH"
                    sLoct = "Switzerland"
                    If sPCod = "GREEN" Then sLoct = "Bicycling Holland"

                Case "IE"
                    If sPCod = "GREEN" Then sLoct = "United Kingdom"
                    If sPCod = "RED" Then sLoct = "Europe"

                Case "GB"
                    If sPCod = "GREEN" Then sLoct = "United Kingdom"
                    If sPCod = "RED" Then sLoct = "TNT Uk"

                Case "AT", "BE", "CZ", "DE", "DK", "ES", "FI", "FR", "GR", "IT", "LU", "NL", "PL", "SE", "SI", "SK"
                    If sPCod = "GREEN" Or sPCod = "RED" Then sLoct = "Europe"

                End Select

                Rem Set Location
                .Cells(lRow, bLoct).Value = sLoct

    End If: Next: End With

ExitTkn:

End Sub

建议访问这些页面:

With StatementWorksheetFunction Object (Excel)On Error Statement

For...Next StatementSelect Case Statement

Range Object (Excel)Worksheet Object (Excel)

请告诉我有关为回答您的问题而提供的代码的任何问题......

答案 1 :(得分:0)

我会建立一个包含所有独特选项和位置的表格

BlueWrapped10K+,1
BlueWrapped7K+,2
BlueWrapped5K+,3
BlueWrapped0K+,4
BlueUnwrapped10K+,5
...
etc.

然后连接项目的值,如

=A2&B2&INDEX({"10K+","7K+","5K+","0K+"},MATCH(C2,{999,9.99,6.99,4.99},-1))

显然,使用变量值,例如你需要注意构建你的识别公式的权重,但是一旦完成它就可以在VLOOKUP中使用,就像那样

=VLOOKUP(A2&B2&INDEX({"10K+","7K+","5K+","0K+"},MATCH(C2,{999,9.99,6.99,4.99},-1)),MyLookup,2,FALSE)