社区,
我正在处理非常大的 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
[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")
如果我单步执行代码,则会出现如下错误:
感谢您的帮助。斯科特
调用流程
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