使用代码修改Excel公式

时间:2015-03-25 23:28:44

标签: excel vba excel-vba

我有一个包含22个工作表的Excel 2010工作簿。第一个工作表标记为DATA,其中数据由用户输入。 A1-N1行包含标签。 A2-A18行包含从单元格A2开始的17个位置的2015年1月数据,即第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(数据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,这将需要编码以进行适当的更改。

DATA工作表图片

1R位置工作表图片

2 个答案:

答案 0 :(得分:0)

您可以随时使用:

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代码的公式。

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

答案 1 :(得分:0)

我不在我的工作电脑上,所以我没有机会测试这些代码,但我相信这应该做你想要的。如果有任何问题,请告诉我,我明天会在工作中看一下。

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 - 调用之前删除撇号,以使代码运行得更快。