使用 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
因为这些单元格中有文本,所以不能对它们求和(据我所知,只能对数字求和)。
我有一个 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
因为这些单元格中有文本,所以不能对它们求和(据我所知,只能对数字求和)。