因此,具有以下结构(从A1开始-show snippet> run):

table {
  border-color: #BBB;
  border-width: 0px 0px 1px 1px;
  border-style: dotted;
}
body {
  font: 12px Arial, Tahoma, Helvetica, FreeSans, sans-serif;
  color: #333;
}
td {
  border-color: #BBB;
  border-width: 1px 1px 0px 0px;
  border-style: dotted;
  padding: 3px;
}
<table>
  <tbody>
    <tr>
      <th></th>
      <th>A</th>
      <th>B</th>
      <th>C</th>
      <th>D</th>
    </tr>
    <tr>
      <td>1</td>
      <td>Title 1</td>
      <td>Title 2</td>
      <td>Title 3</td>
      <td>Title 4</td>
    </tr>
    <tr>
      <td>2</td>
      <td>GH</td>
      <td>1</td>
      <td>434</td>
      <td>4</td>
    </tr>
    <tr>
      <td>3</td>
      <td>TH</td>
      <td>3</td>
      <td>435</td>
      <td>5</td>
    </tr>
    <tr>
      <td>4</td>
      <td>TH</td>
      <td>4</td>
      <td>4</td>
      <td>6</td>
    </tr>
    <tr>
      <td>5</td>
      <td>LH</td>
      <td>2</td>
      <td>0</td>
      <td>3</td>
    </tr>
    <tr>
      <td>6</td>
      <td>EH</td>
      <td>2</td>
      <td>5</td>
      <td>36</td>
    </tr>
  </tbody>
</table>


我编写了一些脚本来转换ListObject中的范围(A1:D6),添加了4个新列和小计:
Function test()

    Dim objLO As ListObject

    Set objLO = ActiveSheet.ListObjects.Add(xlSrcRange, Range("$A$1:$D$6"), , xlYes)
    objLO.Name = "Recap"
    objLO.TableStyle = "TableStyleMedium2"

    objLO.ListColumns.Add (objLO.ListColumns.Count + 1)
    objLO.HeaderRowRange(objLO.ListColumns.Count) = "Tot1"
    objLO.ListColumns.Add (objLO.ListColumns.Count + 1)
    objLO.HeaderRowRange(objLO.ListColumns.Count) = "Tot2"
    objLO.ListColumns.Add (objLO.ListColumns.Count + 1)
    objLO.HeaderRowRange(objLO.ListColumns.Count) = "Tot3"
    objLO.ListColumns.Add (objLO.ListColumns.Count + 1)
    objLO.HeaderRowRange(objLO.ListColumns.Count) = "Tot4"

    objLO.ShowTotals = True

    objLO.ListColumns("Tot1").TotalsCalculation = xlTotalsCalculationSum
    objLO.ListColumns("Tot2").TotalsCalculation = xlTotalsCalculationSum
    objLO.ListColumns("Tot3").TotalsCalculation = xlTotalsCalculationSum
    objLO.ListColumns("Tot4").TotalsCalculation = xlTotalsCalculationSum

End Function

现在,如果您在新列的任何单元格上输入一些数字,那么奇怪的是TOTAL(小计)不会更新;但是,如果您保存文件并重新打开它,它将可以使用,并且总数将会更新。
我想念的是什么?

我已经尝试过在TotalCalculation之后移动ShowTotals,但是行为保持不变。

如果我们现在从头开始重建工作表,并在上一代码中应用样式之后,将这部分代码添加到b,c和d列的小计中:
objLO.ListColumns("b").TotalsCalculation = xlTotalsCalculationSum
objLO.ListColumns("c").TotalsCalculation = xlTotalsCalculationSum
objLO.ListColumns("d").TotalsCalculation = xlTotalsCalculationSum

我注意到b,c和d的小计正在工作,但Tot1,Tot2等却没有。

似乎唯一的解决方法是在添加带有创建表的引用的ListObject之前构造原始表。
有人知道更好的解决方案吗?

提前致谢 :)

最佳答案

Excel表格中存在一个 Unresolved 错误,为了获得所需的结果,需要解决一些细微问题。

一种使用显式计算技巧的粗略修复方法确实有效,但是尽管此方法将基于数据行中的当前值更新总数,但每次数据表中的值更改时都需要应用它们。

有两种方法可以强制Excel计算总数:

  • 您可以切换父级工作表的“计算”状态:
    objLO.Parent.EnableCalculation = False
    objLO.Parent.EnableCalculation = True
    
  • 或者,您可以在合计公式中替换=:
    objLO.TotalsRowRange.Replace "=", "="
    

  • 但是上述两种方法都不能为您提供持久的解决方案,该解决方案可以自动使总数保持最新状态。

    一个更好的解决方案...

    解决方案的线索在于以下事实:对于将ListObject从范围转换为ListObject时存在的列,将动态计算小计。

    您可以利用这些知识,并确保将列插入到现有列之前,而不是将列添加到ListObject的末尾。但是,由于您最终希望新列位于最右边,因此该方法将需要使用原始范围内的虚拟列,然后将所有新列插入到Dummy列之前,最后可以删除Dummy列。

    请参阅此修改后的代码,并带有注释:
    Function test()
    
        Dim objLO As ListObject
    
        'Expand the selection to grab an additional Dummy column
        Set objLO = ActiveSheet.ListObjects.Add(xlSrcRange, Range("$A$1:$E$6"), , xlYes)
        objLO.Name = "Recap"
        objLO.TableStyle = "TableStyleMedium2"
    
        'Insert all of the new columns BEFORE the Dummy column
        objLO.ListColumns.Add (objLO.ListColumns.Count)
        objLO.HeaderRowRange(objLO.ListColumns.Count - 1) = "Tot1"
        objLO.ListColumns.Add (objLO.ListColumns.Count)
        objLO.HeaderRowRange(objLO.ListColumns.Count - 1) = "Tot2"
        objLO.ListColumns.Add (objLO.ListColumns.Count)
        objLO.HeaderRowRange(objLO.ListColumns.Count - 1) = "Tot3"
        objLO.ListColumns.Add (objLO.ListColumns.Count)
        objLO.HeaderRowRange(objLO.ListColumns.Count - 1) = "Tot4"
    
        'Must show totals BEFORE applying totals, otherwise the last column defaults to Count (even if we override it)
        objLO.ShowTotals = True
    
        objLO.ListColumns("Tot1").TotalsCalculation = xlTotalsCalculationSum
        objLO.ListColumns("Tot2").TotalsCalculation = xlTotalsCalculationSum
        objLO.ListColumns("Tot3").TotalsCalculation = xlTotalsCalculationSum
        objLO.ListColumns("Tot4").TotalsCalculation = xlTotalsCalculationSum
    
        'Remove the extra dummy column
        objLO.ListColumns(objLO.ListColumns.Count).Delete
    
        'Now toggle the ShowTotals to force the ListObject to recognise the new column totals
        objLO.ShowTotals = False
        objLO.ShowTotals = True
    
    End Function
    

    关于vba - Excel 2010,VBA和ListObjects小计在表更改时未更新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28840857/

    10-10 15:03