2015-09-14 3 views
2

У меня есть макрос, который ищет 3 листа для invoice number, которые могут ввести пользователи (всего более 2,6 миллиона записей).Выполнение поиска Excel marco flexible для покрытия различных опорных длин

Цифры входят в одну ячейку, которая также имеет ссылку поиска в ней. форма: invoicenumber, reference_letter.

Первоначально это было нормально, потому что invoice numbers было 10 цифр. Теперь они могут быть любыми, но в конце всегда есть запятая, перед ссылкой на один символ.

Private Sub Worksheet_Change(ByVal Target As Range) 

If Target.Address <> "$A$5" Then Exit Sub 
If Target.Value = "" Then Exit Sub 

Application.EnableEvents = False 

Range("B5") = "" 

For Each sh In Sheets 
    If sh.Name = ActiveSheet.Name Then GoTo 111 
    sh.Range("B1").FormulaArray = "=IFERROR(MATCH(Main!A5,LEFT(A:A,10),0),"""")" 
    If sh.Range("B1") <> "" Then 
     x = sh.Range("B1") 
     Range("B5") = Right(sh.Range("A" & x), 1) 
     Exit For 
    End If 
111 
Next sh 

Application.EnableEvents = True 

If x = "" Then MsgBox "Not Found!" 

End Sub 

Я знаю, что это ограничение 10 знаков в строке 8, и я попытался заменить с FIND, но я не думаю, что я был прав (на том основании, что я не мог заставить его работать !).

Буду благодарен за помощь в получении этой сортировки.

У меня есть еще один vLookup, который берет последний символ и возвращает текст с отдельного листа.

+0

Используйте 'метод Instr' найти расположение запятой. Затем вычтите 1 и используйте это значение для количества символов в функции 'Left'. Возможно, вам понадобится также «TRIM», если есть дополнительные пробелы. –

+0

Спасибо Рон. Я вижу, что вы делаете. Как бы тогда закодировать это здесь? Я не могу понять, как читать переменную текущую ячейку: 'instr (1, a: a, ',')' уверен, что a: a неверно. – Nathan

+0

Извините, это в формуле на листе (пропущено это): вы использовали бы функцию листа FIND для этого –

ответ

1

Попробуйте

Private Sub Worksheet_Change(ByVal Target As Range) 
Dim InvLen As Integer 
If Target.Address <> "$A$5" Then Exit Sub 
If Target.Value = "" Then Exit Sub 
Application.EnableEvents = False 
Range("B5") = "" 
    For Each sh In Sheets 
     If sh.Name = ActiveSheet.Name Then GoTo 111 
     InvLen = Len(Worksheets("Main").Range("A5").value) 
     sh.Range("B1").FormulaArray = "=IFERROR(MATCH(Main!A5,LEFT(A:A," & InvLen & "),0),"""")" 
     If sh.Range("B1") <> "" Then 
      x = sh.Range("B1") 
      Range("B5") = Right(sh.Range("A" & x), 1) 
      Exit For 
     End If 
111 
    Next sh 
Application.EnableEvents = True 
If x = "" Then MsgBox "Not Found!" 
End Sub 
+1

. Она не работала как переменная, но отлично работала, когда я ее прямо вставлял: – Nathan

+1

' IFERROR (! MATCH (Main A5, LEFT (A: A, Len (Main A5)), 0), "" "") "' – Nathan