使用 VBScript 从动态列中获取 EXCEL 工作表中文件大小的总和

Get the SUM of file sizes within in an EXCEL Worksheet from a Dynamic Column using VBScript

我有一个 VBScript,它计算文件夹中的所有 MSI,并将信息输出到 excel sheet,它显示 4 列 A = MSI 名称,B = 文件大小,C = 创建日期,D = 路径。在最后一个空行的最后,迭代后又输出了两条信息。第一个总包数,我只是使用一个简单的计数器来满足我的需要,第二个总文件大小,这是我在这里想要完成的。我需要脚本从 B2 开始直到倒数第二行,因为最后一行将包含第二条输出的信息 "Total File Size:123gb"。这些行是动态的,因此随着更多 MSI 的创建,此列表将会增长。这是我到目前为止得到的代码。无论我做什么,总文件大小始终为 0。提前致谢!

Excel.VBS

Option Explicit 'force all variables to be declared
Dim msiName, msiSize, msiCreated, msiPath, msiCount, Suffix
Dim objFSO
Dim objWorksheet
Dim objExcel
Dim objWorkbook
Dim intRow
Dim ch

Const ForWriting = 2
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = true
Set objWorkbook = objExcel.Workbooks.Add()
Set objWorksheet = objWorkbook.Worksheets(1)


Recurse objFSO.GetFolder("Z:\")

Dim lastRowB, fileSizeTotal, objFileSizeSum
objFileSizeSum = objWorksheet.Range("B2:B744")
fileSizeTotal = objExcel.WorksheetFunction.Sum(objFileSizeSum)
lastRowB = objWorksheet.Range("B65536").End(-4162).Row + 1
objExcel.Cells(lastRowB, 2) = "Total File Size: " & fileSizeTotal

objExcel.Cells.EntireColumn.AutoFit


MsgBox ("Complete")

intRow = 2
msiCount = 0

Sub Recurse(objFolder)
    Dim objFile, objSubFolder
    For Each objFile In objFolder.Files
        If LCase(objFSO.GetExtensionName(objFile.Name)) = "msi" Then
            objExcel.Cells(1,1) = "MSI Name"
            objExcel.Cells(1,2) = "MSI Size"
            objExcel.Cells(1,3) = "Created Date"
            objExcel.Cells(1,4) = "File Path"

            msiName = objFile.Name
            msiSize = ConvertSize(objFile.Size)
            msiCreated = objFile.DateCreated
            msiPath = objFile.ParentFolder

            intRow = intRow + 1
            objExcel.Cells(intRow, 1).Value = msiName
            objExcel.Cells(intRow, 2).Value = msiSize
            objExcel.Cells(intRow, 3).Value = msiCreated
            objExcel.Cells(intRow, 4).Value = msiPath

            msiCount = msiCount + 1

            Dim lastRowA
            lastRowA = objWorksheet.Range("A65536").End(-4162).Row + 1
            objExcel.Cells(lastRowA, 1) = "Total Packages: " & msiCount - 1 

            objExcel.Cells.EntireColumn.AutoFit

        End If
    Next

    For Each objSubFolder In objFolder.SubFolders
        Recurse objSubFolder
    Next
End Sub

Function ConvertSize(Size)
Do While InStr(Size,",") 'Remove commas from size
    CommaLocate = InStr(Size,",")
    Size = Mid(Size,1,CommaLocate - 1) & _
        Mid(Size,CommaLocate + 1,Len(Size) - CommaLocate)
Loop

Suffix = " Bytes"
If Size >= 1024 Then suffix = " KB"
If Size >= 1048576 Then suffix = " MB"
If Size >= 1073741824 Then suffix = " GB"
If Size >= 1099511627776 Then suffix = " TB"

Select Case Suffix
    Case " KB" Size = Round(Size / 1024, 1)
    Case " MB" Size = Round(Size / 1048576, 1)
    Case " GB" Size = Round(Size / 1073741824, 1)
    Case " TB" Size = Round(Size / 1099511627776, 1)
End Select

ConvertSize = Size & Suffix
End Function

示例输出

MSI_2_02_002.msi    24.8 MB 10/7/2019    11:23  Z:\Xyz
MSI_1_1.msi         439 KB  11/6/2019    13:10  Z:\Xyz
MSI_S_1_1.msi       439 KB  11/18/2019   12:12  Z:\Xyz
Total Packages: 743 Total File Size: 0      

因为您已经在两个不同的过程中设计了代码,我认为最简单的方法是使用 Public 变量。

您可以在模式顶部创建一个 Public 变量,如下所示:

Public TotalSize

然后,在您的程序 Sub Recurse(objFolder) 中,在您的 For..Next 中,我会添加:

TotalSize=TotalSize+objFile.Size

因此在循环结束时,变量 TotalSize 将是您的总计。

第二步是将该总计调用到您的主子中,其中一行如下:

objExcel.Cells(lastRowB, 2)=ConvertSize(TotalSize).

第一种方法不起作用的原因是,根据您的代码,您的输出是一个字符串。您得到了:

24.8 MB
439 KB
439 KB

因为这些单元格中有文本,所以不能对它们求和(据我所知,只能对数字求和)。