使Excel查找灵活,以覆盖不同的引用长度

使Excel查找灵活,以覆盖不同的引用长度,excel,vlookup,vba,Excel,Vlookup,Vba,我有一个宏,它在3个工作表中搜索用户可能输入的发票号(总共超过260万条记录) 这些数字出现在一个单元格中,该单元格中还有一个查找引用。形式:发票编号,参考字母 最初,这是可以接受的,因为发票编号是10位数字。现在它们可以是任何东西,但在单字符引用之前,末尾总是有一个逗号 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$5" Then Exit Sub If Target.Va

我有一个宏,它在3个工作表中搜索用户可能输入的
发票号
(总共超过260万条记录)

这些数字出现在一个单元格中,该单元格中还有一个查找引用。形式:
发票编号,参考字母

最初,这是可以接受的,因为
发票编号是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
Private子工作表\u更改(ByVal目标作为范围)
如果目标地址为“$A$5”,则退出Sub
如果Target.Value=”“,则退出Sub
Application.EnableEvents=False
范围(“B5”)=“”
对于每一张图纸
如果sh.Name=ActiveSheet.Name,则转到111
sh.Range(“B1”).FormulaArray=“=IFERROR(匹配(主!A5,左(A:A,10),0),”)
如果sh.Range(“B1”)“那么
x=sh范围(“B1”)
范围(“B5”)=右侧(sh.Range(“A”)和x),1)
退出
如果结束
111
下一个sh
Application.EnableEvents=True
如果x=”“,则MsgBox“未找到!”
端接头
我知道第8行有10个字符的限制,我试着用
查找
,但我认为我做得不对(因为我无法让它工作!)

我会很感激你帮我整理这件事

我还有一个vLookup,它取最后一个字符并从另一张纸上返回文本。

试试这个

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
Private子工作表\u更改(ByVal目标作为范围)
作为整数的Dim InvLen
如果目标地址为“$A$5”,则退出Sub
如果Target.Value=”“,则退出Sub
Application.EnableEvents=False
范围(“B5”)=“”
对于每一张图纸
如果sh.Name=ActiveSheet.Name,则转到111
InvLen=Len(工作表(“主”)范围(“A5”)值)
sh.Range(“B1”).FormulaArray=“=IFERROR(匹配(主!A5,左(A:A,&InvLen&)”,0),“”)
如果sh.Range(“B1”)“那么
x=sh范围(“B1”)
范围(“B5”)=右侧(sh.Range(“A”)和x),1)
退出
如果结束
111
下一个sh
Application.EnableEvents=True
如果x=”“,则MsgBox“未找到!”
端接头

使用
Instr
方法查找逗号的位置。然后减去1,并将该值用于
Left
函数中的字符数。如果有多余的空间,您可能还需要
修剪
。谢谢。我知道你在做什么。那你怎么把它编码到这里?我不知道如何读取变量当前单元格:
instr(1,a:a,“,”)
确保a:a不正确。抱歉,它在工作表的公式中(遗漏了这一点):您可以使用
FIND
工作表函数来执行此操作。它作为变量不起作用,但当我直接将其放入时,它工作得非常好:
IFERROR(MATCH(Main!A5,左)(A:A,Len(Main!A5)),0),“”“,”