2013-08-29 38 views
0

每個月我收到大約300個Excel文件。我需要從每個文件中的某張表中獲得列C的數量。我嘗試過VBA,但是我無法在每個文件中嵌入宏(由於每個位置的物流和安全性)。我也嘗試過一個帶有每個文件鏈接的「摘要」文件,但鏈接變得不穩定,我不能相信我得到的數字。所以我想到了一個VBScript。VBscript for Excel計算列中的字符串數

我只希望計算一些代碼:XF,RE,AG和LK。我不在乎列中還有什麼,或者是否有空格。

列的名稱是「編碼」(不知道是否有差別)

片我感興趣的名稱是「票務源」。工作簿中還有其他幾張工作表。

我希望計數最終在一個包含文件名,代碼和該代碼計數的文件(TXT或CSV)中。

例子:

Filename: NORTHWEST 
XF - 260 
RE - 120 
AG - 320 
LK - 250 

文件名是什麼,一切,所以我必須創建一個批處理文件來對文件的名稱來運行。我使用的Excel版本是2010.

我不知道如何做到這一點。誰能幫忙?

+0

你有更好的方法,喜歡最差的一個對糾正「鏈接變得不穩定」 ???每次調用VBScript都會創建一個新的Excel實例...使用'summary'文件將更加快速有效... –

回答

0

嘗試這樣:

Set fso = CreateObject("Scripting.FileSystemObject") 
Set xl = CreateObject("Excel.Application") 
xl.Visible = True 'set to False for production 

Set outfile = fso.OpenTextFile("output.txt", 2, True) 

For Each f In fso.GetFolder("C:\some\folder").Files 
    If LCase(fso.GetExtensionName(f) = "xlsx" Then 
    Set wb = xl.Workbooks.Open(f.Path) 
    Set ws = wb.Sheets("Ticket Source") 

    xf = 0 
    re = 0 

    For Each cell In ws.UsedRange.Columns(23).Cells 
     Select Case cell.Value 
     Case "XF" : xf = xf + 1 
     Case "RE" : re = re + 1 
     End Select 
    Next 

    outfile.WriteLine "Filename: " & f.Name _ 
     & vbNewline & "XF - " & xf _ 
     & vbNewLine & "RE - " & re 

    wb.Saved = True 
    wb.Close 
    End If 
Next 

outfile.Close 
xl.Quit 

當然,你需要調整列數和輸出文件名您的需求。

+0

從哪裏來'ws.UsedRange.Columns(23).Cells'來自哪裏?同意除此之外的一切。 –

+0

在其中一些文件問「你想保存對文件的更改嗎?」有沒有辦法壓制這個消息或者告訴它不要保存文件?否則,似乎像廣告一樣工作。 –

+0

@LS_dev 23只是我選擇的一個隨機數作爲示例,因此需要使用我在答案末尾提到的正確列號替換。整個語句返回工作表中使用單元格範圍的特定列的單元格。 –

1

VBScript中,將通過使用COUNTIF而不是在每一個小區單獨找得到的計數:

Dim oShell 
Dim oFSO 
Dim oOutput 
Dim oFile 
Dim xlApp 
Dim strFolderPath 
Dim Code 

Set oShell = CreateObject("Shell.Application") 
On Error Resume Next 
strFolderPath = oShell.BrowseForFolder(0, "Select a Folder", 0).Self.Path 
On Error GoTo 0 

If Len(strFolderPath) > 0 Then 
    Set oFSO = CreateObject("Scripting.FileSystemObject") 
    Set oOutput = oFSO.CreateTextFile(oShell.NameSpace(&h10).Self.Path & "\Code Counts.txt", True) 'Puts the output file on your desktop 
    Set xlApp = CreateObject("Excel.Application") 

    For Each oFile in oFSO.GetFolder(strFolderPath).Files 
     If LCase(Left(oFSO.GetExtensionName(oFile), 3)) = "xls" Then 
      With xlApp.Workbooks.Open(oFile.Path) 
       If xlApp.Evaluate("ISREF('Ticket Source'!A1)") = True Then 
        oOutput.WriteLine "Filename: " & oFile.Name 
        For Each Code in Array("XF", "RE", "AG", "LK") 
         oOutput.WriteLine Code & " - " & xlApp.Evaluate("COUNTIF('Ticket Source'!C:C,""" & Code & """)") 
        Next 
       End If 
       .Close False 
      End With 
     End If 
    Next 

    xlApp.Quit 
    oOutput.Close 

    MsgBox "Code Counts Completed" 

End If 

Set oShell = Nothing 
Set oFSO = Nothing 
Set oOutput = Nothing 
Set oFile = Nothing 
Set xlApp = Nothing