Excel WorksheetFunction.Vlookup 给出不一致的结果

问题描述 投票:0回答:1

社区, 我正在处理非常大的 Excel 工作簿(3200 行 VBA,127,536 KB)。 目标是确定公司部门之间/内部是否存在图纸编号冲突。 该工作簿包含代表公司部门保留图纸编号列表的工作表(当前为 5 个)。
每个工作表都包含绘图编号,其中工作表可以有 50,000 到 200,000 行和 2 到 5 列,格式为文本。我目前只使用第一行。

我使用的是 Dell Precision 7770、I9、64 GB RAM、6 TB 存储。 Excel 需要 15-20 秒才能加载。当我跑步时,大约需要35分钟。处理 449384 行数据,每行填充 4 列,并根据长度、特殊字符、创建者、后缀、前缀、构造模式等应用大约 250 个规则模式中的 1 个后的结果。

我正在使用函数“IsItemNumberStrInNumLogWks”来查看某个部门是否正在使用绘图编号。 在此函数中,我使用“Application.WorksheetFunction.VLookup”,它给了我不一致的结果。当值确实在工作表中时,很多时候“Application.WorksheetFunction.VLookup”会返回“1004”。

这个问题是解决企业图纸未对齐/冲突的核心。有什么我没有正确应用的吗? 谢谢您的帮助! 斯科特

Calling Code
Parameter values:
crntItemNumber = "22613900" :  gcNumLogNameTab = "Div1_Number_Log"
gcNumLogRangeDiv1 = "A2:B67113"


If IsItemNumberStrInNumLogWks(crntItemNumber, gcNumLogNameTab, gcNumLogRangeHTPG) Then .....

'=========================================================================================
' IsItemNumberStrInNumLogWks
' This checks to see if an item_number is in a divisions Number log worksheet
'===      Parameter Name              Object Type      Description
'           dwgNumStr                   String           drawing number Name; "1234-6789""
'           numLogTabName               String           the name of the worksheet tab; "Division_Number_Log"
'           strLogNumRange              String           the range of the Worksheet to be checked; "A2:B65878"
'
'=== Return:                            Boolean          If the dwg number pattern is found then return True
'

Public Function IsItemNumberStrInNumLogWks( _
  ByVal dwgNumStr As String, _
  ByVal numLogTabName As String. _
  ByVal strLogNumRange As String) As Boolean

    Dim numLogWks As Worksheet
    Dim numberLogRange As Range
    Dim numLogNumber As String: numLogNumber = "Not Found"
    'Dim dwgNumStr As String

    'dwgNumStr = "314545"  '314551 not found
         
    On Error GoTo SetAsFalse
    
    Set numLogWks = Worksheets(numLogTabName)
    Set numberLogRange = numLogWks.Range(strLogNumRange) '"A2:B65878"
    
    numLogNumber = Application.WorksheetFunction.VLookup(dwgNumStr, numberLogRange, 1, False)
    

SetAsFalse:
    If Err.Number = 1004 Then
       IsItemNumberStrInNumLogWks = False
      Else
       IsItemNumberStrInNumLogWks = True
    End If

End Function

这是一个在notepad++中查看的数据示例: VLookup 无法找到所有 3 个值。

[TAB] "Div1_Number_Log"
22613700    C/Z 6 BASE, PIPE DOWN
22613900    VENTURI SUPPORT RIGHT, ET-5H
22626600    ACCUMULATOR BASE

All Parts All Divisions

[TAB] "All Parts All Divisions"
C/Z 6 BASE, PIPE DOWN   22613700    Component
VENTURI SUPPORT RIGHT, ET-5H    22613900    Component
ACCUMULATOR BASE    22626600    Component

如果我创建一个新工作表并使用 VLookup 作为公式,则找到的值如下所示:A3 =“22613900”

=IFERROR(VLOOKUP(A3,HTPG_Number_Log!$A$2:B$67113,1,FALSE),"Not Found") 

VLookup as a Formula. Same Data Reference

如果我单步执行代码,则会出现如下错误:

Stepping through the Code

感谢您的帮助。斯科特

excel vba vlookup
1个回答
0
投票

匹配(查找)数据

调用流程

Sub Test()

    If IsDrawingNumberFound(1234, "Sheet1") Then
        MsgBox "Found."
    Else
        MsgBox "Not!"
    End If

End Sub

功能

Function IsDrawingNumberFound( _
    ByVal DrawingNumber As String, _
    ByVal LogSheetName As String) _
As Boolean
    
    Dim rg As Range
    
    With ThisWorkbook.Sheets(LogSheetName).Range("A1").CurrentRegion.Columns(1)
        Set rg = .Resize(.Rows.Count - 1).Offset(1)
    End With
    
    IsDrawingNumberFound = IsNumeric(Application.Match(DrawingNumber, rg, 0))

End Function
© www.soinside.com 2019 - 2024. All rights reserved.