如何自动计算/解析公式中的命名单元格?

如何自动计算/解析公式中的命名单元格?

我有A1 = 5我还补充道A1作为名称“主角“。

如果我这样做,=Protagonist就会出现5

在 D12 中说我想做=Protagonist+1它会出现6

  • 我想要实现的是替换“主角“与5 并拥有D12公式保持不变=5+1

我需要这样做A1不断改变其值,我只需要在制作使用它的公式时保留它的值。

(我知道我可以选择主角并击中F9只解决公式的那部分,但这会占用我大量的时间)

这种情况可能发生在输入并解析公式之后。虽然如果它可以在输入时在公式栏中发生那就太神奇了,但我猜 vba 不会延伸到那么远。

答案1

如果需要用计算值替换它,那么:

Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Count = 1 Then
    If Left(Target.Formula, 1) = "=" And IsNumeric(Intersect(Range("B1:F1000"), Target)) Then
      Dim a As Variant
      For Each a In Array("protagonist", "anotherNameToChange")
        While InStr(1, Target.Formula, a, 1)
          Target.Formula = Replace(Target.Formula, a, Evaluate(ThisWorkbook.Names(a).Value), , , 1)
        Wend
      Next
    End If
  End If
End Sub

将根据需要自动对数组中的所有名称执行此操作......

如果需要对每个名称都执行此操作,请更改以下两行:

For Each a In Array("protagonist", "anotherNameToChange")

更改为:

For Each a In ThisWorkbook.Names

Target.Formula = Replace(Target.Formula, a, Evaluate(ThisWorkbook.Names(a).Value), , , 1)

Target.Formula = Replace(Target.Formula, a, Evaluate(a.Value), , , 1)

请注意,这不区分大小写:)

答案2

尝试一下:

Sub qwerty()
   Dim N As Name, FixString As String

   Set N = ActiveWorkbook.Names("Protagonist")
   FixString = N.RefersToRange

   For Each cell In Cells.SpecialCells(xlCellTypeFormulas)
      cell.Formula = Replace(cell.Formula, "Protagonist", FixString)
   Next cell
End Sub

编辑#1:

要从qwerty事件宏,使用类似:

Private Sub Worksheet_Change(ByVal Target As Range)
   If Intersect(Target, Range("A1:C100")) Is nothen Then
   Else
      Application.EnableEvents = False
         Call qwerty
      Application.EnableEvents = True
   End If
End Sub

答案3

据我理解你的问题,这是不可能的。

我认为答案(如果存在的话)就是了解你想要这种行为背后的原因(业务逻辑),然后重新格式化工作簿以适应。

相关内容