#excel #vba
Вопрос:
У меня есть лист в Excel, в котором есть столбец поиска для всех наших определений внутреннего телефонного кода. (они указаны в столбце F amp;G ) — затем у меня есть столбец поиска, в котором мы хотим сопоставить диалкоды наших клиентов, чтобы найти ближайшее совпадение. Формула делает это прямо сейчас по ряду столбцов, проверяя, есть ли совпадение, а если нет, то она удаляет последнее число и затем сравнивает снова
Затем я сравниваю их с определениями, которые мне дают
И, удаляя по 1 номеру за раз, я в конечном итоге получаю совпадение кодов, как анализируется лист, чтобы получить таблицу совпадений телефонных кодов
У меня есть это в формуле excel прямо сейчас, но я хотел бы, чтобы это была функция VBA, которую я могу вызвать, чтобы она работала быстрее — ей нужно было бы сравнить все столбцы F и G как совпадение, которое сортируется в числовом порядке
=IF($A3="","",IF(AND(F3="", CONCATENATE(C3,D3, E3,F3) = ""), IF(ISNA(VLOOKUP(LEFT($B3,MAX(0, LEN($B3) - G$1)) 0,Input!$F:$G,1,FALSE))=FALSE, VLOOKUP(LEFT($B3,MAX(0, LEN($B3) - G$1)) 0,Input!$F:$G,2,FALSE),""),""))
Комментарии:
1. Если я вас правильно понял, вы хотите заменить свою формулу пользовательской функцией (в vba). Если это правильно: как правило, собственные формулы Excel работают быстрее, чем пользовательские функции. Поэтому я бы рекомендовал придерживаться того, что работает). Если это неверно, возможно, поясните подробнее, что вы пытаетесь сделать. 🙂
Ответ №1:
Попробуй
Option Explicit Sub LocateCode() Dim wb As Workbook, ws As Worksheet, wsInput As Worksheet Dim rngInput As Range, found As Range Dim LastRow As Long, LastInput As Long, r As Long Dim code As String, n As Integer Set wb = ThisWorkbook ' look up range Set wsInput = wb.Sheets("Input") With wsInput LastRow = .Cells(.Rows.Count, "F").End(xlUp).Row Set rngInput = .Range("F2:F" amp; LastRow) End With ' data Set ws = wb.Sheets("Input") With ws LastRow = .Cells(.Rows.Count, "B").End(xlUp).Row For r = 2 To LastRow code = .Cells(r, "B") n = Len(code) Do Set found = rngInput.Find(Left(code, n), Lookat:=xlWhole, LookIn:=xlValues) If Not found Is Nothing Then .Cells(r, "C") = found.Offset(0, 1) ' compare If .Cells(r, "A") lt;gt; .Cells(r, "C") Then .Cells(r, "A").Interior.Color = vbYellow End If Exit Do End If n = n - 1 If n = 0 Then .Cells(r, "C") = "#N/A" Loop Until n = 0 Next End With MsgBox "Done" End Sub
Комментарии:
1. Это брилиант — большое вам спасибо