我如何计算一个值在不同文件间重复的次数?

我想知道一个值重复的次数,例如288,以及在许多具有相同格式的文件中总共有多less个值(每个数字)。

对于一个工作表,我只用=COUNTIF(F:F;288)=COUNTA(F:F)

但是现在我必须用一个文件夹中的超过30000个xlsx文件来做到这一点。

我的第一个意图是将它们合并成一个这样的文件,然后用这个解决scheme计算 ,但是在5279个标签之后它停止了,我猜想是有某种限制的。

我所有的文件都在同一个文件夹( H:\Macro\positions )中,并且这些值只在列F

每个文件有100-600个值,大约30000个文件。

手术只需要做一次,我不介意等待几个小时才能完成。

你会怎么做?

尝试下面的代码并按照注释 – 基本上,代码将打开给定文件夹中的每个电子表格,循环显示该工作簿中的工作表,为每个工作表运行COUNTIF公式,并logging总计数。

 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