根据多级字符串比较分配单元格值

时间:2019-03-05 02:26:24

标签: excel vba

又简短又甜美:我有一个非常大的数据集,我正在尝试为每个条目分配一个销售区域。销售区域取决于两个值:1)州和2)县。对于 EXCEPT WV,KY和TN的所有州,只能根据州值分配销售区域。对于WV,KY和TN,销售地区基于州和县的价值。对于这三个州,某些县属于不同的销售地区。

以下是我运行代码前后的示例数据集的屏幕截图:

DataSet_Before

DataSet_After

我的代码标识STATE列和县(名称为FIPS_CNTY_NM)列,然后在希望将销售地区分配到的县列旁边插入一个名为“ TERRITORY”的新列。

Sub assignTerritory()

Dim WS As Worksheet
Dim lastRow As Long
Dim countyName As String
Dim countyColumn As Long
Dim stateName As String
Dim stateColumn As Long
Dim stateValue As String
Dim countyValue As String
Dim i As Long

Set WS = Worksheets("Data")

With WS


    'Find numeric last row used on sheet
    lastRow = .Cells.Find(What:="*", After:=.Range("A1"), LookAt:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByRows, _
        SearchDirection:=xlPrevious, MatchCase:=False).Row

    MsgBox "The last row with entered data is " & lastRow


    'Find state column
    stateName = "STATE"

    stateColumn = .Rows(1).Find(What:=stateName, LookIn:=xlValues, LookAt:=xlWhole, _
        SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False).Column

    MsgBox "The " & stateName & " header is found in column " & stateColumn


    'Find county column
    countyName = "FIPS_CNTY_NM"

    countyColumn = .Rows(1).Find(What:=countyName, LookIn:=xlValues, LookAt:=xlWhole, _
        SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False).Column

    MsgBox "The " & countyName & " header is found in column " & countyColumn


    'Insert a row to the right of the county column
    .Columns(countyColumn + 1).Insert Shift:=xlToLeft, CopyOrigin:=xlFormatFromLeft


    'Give new column header "TERRITORY"
    .Cells(1, countyColumn + 1).Value = "TERRITORY"


    'Assign territory
    For i = 2 To lastRow

        stateValue = Trim(.Cells(i, stateColumn).Value)
        countyValue = Trim(.Cells(i, countyColumn).Value)

        If StrComp("PA", stateValue, vbTextCompare) Then .Cells(i, countyColumn + 1).Value = "Northern Appalachian"

        Next i

End With

End Sub

我不确定要针对多个值进行字符串比较的最佳方法。我的第一个尝试是处理一个状态,我知道在这种情况下,我只会使用状态值来分配地区PA。我使用StrComp函数,但是从DataSet_After中可以看到,我的代码为除PA之外的每个州分配了我想要的值(“北阿巴拉契亚”)。我不确定为什么会这样。我不知道“之后”之后的语句中是否包含它,或者我尝试将.Cells更改为.Range并分配单元格时尝试了什么,但最终还是得到相同的结果。

数据集包括按州而不是按县的销售地区。对于状态值是PA,OH,MD,ME,NY,VT,DE,NJ,CT,NH,RI或MA的任何有能力提供帮助的人(我希望可以推断出我的其他情况)应该分配给“北阿巴拉契亚”。如果州为西弗吉尼亚州 AND ,则县(FIPS_CNTY_NM)等于以下任何一个州:

[汉考克,布鲁克,俄亥俄,马歇尔,韦策尔,莫农纳利亚,普雷斯顿,马里恩,伍德,宜人,泰勒,维特,里奇,多德-里奇,哈里森,吉尔默,刘易斯,泰勒,巴伯,Upshur,塔克,伦道夫,彭德尔顿,格兰特,矿物,汉普郡,哈代,摩根,伯克利,杰斐逊]

然后应将销售地区指定为“北阿巴拉契亚”。如果州为西弗吉尼亚州,并且县(FIPS_CNTY_NM)不是等于销售区域上方列出的县,则应为“中央阿巴拉契亚”。

我该怎么做?

大约2个月前,我刚刚开始为该项目学习VBA,并且在工作中还承担许多其他职责,因此我无法完全深入学习VBA。我不是软件开发人员,因此了解基础知识的速度比平常慢,但是到目前为止,该社区已经为您提供了很大帮助,因此我希望阅读任何答案!

2 个答案:

答案 0 :(得分:2)

几层精选案例将为您提供帮助。

  For i = 2 To lastRow

        stateValue = Trim(.Cells(i, stateColumn).Value)
        countyValue = Trim(.Cells(i, countyColumn).Value)

        Dim terr as String

        Select Case stateValue

            Case "PA","OH","MD","ME","NY","VT","DE","NJ","CT","NH","RI","MA"

                terr = "Northern Appalachian"

            Case "WV"

                 Select Case countyValue
                    Case "Hancock","Brooke","Ohio" ' keep adding
                        terr = "Northern Appalachian"
                    Case Else
                        terr = "Central Appalachian"
                 End Select

         End Select

   .Cells(i, countyColumn + 1).Value = terr

Next i

答案 1 :(得分:0)

在工作表中,州和领地之间的关联由单元格颜色构成。因此,您的代码应在“状态”列中查找单元格颜色,并从“键”列表中相同颜色的单元格中选择“地区”名称。

我不喜欢基于颜色的排序,但是如果它适合您,那很好。另一种选择是2列密钥,您可以在其中将每个地区与州或县相关联。键列表中的第二列将包含诸如“ PA,NY,汉考克,新泽西州”之类的字符串。该代码将查看每一行的“县”列,并使用县名(如果存在),否则切换到“州”列。在键表第二列的字符串中查找这两个值,然后从找到匹配项的行返回“领土”。