Преобразование формулы excel в макрос VBA

#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. Это брилиант — большое вам спасибо