Vba 写入vbscript以读取表中的数据并输出总小时数
我正在使用一个如下表,其中有一些项目被分解为任务,一个任务可能会出现多次。我的目标是得到相同任务的所有小时数之和,例如任务1的总小时数=33小时 项目名称任务名称小时数Vba 写入vbscript以读取表中的数据并输出总小时数,vba,excel,vbscript,Vba,Excel,Vbscript,我正在使用一个如下表,其中有一些项目被分解为任务,一个任务可能会出现多次。我的目标是得到相同任务的所有小时数之和,例如任务1的总小时数=33小时 项目名称任务名称小时数 项目1任务14 项目1任务17 项目1任务14 项目1任务17 项目1任务14 项目1任务17 项目1任务24 项目1任务23 项目1任务215 项目1任务23 项目1任务24 项目1任务33 项目1任务34 项目1任务33 项目任务17 项目任务14 项目任务13 项目任务44 项目任务47 项目任务44 项目任务43 项目任
项目1任务14
项目1任务17
项目1任务14
项目1任务17
项目1任务14
项目1任务17
项目1任务24
项目1任务23
项目1任务215
项目1任务23
项目1任务24
项目1任务33
项目1任务34
项目1任务33
项目任务17
项目任务14
项目任务13
项目任务44
项目任务47
项目任务44
项目任务43
项目任务53
项目任务53
项目任务54
这是我的目标输出: 项目1小时
任务133
任务229
任务310
项目2小时
任务114
任务415
任务510
该表是按项目名称排序的,它们也是唯一的名称,但是任务可能不是唯一的,因为任务1可能出现在项目1和项目2中,但应该仅对项目1进行合计,其中项目名称为项目1
我已经使用powershell尝试获取该输出好几天了,但都没有用。Powershell可能有点不正统,所以我认为vb就是答案。我对vb不是很有经验,因此非常感谢您的帮助。解决从表中选择和聚合数据问题的关键概念是SQL、SELECT、WHERE和GROUP BY。使用VBA或VBScript中的SQL意味着ADO(连接、记录集)。VBScript和VBA之间的语法差异只是一个小小的不便(开始)。概念验证脚本:
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()
只是为了说明语法就是语法。所以你想在
vbscript
或VBA
?+1中这样做,我在VBA with dictionary中开始了一个答案,但你的解决方案更简单。