Прежде чем я смогу даже ответить на ваш вопрос:
Я сделаю вид, что "Muninch
" во 2-м ряду вашего
данные просто ошибка с вашей стороны.
Если нет, то на ваш вопрос невозможно ответить, потому что в Excel нет встроенной логики распознавания, какая строка является страной и городом.
Технически вы можете проверить, содержится ли он в диапазоне "Страна" второй таблицы данных, и если нет, мы можем предположить, что это город, но сделайте нам всем и, что еще важнее, себе одолжение и действительно отсортируете ваши данные!
Я пытаюсь сказать, что каждый столбец должен содержать уникальные данные соответствующего типа:
Country City Type
------- ---- -----
Italy Milan City
Italy Rome Capital
Germany Munich City
Amsterdam Amsterdam Capital // < A BIG NO-NO !!!
Если ваш ответ на этот вопрос, но «но у меня они есть в одном столбце!» , тогда я просто рекомендую вам отбросить эти данные и расшифровать их вручную, потому что вы потеряете больше времени на попытки Придумайте алгоритм определения того, когда данными являются Страна или Город, чем если бы вы просто отсортировали эти данные вручную.
Кроме того, следует избегать конфликтующих структур / типов данных любой ценой , будь то программирование, базы данных, таблицы данных или почти все, о чем вы только можете подумать.
Как гласит вековая поговорка, вы не смешиваете яблоки с апельсинами
Теперь, когда мы отсортировали наши продукты:
Я не могу придумать эффективного подхода для достижения с помощью формул с помощью VLOOKUP
Нам нужно выбрать другой подход: vba подход:
То, что мы стремимся сделать, это:
- Просмотрите нашу вторую таблицу данных, состоящую из уникальных стран
- Используйте операцию
find
в нашей основной таблице данных для извлечения данных
- Добавьте его к соседнему столбцу нашей таблицы на шаге 1.
- Отпразднуйте ууу мы это сделали ..!
Предполагается, что таблица больших данных находится в Sheet1
и странах
таблица данных в Sheet2
Мы достигаем этого соответственно:
Option Explicit
Private Sub loop_through_countries()
Dim ws1 As Worksheet: Set ws1 = Sheets("Sheet1")
Dim ws2 As Worksheet: Set ws2 = Sheets("Sheet2")
Dim lr1 As Long ' last active row in sht1
Dim lr2 As Long ' last active row in sht2
Dim searchrange As Range 'big data table
Dim cell As Range ' cell to loop through countries table
Dim temp As Range ' temp to hold result of find operation
Dim result As String ' storing result
lr1 = ws1.Cells(ws1.Rows.Count, 1).End(xlUp).Row
lr2 = ws2.Cells(ws2.Rows.Count, 1).End(xlUp).Row
ws1.Range("A1:A" & lr1).Copy ' we add extra column, as we need data to "check off"
ws1.Range("A1").EntireColumn.Insert ' basically, we need to remove data _
from array upon checking for it
ws1.Range("A1").PasteSpecial xlPasteAll ' otherwise we'd be stuck in endless loop
Set searchrange = ws1.Range("B2:B" & lr1)
For Each cell In ws2.Range("A2:A" & lr2) ' for country table
Set temp = searchrange.Find(cell, LookIn:=xlValues)
If Not temp Is Nothing Then 'if found
Do Until temp Is Nothing
If result = "" Then ' no comma in result if it's first argument
result = temp.Offset(0, 1) + " - " + temp.Offset(0, 2)
Else
result = result + ", " + temp.Offset(0, 1) + " - " + temp.Offset(0, 2)
End If
temp = "Checked"
Set temp = searchrange.FindNext(temp)
Loop
Else
cell.Offset(0, 1) = "No matches found!"
End If
cell.Offset(0, 1) = result ' print result to adjacant column
' and we need to reseult our result and temp
Set temp = Nothing
result = ""
Next cell
ws1.Range("B1").EntireColumn.delete ' and we delete the extra helping column
End Sub
Посмотрим, принесет ли он какие-нибудь фрукты:
Ладно, хватит уже с фруктовыми играми!
Суть в том, что, хотя это было немного сложно, это работает:
Если у вас есть какие-либо вопросы, пожалуйста, дайте мне знать, я с удовольствием объясню
РЕДАКТИРОВАТЬ: Черт @ СкоттКрейнер и его магические формулы. Хотя, честно говоря, код, который я предоставил, будет работать с любым динамическим диапазоном, в то время как
Формула должна быть скорректирована вручную , так что есть некоторая польза для
код тем не менее.
Хотя я должен сказать, что это довольно комично, он
удалось написать мои ~ сто строк кода в 1 строку.
Проголосовал его ответ для простоты, но выбирай то, что посчитаешь нужным.