按场景/年重复对列中的 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 个单元格求和的主要内容,如果未能解决你的问题,请参考以下文章

提取一列中倒数第二个单元格数值?

UICollectionViewLayout - 2 列中的 3 个单元格

比较MS Word表格列中的值,合并单元格并删除重复值

如果谷歌电子表格的同一列中的值重复,如何突出显示单元格?

VBA在选定的单元格中找到重复项并计算它们

excel 拖动公式或者拖动求和时,如果跳过隐藏单元格?求助