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

时间:2013-05-12 04:47:21

标签: vba excel-vba vbscript excel

我正在使用下面的表,其中有一些项目可以分解为任务,一个任务可能会出现多次。我的目标是获得相同任务的所有小时数的总和,例如任务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没有太多经验,所以任何帮助都会非常感激。

1 个答案:

答案 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()

只是为了表明语法只是语法。