0

以下のようなテーブルで作業しています。ここでは、タスクに分割されたプロジェクトがあり、1 つのタスクが複数回表示される場合があります。同じタスクのすべての時間の合計を取得することを目指しているため、たとえば、タスク 1 の合計時間 = 33 時間です。

Project NameTask NameHours
Project 1      Task 1      4      
Project 1      Task 1      7      
Project 1      Task 1      4      
Project 1      Task 1      7      
Project 1      Task 1      4      
Project 1      Task 1      7      
Project 1      Task 2      4      
Project 1      Task 2      3      
Project 1      Task 2      15    
Project 1      Task 2      3      
Project 1      Task 2      4      
Project 1      Task 3      3      
Project 1      Task 3      4      
Project 1      Task 3      3      
Project 2      Task 1      7      
Project 2      Task 1      4      
Project 2      Task 1      3      
Project 2      Task 4      4      
Project 2      Task 4      7      
Project 2      Task 4      4      
Project 2      Task 4      3      
Project 2      Task 5      3      
Project 2      Task 5      3      
Project 2      Task 5      4      

これは私が目指している出力です:

Project 1Hours
Task 1      33      
Task 2      29      
Task 3      10      

Project 2Hours
Task 1      14      
Task 4      15      
Task 5      10      

表はプロジェクト名で並べられており、それらは一意の名前でもありますが、タスク 1 がプロジェクト 1 とプロジェクト 2 に表示される場合があるように、タスクは一意ではない場合がありますが、プロジェクト 1 についてのみ合計する必要があります。プロジェクト1です。

私はpowershellを使用して、何日もその出力を試してみましたが、役に立ちませんでした。Powershellはおそらく少しオーソドックスではないので、vbが答えだと思います。私はvbの経験があまりないので、どんな助けでも大歓迎です。

4

1 に答える 1

2

テーブルからデータを選択して集計する問題を解決するための重要な概念は、SQL、SELECT、WHERE、および GROUP BY です。VBA または VBScript から SQL を使用することは、ADO (接続、レコードセット) を意味します。VBScript と VBA の構文上の違いは、ほんのわずかな不都合です (ここから始めてください)。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()

構文が単なる構文であることを示すだけです。

于 2013-05-12T10:22:01.690 に答える