Vba 写入vbscript以读取表中的数据并输出总小时数

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的总小时数=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
项目任务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中开始了一个答案,但你的解决方案更简单。