我想知道重复值的次数,例如288,以及在许多具有相同格式的文件中总共(每个数字)有多少个值。
对于一个工作表,我只使用=COUNTIF(F:F;288)
和=COUNTA(F:F)
但现在我必须在文件夹中使用超过30000个xlsx文件。
我的第一个意图是将它们合并到一个文件like this中,然后用this solution计数,但它在5279个标签后停止,我想这是一种限制。
我的所有文件都位于同一文件夹(H:\Macro\positions
)中,且只有F
列才会显示这些值。
每个文件有100-600个值,大约30000个文件。
操作必须只做一次,我不介意等几个小时才能完成。
你会怎么做?
答案 0 :(得分:2)
尝试下面的代码并按照注释 - 基本上代码打开给定文件夹中的每个电子表格,循环遍历该工作簿中的工作表,为每个工作表运行COUNTIF
公式并记录总计数
Option Explicit
Sub CheckForValue()
Dim objFso As FileSystemObject '<-- add Microsoft Scripting Runtime as a reference
Dim objFile As File
Dim wbToCheck As Workbook
Dim wsToCheck As Worksheet
Dim strPath As String
Dim varValue As Variant
Dim lngValueCount As Long
Dim lngTotal As Long
Dim wsf As WorksheetFunction
On Error Goto CleanUp
strPath = "H:\Macro\positions"
Set objFso = New FileSystemObject '<-- access to file system
varValue = 288 '<-- value you are looking for
lngTotal = 0 '<-- total count of value you are looking for
Set wsf = Application.WorksheetFunction '<-- shortcut to WorksheetFunction
' iterate files in folder
For Each objFile In objFso.GetFolder(strPath).Files
' only check spreadsheets
If objFile.Type = "Microsoft Excel Worksheet" Then
' get reference to workbook
Set wbToCheck = Workbooks.Open(objFile.Path)
' iterate worksheets
For Each wsToCheck In wbToCheck.Worksheets
' your original formula
lngValueCount = wsf.CountIf(wsToCheck.Range("F:F"), varValue)
' add to total
lngTotal = lngTotal + lngValueCount
Next wsToCheck
' close without saving changes
wbToCheck.Close SaveChanges:=False
End If
Next objFile
' final count of value you are looking for
Debug.Print "Total is: " & lngTotal
CleanUp:
' error handling
If Err.Number <> 0 Then
Debug.Print Err.Description
End If
Set objFile = Nothing
Set objFso = Nothing
End Sub
基于你的评论操作必须只进行一次,我不介意等待几个小时才能完成然后上面的代码就会这样做,只需要通过工作表检查价值。如果您想提高速度,可以在For
循环之前使用以下代码来帮助:
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.EnableEvents = False
然后转回设置(在CleanUp:
语句之后):
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Application.EnableEvents = True