【问题标题】:Excel: Insert formulas in a dynamic rangeExcel:在动态范围内插入公式
【发布时间】:2022-04-06 10:15:08
【问题描述】:

上下文:

根据几个输入列的大小,我希望有一列包含可调整到这些输入列大小的公式。我知道如何使用 VBA 做到这一点,但我真的很想知道是否有其他方法可以做到这一点。

详情:

这是一个基本设置,其中 A 列和 B 列是值,C 列由一个简单的公式组成,特别是区域 C2 具有公式 =A2+B2。现在我可以通过使用Formulas > Name Manager 并插入公式rng_A=OFFSET(Sheet1!$A$2;;;COUNTA(Sheet1!$A$2:$A$40);)rng_B=OFFSET(Sheet1!$B$2;;;COUNTA(Sheet1!$B$2:$B$40);) 来使列A 和B 动态范围,如下所示:

这对于您可以使用命名范围来动态显示数据的图表非常有用,如下所示:

现在,如果我在 A 列中插入两个新数字,图表会自动将它们添加到行中:

问题

如果我想在图表中添加 C 列,可以通过添加一个新的命名范围来轻松完成,但我必须在范围 C8 和 C9 中插入两个新公式。是否可以以任何方式使 C 列成为由公式组成的动态范围? 没有在这里用=IF(A8="";"";A8+B8)等公式填充整个列:

使用 VBA sn-p?

感谢您的任何建议!

【问题讨论】:

    标签: excel


    【解决方案1】:

    使用table(选择您的范围,然后插入>表格)并使C成为计算列。

    这样,当您向表中添加更多行时,公式将应用于该行中的 C 列。

    【讨论】:

      【解决方案2】:

      考虑只使用像这样的事件过程。

      Private Sub Worksheet_Change(ByVal Target As Range)
      
          Dim Rng As Range
      
          If Target.Cells.CountLarge = 1 Then
              Set Rng = Range(Cells(2, "A"), Cells(Rows.Count, "A").End(xlUp).Offset(0, 1))
              If Not Application.Intersect(Target, Rng) Is Nothing Then
                  Application.EnableEvents = False
                  With Target
                      Set Rng = Range(Cells(.Row, "A"), Cells(.Row, "C"))
                  End With
                  With Rng
                      .Cells(3).Value = .Cells(1).Value + .Cells(2).Value
                  End With
                  Application.EnableEvents = True
              End If
          End If
      End Sub
      

      每当您对 A 或 B 进行更改时,都会在 C 列中生成总计。如果只有 B 列有值,则可以调整公式以写入零或空白单元格。

      【讨论】:

        【解决方案3】:

        在工作表代码中,使用更改事件:

        Private Sub Worksheet_Change(ByVal Target As Range)
        If Target.Column = 1 Or Target.Column = 2 Then
        Range("C" & Target.Row).Formula = "=A" & Target.Row & "+B" & Target.Row
        End If
        End Sub
        

        【讨论】:

          【解决方案4】:

          桌子是完成此任务的好方法,我不会敲它。相反,如果您特别想要一种没有 VBA 或命名范围的公式化方法,那么您有 FILTER()

          一种简单的方法:

          FILTER(A:A,A:A<>"")
          

          但是,您的输入数据有一个标题,因此您也必须将其过滤掉:

          FILTER(A:A,(A:A<>"")*(A:A<>A1))
          

          这里的星号充当布尔 AND。每个子测试都返回一个由 TRUE/FALSE 组成的数组,有一百万个条目长(一列的最大大小),但您可以让 Excel 处理这种细微差别。乘法将 TRUE/FALSE 转换为 1/0。 1*1=1,其他所有内容 =0,因此它本质上会产生一个包含一百万个 1/0 结果的数组,该数组定义了输入列中哪些单元格(也是一百万个条目)通过过滤器的标准。

          于是C2就变成了:

          =FILTER(A:A,(A:A<>"")*(A:A<>A1))+FILTER(B:B,(B:B<>"")*(B:B<>B1))
          

          如果您想处理仅填充 A 或 B 而不是同时填充的可能性,您可以将其包装在 IFERROR 函数中。或者允许#N/A错误存在;由你决定。我确信有一种方法可以减少 C2# 处溢出的数组,使其长度与 A 或 B 中较短者一样长,但我将把它留给读者作为练习。

          【讨论】:

            猜你喜欢
            • 2017-05-31
            • 2017-04-06
            • 1970-01-01
            • 2018-07-05
            • 1970-01-01
            • 2014-12-21
            • 2013-01-29
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多