【问题标题】:Use code to modify Excel formulas使用代码修改 Excel 公式
【发布时间】:2015-03-25 23:28:43
【问题描述】:

我有一个 Excel 2010 工作簿,其中包含 22 个工作表。第一个工作表标记为 DATA,其中数据由用户输入。 A1-N1 行包含标签。 A2-A18 行包含 2015 年 1 月从单元格 A2 开始的 17 个位置的数据,即第 2 行包含位置 1 的数据,第 3 行包含位置 3 的数据等。2 月的数据从第 19 行开始,3 月从第 36 行开始,等等。

在每个工作表 A1-M1 上是标签,第 2-13 行是 1 月 - 12 月。工作表 #2 上的单元格 B2 引用工作表 DATA 上的单元格 J2。工作表#2 的第 2 行的其他公式引用了工作表 DATA 的第 2 行的单元格。工作表#2 的第 3 行引用了 DATA 第 19 行的单元格。在每个位置工作表的 N 列中,单元格 N2 中都有一个数字,对应于工作表 DATA 上的适用行。

这是我的一个公式的示例:

=(IF(ISBLANK(DATA!D2),"-",IF(ISERROR(DATA!E2/DATA!D2),"N/A",(DATA!E2/DATA!D2))))。

我想要 VB 代码或宏?,它将编辑每个工作表上的每个公式,方法是将公式中的当前数字替换为同一行 N 列中的数字,即如果 N7 包含数字 88该代码将通过删除公式中的当前数字并替换为数字 88 来更改该行上的任何公式。

其他信息:

在每个工作表上,B-M 列都有不同的公式。代码需要获取该行 N 列中的数字,并将该公式中的任何数字替换为该行的 N 列中的数字,对于每一行,对于每个工作表。

目前,我必须触摸每个工作表上的每个公式,这太耗时了。从 4 月开始,地点将从 17 个增加到 148 个,这将需要编码以进行适当的更改。

数据工作表图片

1R 位置工作表图片

【问题讨论】:

  • 您想更改哪些范围/单元格的公式?每列中的行数总是相同吗?到目前为止,您尝试过什么?
  • 在每个位置工作表公式都在 B2:M13 范围内,并且每个位置工作表包含相同数量的行/列。我没有编码经验,所以我没有尝试过任何形式的编码。我一直在通过在每个工作表的每一行上使用查找/替换来修改每个公式。
  • 您能告诉我们您的数据是如何组织的吗?在任何免费图片托管网站(例如imgur.com)上传屏幕截图,然后在评论中发布链接或编辑您的帖子
  • 有没有办法将电子表格上传到这个帖子?我将删除多余的工作表,只包括 DATA 工作表和一个位置工作表。位置工作表上有多个公式。发布它们会有帮助吗?
  • 它会是,我不知道什么是托管它的好网站。问题是,很难知道使用什么搜索模式来查找和替换随机公式中的数字。公式是否总是您上面显示的形式?您要替换的数字是否始终相同(即示例公式中的 2)?公式中是否会有您不想想要替换的数字?在不知道这一点的情况下,甚至开始想出解决方案都有些棘手。

标签: vba excel


【解决方案1】:

我不在我的工作计算机上,所以我没有机会测试这段代码,但我相信这应该可以满足您的需求。如果有任何问题,请告诉我,我明天上班看看。

Sub replace_numbers()
  Dim ws As Worksheet
  Dim c As Range
  Dim replace_with As Long
  Dim objRegex As Object

  'Application.EnableEvents = False
  'Application.ScreenUpdating = False
  'Application.DisplayStatusBar = False
  'Application.Calculation = xlCalculationManual

  Set objRegex = CreateObject("vbscript.regexp")

  With objRegex
    .Global = True
    .Pattern = "\d+"
  End With

  For Each ws In Worksheets
    If ws.Name <> "DATA" Then
      For Each c In ws.Range("B2:M13")
        replace_with = CLng(Intersect(ws.Columns("N"), ws.Rows(c.Row)).Value)
        c.Formula = objRegex.Replace(c.Formula, replace_with)
      Next
    End If
  Next

  'Application.EnableEvents = True
  'Application.ScreenUpdating = True
  'Application.DisplayStatusBar = True
  'Application.Calculation = xlCalculationAutomatic
End Sub

如果代码按预期运行,请删除 Application 调用之前的撇号,以使代码运行得更快。

【讨论】:

  • 现在好点了吗? @TedBarberJr
  • 感谢您的帮助 eirikdaude。此代码正在更改各种位置工作表上的公式,这是理想的。它还更改了 DATA 工作表上的数据,但我重新输入了该数据。我非常感谢您在这方面的帮助。此外,我将查找一些信息以更好地了解此代码的每一行的作用。再次感谢您!
  • 是的!我真的需要学习VB。你为我节省了几个小时的工作时间。再次感谢你。我非常感谢您的帮助。
  • 如果这回答了您的问题,如果您将其标记为这样,我将不胜感激。答案顶部旁边应该有一个复选标记。 @TedBarberJr
【解决方案2】:

你总是可以使用类似的东西:

If IsEmpty(Worksheets("DATA").Cells(2, 4)) And _
   IsError(Worksheets("DATA").Cells(2, 5).Value / Worksheets("DATA").Cells(2, 4).Value) Then
   ActiveCell = "NA"
Else
   ActiveCell = Worksheets("DATA").Cells(2, 5).Value / Worksheets("DATA").Cells(2, 4).Value
End If

你翻译成 VBA 代码的公式是什么。

但是,您必须根据输入数据中的内容添加错误处理程序和其他内容。

【讨论】:

  • 再次,如果我的原始帖子不清楚,请原谅我。我是否清楚地描述了我正在尝试做的事情?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 2017-04-16
  • 1970-01-01
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多