Коротко и мило: у меня очень большой набор данных, и я пытаюсь назначить территорию продаж для каждой записи.Территория продаж зависит от двух значений: 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 как можно лучше.Я не разработчик программного обеспечения, поэтому знакомство с основами происходит медленнее, чем обычно, но пока это сообщество очень помогло, поэтому я с нетерпением жду ответов!