Назначение значения ячейки на основе многоуровневого сравнения строк - PullRequest
0 голосов
/ 05 марта 2019

Коротко и мило: у меня очень большой набор данных, и я пытаюсь назначить территорию продаж для каждой записи.Территория продаж зависит от двух значений: 1) штата и 2) округа.Для всех штатов ИСКЛЮЧИТЬ 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 TERRITORYдолжен быть назначен "Северная Аппалачия".Если штат WV И , округ (FIPS_CNTY_NM) равен любому из них:

[Хэнкок, Брук, Огайо, Маршалл, Ветцель, Мононгалия, Престон, Марион, Вуд, ПлезантсТайлер, Вирт, Ричи, Додд-Ридж, Харрисон, Гилмер, Льюис, Тейлор, Барбур, Апшур, Такер, Рэндольф, Пендлтон, Грант, Минерал, Хэмпшир, Харди, Морган, Беркли, Джефферсон]

затемТерритория продаж должна быть закреплена за «Северной Аппалачей».Если штат WV и округ (FIPS_CNTY_NM) НЕ , равный любому из перечисленных выше, территория продаж должна быть "Центральная Аппалачия".

Как я могу это сделать?

Я только начал изучать VBA около 2 месяцев назад для этого проекта, и у меня есть много других обязанностей на работе, поэтому я не смог полностью погрузиться в изучение VBA как можно лучше.Я не разработчик программного обеспечения, поэтому знакомство с основами происходит медленнее, чем обычно, но пока это сообщество очень помогло, поэтому я с нетерпением жду ответов!

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

В вашей рабочей таблице связь между штатом и территорией осуществляется по цвету ячейки.Поэтому ваш код должен искать цвет ячейки в столбце «Состояние» и выбирать название территории из ячейки одинакового цвета в списке «Ключ».

Мне не нравится сортировка по цвету, но если она работает для вас, это нормально.Альтернативой является ключ из 2 столбцов, в котором вы связываете каждую территорию с штатами или округами.Второй столбец в списке ключей будет содержать такие строки, как «PA, NY, Hancock, NJ».Код будет смотреть на столбец округа каждой строки и использовать название округа, если оно существует, иначе переключаться на столбец состояния.Любое значение ищется в строках второго столбца таблицы ключей, а территория возвращается из строки, в которой найдено совпадение.

0 голосов
/ 05 марта 2019

Вам поможет пара слоев выбора футляра.

  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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...