【问题标题】:VBscript for Excel to count strings within a columnVBscript for Excel 计算列中的字符串
【发布时间】:2013-08-29 23:47:05
【问题描述】:

我每个月都会收到大约 300 个 Excel 文件。我需要从每个文件中的某个工作表中获取 C 列的计数。我尝试了 VBA,但我无法将宏嵌入到每个文件中(由于每个位置的物流和安全性)。我还尝试了一个“摘要”文件,其中包含指向每个文件的链接,但链接变得不稳定,我无法相信我得到的数字。所以我想到了一个vbscript。

我只想计算某些代码:XF、RE、AG 和 LK。我不在乎列中还有什么或是否有空白。

列的名称是“代码”(不确定这是否有区别)

我感兴趣的工作表名称是“Ticket Source”。工作簿中还有其他几张工作表。

我希望将计数保存在一个文件(TXT 或 CSV)中,其中包含文件名、代码和该代码的计数。

例子:

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

文件名是任何东西,所以我必须创建一个批处理文件来针对文件名运行。我使用的 Excel 版本是 2010。

我不知道该怎么做。有人可以帮忙吗?

【问题讨论】:

  • 你有更好的方法,更喜欢最坏的方法,而不是纠正“链接变得不稳定”???每次调用 VBScript 都会创建一个新的 Excel 实例...使用“摘要”文件会更快更有效...

标签: excel vbscript


【解决方案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

【讨论】:

    【解决方案2】:

    试试这样的:

    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
    

    当然,您需要根据需要调整列号和输出文件名。

    【讨论】:

    • ws.UsedRange.Columns(23).Cells 来自哪里?同意除此之外的所有内容。
    • 在某些文件上,它询问“是否要保存对文件的更改?”有没有办法抑制该消息或告诉它不要保存文件?否则,似乎像宣传的那样工作。
    • @LS_dev 23 只是我选择的一个随机数作为示例,因此需要将其替换为答案末尾提到的正确列号。整个语句返回工作表中使用的单元格范围的特定列的单元格。
    • @Mr_Thomas 如果您不想保存工作簿,可以在关闭之前将Saved 属性设置为True。请参阅更新的答案。请注意,这将放弃对工作簿的所有更改。
    • @Thomas 抱歉,没有阅读最后一行。但是,应该使用Intersect(ws.Columns("C"), ws.UsedRange).Cells,因为您不能保证UsedRange 从A 列开始。另外wb.Close False 消除了对wb.Saved = True 行的需要。
    猜你喜欢
    • 2022-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多