按场景/年重复对列中的 46 个单元格求和
Posted
技术标签:
【中文标题】按场景/年重复对列中的 46 个单元格求和【英文标题】:Summing 46 cells in a column repeatedly, by scenario/year 【发布时间】:2015-09-30 21:21:12 【问题描述】:我有以下区域经济数据,其中包含截至 2100 年各行业的估计产出,适用于各种增长情景。
我想将每个部门的价值相加,以获得区域产出估计值。这需要每 46 个单元格重复聚合输出列,将结果放在另一列中(最好还附加其他信息,例如年份/场景 ID 等)。
因为有 >1,000,000 个单元格,所以这不是一项可以手工完成的工作。按情景、年份和地区对所有部门的区域产出求和的最简单方法是什么?
以下是一些示例数据:
scenario year region_id region_name sector_id sector_name value/output
1A_1C_1C 2000 1 London 2 Mining & quarrying 642.2357178
1A_1C_1C 2000 1 London 3 Food, drink & tobacco 1979.741211
1A_1C_1C 2000 1 London 4 Textiles etc 586.706604
1A_1C_1C 2000 1 London 5 Wood & paper 318.1535339
1A_1C_1C 2000 1 London 6 Printing & recording 1749.062012
...
1A_1C_1C 2000 2 South East 1 Agriculture etc 771.9697876
1A_1C_1C 2000 2 South East 2 Mining & quarrying 542.2153931
1A_1C_1C 2000 2 South East 3 Food, drink & tob. 1990.234009
1A_1C_1C 2000 2 South East 4 Textiles etc 205.3581085
编辑:是否可以通过从第 7 列获取每个区域的输出总和并将它们放在第 8 列中来报告结果。理想情况下,第 9 列将包含特定区域名称,第 10 列将包含特定场景变种,像这样:
Output Region Scenario Year
XXXXXX London 1A_1C_1C 2000
XXXXXX South East 1A_1C_1C 2000
...
XXXXXX London 1B_1C_1A 2000
XXXXXX South East 1B_1C_1A 2000
...
编辑:在输出示例中添加“年份”
【问题讨论】:
这个问题需要提供一些关于如何报告结果的想法。 @Jeeped - 已编辑问题以反映您的评论。谢谢。 原始叙述还指定了年份。您是在寻找所有年份的总和还是按“情景、年份和地区”细分的总和? @Jeeped - 我再次提出了更具体的问题。在第一个例子中,我正在寻找一种可以适应任何标准组合的方法,但现在我已经将其改进为规定的格式,这个答案将是完美的。谢谢。 【参考方案1】:看来您实际上是在要求一个聚合的 SQL SELECT 语句,也许它应该被这样对待。
Sub Sheets_Group_Having()
'Dim cnx As ADODB.Connection, rs As ADODB.Recordset
Dim cnx As Object, rs As Object
Dim sWS As String, sWB As String, sCNX As String, sSQL As String
Dim ws1TBLaddr As String
sWB = ThisWorkbook.FullName
sWS = "Source Data Worksheet Name HERE" `<~~ set the worksheet with the source data
ws1TBLaddr = WorkSheets(sWS).Cells(1, 1).CurrentRegion.Address(0, 0)
sCNX = "Provider=Microsoft.Jet.OLEDB.12.0;Data Source=" & sWB _
& ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
Set cnx = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
cnx.Open sCNX
sSQL = "SELECT SUM(w1.[value/output]), w1.[region_name], w1.[scenario], w1.[year] FROM [" & sWS & "$" & ws1TBLaddr & "] w1"
sSQL = sSQL & " GROUP BY w1.[region_id], w1.[region_name], w1.[scenario], w1.[year]"
sSQL = sSQL & " ORDER BY w1.[region_id], w1.[scenario]"
'Debug.Print sSQL
rs.Open sSQL, cnx
With Worksheets.Add(after:=Sheets(Sheets.Count))
.Name = "Summary Data"
.Range("A1").Resize(1, 4) = Array("output", "region", "scenario", "year")
.Range("A2").CopyFromRecordset rs
End With
rs.Close: Set rs = Nothing
cnx.Close: Set cnx = Nothing
End Sub
【讨论】:
感谢@Jeeped 的回答。我不熟悉 SQL,但确实应该如此,所以我将尝试使用您提供的代码。谢谢。【参考方案2】:我研究了如何在 Excel 中进行数值计算。这是公式:
=SUM(OFFSET($E$2,(ROW()-2)*46,0,46,1))
这将使用 OFFSET 函数每 46 行向下汇总 E2 中的所有值。诀窍是在 row() 中,它返回行号,从该数字中取 2(正如我在 C2 上开始的那样),然后将其乘以 46,以将 SUM 函数向下移动列。
【讨论】:
以上是关于按场景/年重复对列中的 46 个单元格求和的主要内容,如果未能解决你的问题,请参考以下文章