我正在使用下面的表,其中有一些项目可以分解为任务,一个任务可能会出现多次。我的目标是获得相同任务的所有小时数的总和,例如任务1的总小时数= 33小时。
项目名称 任务名称 小时
项目1 任务1 4
项目1 任务1 7
项目1 任务1 4
项目1 任务1 7
项目1 任务1 4
项目1 任务1 7
项目1 任务2 4
项目1 任务2 3
项目1 任务2 15
项目1 任务2 3
项目1 任务2 4
项目1 任务3 3
项目1 任务3 4
项目1 任务3 3
项目2 任务1 7
项目2 任务1 4
项目2 任务1 3
项目2 任务4 4
项目2 任务4 7
项目2 任务4 4
项目2 任务4 3
项目2 任务5 3
项目2 任务5 3
项目2 任务5 4
这是我的目标输出:
项目1 小时
任务1 33
任务2 29
任务3 10
项目2 小时
任务1 14
任务4 15
任务5 10
表按项目名称排序,它们也是一个唯一的名称,但任务可能不是唯一的,因为任务1可能出现在项目1和项目2中,但只应对项目1进行总计,其中项目名称是项目1。
我一直在使用powershell试图在几天内完成输出,但无济于事。 Powershell可能有点不正统,所以我认为vb就是答案。我对vb没有太多经验,所以任何帮助都会非常感激。
答案 0 :(得分:2)
解决从表中选择和聚合数据问题的关键概念是SQL,SELECT,WHERE和GROUP BY。从VBA或VBScript使用SQL意味着ADO(连接,记录集)。 VBScript和VBA之间的语法差异只是一个小小的不便(开始here)。概念证明VBScript:
Option Explicit
Const adClipString = 2
Dim goFS : Set goFS = CreateObject( "Scripting.FileSystemObject" )
WScript.Quit demoMain()
Function demoMain()
demoMain = 0 ' assume success
Dim sDDir : sDDir = goFS.GetAbsolutePathName("..\Data\sumhours")
Dim sFiNa : sFiNa = "hours.txt"
Dim sFSpec : sFSpec = goFS.BuildPath(sDDir, sFiNa)
goFS.CreateTextFile(sFSpec, True).WriteLine Join(Array( _
"A;B;C" _
, "1;100;10" _
, "1;200;20" _
, "1;100;10" _
, "2;100;99" _
), vbCrLf)
Dim sC : sC = "Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=" & sDDir & ";"
Dim oXDb : Set oXDb = CreateObject("ADODB.Connection")
oXDb.open sC
WScript.Echo Join(Split("A B C"), vbTab)
WScript.Echo oXDb.Execute("SELECT * FROM [" & sFiNa & "]").GetString(adClipString, , vbTab, vbCrLf)
WScript.Echo oXDb.Execute("SELECT SUM(C) FROM [" & sFiNa & "] WHERE A = 1 AND B = 100").GetString(adClipString, , vbTab, vbCrLf)
WScript.Echo oXDb.Execute("SELECT A, B, SUM(C) FROM [" & sFiNa & "] GROUP BY A, B").GetString(adClipString, , vbTab, vbCrLf)
oXDb.Close
End Function ' demoMain
输出:
cscript 16504304.vbs
A B C
1 100 10
1 200 20
1 100 10
2 100 99
20
1 100 20
1 200 20
2 100 99
<强>更新强>
VBA'实施':
Option Explicit
' code.xls, accesses sumhours.xls
' Ref to ADO (2.8)
Sub Main()
Dim oXDb As New ADODB.Connection
Dim sSC: sSC = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\trials\SoTrials\answers\8328305\data\sumhours\sumhours.xls;Extended Properties=""Excel 8.0;HDR=YES;IMEX=1"""
oXDb.Open sSC
Debug.Print oXDb.Execute("SELECT SUM(C) FROM [Tbl1] WHERE A=1 AND B=100").GetString(2, 2, vbTab, vbCrLf)
oXDb.Close
End Sub
Powershell'实施':
$sSC = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\trials\SoTrials\answers\8328305\data\sumhours\sumhours.xls;Extended Properties="Excel 8.0;HDR=YES;IMEX=1"'
$oXDb = new-object -comobject ADODB.Connection
$oXDb.Open($sSC)
echo $oXDb.Execute("SELECT A, B, SUM(C) FROM [Tbl1] GROUP BY A, B").GetString(2, -1, " ", "`n")
$oXDb.Close()
只是为了表明语法只是语法。