如何计算不同文件中值重复的次数?

时间:2017-06-16 08:42:43

标签: excel vba excel-vba count

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

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

但现在我必须在文件夹中使用超过30000个xlsx文件。

我的第一个意图是将它们合并到一个文件like this中,然后用this solution计数,但它在5279个标签后停止,我想这是一种限制。

我的所有文件都位于同一文件夹(H:\Macro\positions)中,且只有F列才会显示这些值。

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

操作必须只做一次,我不介意等几个小时才能完成。

你会怎么做?

1 个答案:

答案 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