2017-06-16 90 views
1

我想知道重複值的次數,例如288,以及在具有相同格式的許多文件中總共有多少個值(每個數字)。如何計算在不同文件中重複值的次數?

對於一個工作表中我只想用=COUNTIF(F:F;288)=COUNTA(F:F)

但現在我有一個文件夾內超過30000個XLSX檔案做到這一點。

我的第一個意圖是將它們合併爲一個文件like this,然後計數爲this solution,但它在5279個標籤頁後停止,我猜是出於某種限制。

我的所有文件都位於同一個文件夾(H:\Macro\positions)中,並且值僅在列F中預期。

每個文件有100-600個值,大約30000個文件。

該操作只需完成一次,我不介意等待幾個小時才能完成。

你會怎麼做?

+1

是否所有的xlsx在同一個文件夾中,並且是僅在該文件夾中每個文件的每個工作表的F列中預期的值? –

+0

是的,H:\ Macro \職位,只是在F列。 –

+0

有多少值必須計算?我的意思是30000文件很多。打開excel文件需要很多時間,這就是爲什麼你應該以某種方式合併它們。你可以循環合併的文件然後將計數器存儲在一個數組中。 – UGP

回答

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 
+0

我試了一下,併爲一個小樣本工作。我現在將使用它與我的30000文件,並讓你知道它是否擴展好。非常感謝你。 –

+0

現在閱讀編輯,完美,我將使用加速。 –

+1

我糾正了編輯 - 重新打開設置的代碼應該在CleanUp塊中,以防發生錯誤。我還添加了一個'On Error Goto CleanUp'命令。 –