【问题标题】:Excel Table - Convert Range-Based Formula to Field-BasedExcel 表 - 将基于范围的公式转换为基于字段的公式
【发布时间】:2020-03-31 13:24:51
【问题描述】:

我继承了一个非常大的电子表格,并正在尝试将其迁移到数据库中。该表有 300 多列,其中许多列引用了其他列。

通过将其转换为Excel中的表格(ListObject),我认为解构逻辑会更容易......基本上是转公式:

=CJ6-CY6

进入

=[@[Sale Price]]-[@[Standard Cost]]

将其转换为表格效果很好……不幸的是,它并没有改变任何嵌入的公式。他们仍然引用范围。

我想我可能从概念上理解为什么 - 如果一个公式引用另一行中的一个值,那么它就不再是一个原始计算。但是对于都在同一行的公式,我想知道是否有任何方法可以转换它们,而无需手动进入这 300 多列中的每一列并重新编写它们。其中一些是野兽。不开玩笑,这是一个例子:

=IF(IF(IF(HD6="",0,IF(HD6=24,0,IF(HD6="U",((FI6-(ES6*12))*$I6),($ I6*FI6)*HS6)))GO6,GO6,IF(IF(HD6="",0,IF(HD6=24,0,IF(HD6="U",(( FI6-(ES6*12))*$I6),($I6*FI6)*HS6)))

这还不是最糟糕的。

如果有人有想法,我会欢迎他们。我对任何事情都持开放态度。包括 VBA。

【问题讨论】:

  • 我自己也为此苦苦挣扎,但没有找到解决方案。保持引用结构化的提示:您可以使用 OFFSET 公式与表外值的命名范围配对来引用当前行上方/下方的值。
  • ^ 但是 OFFSET 是不稳定的,因此对于非常大的电子表格可能不是一个好的建议。
  • 在一个表中你只需要改变一行。你不能做一个查找和替换吗?
  • @SJR -- 是的,但它会是 300 多个查找和替换操作,一次一个。我正在尝试暴力破解 VBA,但我希望某处有一个优雅的解决方案
  • 我希望主人能把它做成一张桌子开始......但是虽然我很希望,但我也真的想要一匹小马

标签: excel excel-formula listobject


【解决方案1】:

我永远不会用它来教授计算机科学,但这是成功的秘诀。为简单起见,我将标题名称和相应的列转换为 A17:

然后这段 VBA 代码成功地将每个范围转换为相应的列属性。

Sub FooBomb()

  Dim ws As Worksheet
  Dim r, rw, translate As Range
  Dim col, row As Integer
  Dim find, anchored, repl As String

  Set ws = ActiveWorkbook.ActiveSheet
  Set rw = ws.Rows(6)
  Set translate = ws.Range("A17:B363")

  For col = 12 To 347
    Set r = rw.Cells(1, col)

    For row = 363 To 17 Step -1
      find = ws.Cells(row, 1).Value2 & "6"
      anchored = "$" & find
      repl = "[@[" & ws.Cells(row, 2).Value2 & "]]"

      r.Formula = VBA.Replace(r.Formula, anchored, repl)
      r.Formula = VBA.Replace(r.Formula, find, repl)
    Next row

  Next col

End Sub

硬编码且不可扩展,但我不想再重复了。

-- 编辑--

明智的说法有助于提高性能,尤其是在此电子表格中有尽可能多的列和公式时。

  1. 将公式计算设置为手动之前
  2. 在替换之前检查该字段是否存在 -- 跳过的情况经常发生

程序在这些更改前几秒钟(几分钟前)运行:

  If InStr(r.Formula, anchored) > 0 Then
    r.Formula = VBA.Replace(r.Formula, anchored, repl)
  End If

  If InStr(r.Formula, find) > 0 Then
    r.Formula = VBA.Replace(r.Formula, find, repl)
  End If

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    相关资源
    最近更新 更多