Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否存在VBA命令,该命令不会更改单元格的公式,但会更改其值?_Vba_Excel - Fatal编程技术网

是否存在VBA命令,该命令不会更改单元格的公式,但会更改其值?

是否存在VBA命令,该命令不会更改单元格的公式,但会更改其值?,vba,excel,Vba,Excel,假设在工作表中,R4单元格的公式为=B1+B2,其当前值为10 VBA命令范围(“R4”)。值=5将其公式和其值更改为5 是否有人知道是否存在VBA命令,该命令将R4的值更改为5,但不更改其公式,因此其公式仍然是=B1+B2 PS:我们也可以通过另一种方式实现相同的状态:1)做一个范围(“R4”)。值=52)将R4的公式更改为=B1+B2,但不进行计算。在这种情况下,是否存在一个VBA命令,该命令可以更改单元格的公式而不进行计算 编辑:我想做的是 我想写一个函数,它接受一个工作表,其中一些单元格

假设在工作表中,
R4
单元格的公式为
=B1+B2
,其当前值为
10

VBA命令
范围(“R4”)。值=5
其公式其值更改为
5

是否有人知道是否存在VBA命令,该命令将
R4
的值更改为
5
,但不更改其公式,因此其公式仍然是
=B1+B2

PS:我们也可以通过另一种方式实现相同的状态:1)做一个
范围(“R4”)。值=5
2)将
R4
的公式更改为
=B1+B2
,但不进行计算。在这种情况下,是否存在一个VBA命令,该命令可以更改单元格的公式而不进行计算

编辑:我想做的是

我想写一个函数,它接受一个工作表,其中一些单元格可能过期(公式与其值不匹配),并自动生成一个VBA Sub,这个VBA Sub可以复制这个工作表。VBA Sub可能看起来像:

Sub Initiate()
    Cells(2,3).Value = 5
    Cells(4,5).Value = 10
    ...
    Cells(2,3).Formula = "=2+3"
    Cells(4,5).Formula = "=C2+C2"
    ...
End Sub
这样,运行
Initiate()
将构建一个具有相同值和公式的工作表


如果没有VBA命令,我将很难生成此
Initiate()

您无法将单元格的值更改为与单元格公式计算结果不同的值

关于您的p.s.:您可以通过将计算模式更改为手动,在不重新计算的情况下更改单元格的公式。但这当然适用于整个工作簿,而不仅仅是这一个单元格


编辑:也许可以将单元格的公式临时保存在该单元格的标记或隐藏的工作表中?

更改公式的结果而不更改公式本身非常简单:

更改其参数的值。这是一种求解器类型的方法:

Sub ForceDesiredResult()
    Dim r As Range
    Set r = Range("B2")
    With r
        If r.HasFormula Then
            .Formula = .Formula & "-5"
        Else
            .Value = .Value - 5
        End If
    End With
End Sub

下面是一些非常脏的代码,它将活动工作表上所有公式的所有值保存为工作表的自定义属性,第二个子代码将标记值已从原始值更改的所有单元格,同时保留所有公式。它需要一些错误检查例程(属性已经存在,属性不存在,…),但应该给您一些可以使用的东西。因为我不太明白你的问题,所以有点难说;)

Sub-AddCustomProperty()
将我的工作表设置为工作表
暗淡的菌丝体2 As范围
将myProperty设置为CustomProperty
设置mysheet=ActiveWorkbook.ActiveSheet
对于mysheet.UsedRange.Cells中的每个对象单元格
Debug.Print objcell.Address
如果是objcell.HasFormula,则设置myProperty=mysheet.CustomProperties.Add(objcell.Address,objcell.Value)
下一个objcell
端接头
子比较表()
将我的工作表设置为工作表
暗淡的菌丝体2 As范围
将myProperty设置为CustomProperty
设置mysheet=ActiveWorkbook.ActiveSheet
对于mysheet.UsedRange.Cells中的每个对象单元格
Debug.Print objcell.Address
如果objcell.HasFormula
出错时继续下一步
如果mysheet.CustomProperties(objcell.Address).Value-objcell.Value
objcell.Font.ColorIndex=3
错误转到0
如果结束
如果结束
下一个objcell
端接头

为什么要这样做?原因很复杂。。。我承认我在问一些有关联的问题…@SoftTimur:但你的解决方案毫无意义,除非你卷入了某种金融欺诈。告诉我们你真正的业务问题,而不是X-Y问题。“你陷入了某种财务欺诈”==>lol,肯定没有。我已经更新了我的OP…嗯。。。你确定你明白我的计划吗?
Sub AddCustomProperty()
Dim mysheet As Worksheet
Dim mycell2 As Range
Dim myProperty As CustomProperty
Set mysheet = ActiveWorkbook.ActiveSheet

For Each objcell In mysheet.UsedRange.Cells
    Debug.Print objcell.Address
    If objcell.HasFormula Then Set myProperty = mysheet.CustomProperties.Add(objcell.Address, objcell.Value)
Next objcell
End Sub
Sub CompareTags()
Dim mysheet As Worksheet
Dim mycell2 As Range
Dim myProperty As CustomProperty
Set mysheet = ActiveWorkbook.ActiveSheet

For Each objcell In mysheet.UsedRange.Cells

Debug.Print objcell.Address
    If objcell.HasFormula Then
        On Error Resume Next
        If mysheet.CustomProperties(objcell.Address).Value <> objcell.Value Then
        objcell.Font.ColorIndex = 3
        On Error GoTo 0
        End If
    End If
Next objcell
End Sub