保持两个单元格与vba之间的固定比率

保持两个单元格与vba之间的固定比率,vba,excel,Vba,Excel,目前我正在制作一个模型,其中我需要两个单元格来保持固定的比率,这样当两个单元格的和总是等于一时。在这种情况下,单元格为F13和F14。举个例子,如果F13的值变为0.4,则F14应变为0.6。同样,如果F14的值变为0.2,则F13应变为0.8。我得到的代码是: Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Target.Worksheet.Range("F13")) Is Not

目前我正在制作一个模型,其中我需要两个单元格来保持固定的比率,这样当两个单元格的和总是等于一时。在这种情况下,单元格为F13和F14。举个例子,如果F13的值变为0.4,则F14应变为0.6。同样,如果F14的值变为0.2,则F13应变为0.8。我得到的代码是:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Target.Worksheet.Range("F13")) Is Nothing Then
        If ActiveCell.Value > 1 Then
            MsgBox "input value is larger than 1"
        Else
            Range("F14").Value = 1 - ActiveCell.Value
            Exit Sub
        End If
        Exit Sub
    End If
    Exit Sub

    If Not Intersect(Target, Target.Worksheet.Range("F14")) Is Nothing Then
        If ActiveCell.Value > 1 Then
            MsgBox "input value is larger than 1"
        Else
            Range("F13").Value = 1 - ActiveCell.Value
            Exit Sub
        End If
        Exit Sub
    End If
    Exit Sub

End Sub

但是,此代码无法正常工作。因此,我的问题是,我应该如何更改代码以使其正常工作?

也许这对您有用:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim v As Variant
    If Target.Address = "$F$13" Then
        v = Target.Value
        If Not IsNumeric(v) Then
            Range("F13").Value = CVErr(xlErrValue)
        ElseIf v < 0 Or v > 1 Then
            Range("F13").Value = CVErr(xlErrValue)
        Else
            Range("F14").Value = 1 - v
        End If
    ElseIf Target.Address = "$F$14" Then
        v = Target.Value
        If Not IsNumeric(v) Then
            Range("F14").Value = CVErr(xlErrValue)
        ElseIf v < 0 Or v > 1 Then
            Range("F14").Value = CVErr(xlErrValue)
        Else
            Range("F13").Value = 1 - v
        End If
    End If
End Sub
Private子工作表\u更改(ByVal目标作为范围)
Dim v作为变体
如果Target.Address=“$F$13”,则
v=目标值
如果不是数字(v),则
范围(“F13”)。值=CVErr(XLERR值)
如果v<0或v>1,则
范围(“F13”)。值=CVErr(XLERR值)
其他的
范围(“F14”)。值=1-v
如果结束
ElseIf Target.Address=“$F$14”则
v=目标值
如果不是数字(v),则
范围(“F14”)。值=CVErr(XLERR值)
如果v<0或v>1,则
范围(“F14”)。值=CVErr(XLERR值)
其他的
范围(“F13”)。值=1-v
如果结束
如果结束
端接头

如果将F13更改为介于0和1之间的值,则F14将自动更改为互补值,反之亦然。如果将0和1之间的数字以外的任何值放入其中一个单元格,则该单元格中的值将变为错误。只有将值直接放入其中一个单元格(而不是包含这些单元格的较大范围)时,事件处理程序才起作用,但您使用
ActiveCell
似乎是出于此目的。

也许这对您有效:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim v As Variant
    If Target.Address = "$F$13" Then
        v = Target.Value
        If Not IsNumeric(v) Then
            Range("F13").Value = CVErr(xlErrValue)
        ElseIf v < 0 Or v > 1 Then
            Range("F13").Value = CVErr(xlErrValue)
        Else
            Range("F14").Value = 1 - v
        End If
    ElseIf Target.Address = "$F$14" Then
        v = Target.Value
        If Not IsNumeric(v) Then
            Range("F14").Value = CVErr(xlErrValue)
        ElseIf v < 0 Or v > 1 Then
            Range("F14").Value = CVErr(xlErrValue)
        Else
            Range("F13").Value = 1 - v
        End If
    End If
End Sub
Private子工作表\u更改(ByVal目标作为范围)
Dim v作为变体
如果Target.Address=“$F$13”,则
v=目标值
如果不是数字(v),则
范围(“F13”)。值=CVErr(XLERR值)
如果v<0或v>1,则
范围(“F13”)。值=CVErr(XLERR值)
其他的
范围(“F14”)。值=1-v
如果结束
ElseIf Target.Address=“$F$14”则
v=目标值
如果不是数字(v),则
范围(“F14”)。值=CVErr(XLERR值)
如果v<0或v>1,则
范围(“F14”)。值=CVErr(XLERR值)
其他的
范围(“F13”)。值=1-v
如果结束
如果结束
端接头

如果将F13更改为介于0和1之间的值,则F14将自动更改为互补值,反之亦然。如果将0和1之间的数字以外的任何值放入其中一个单元格,则该单元格中的值将变为错误。事件处理程序仅在值直接放入其中任何一个单元格(而不是包含这些单元格的更大范围)时才起作用,但您使用
ActiveCell
似乎是出于此目的。

“此代码工作不正常”-这句话是什么意思?代码有错误吗?它产生的价值是否与您预期的不同?你做的测试是什么[给出变量值的具体示例],产生了什么值,你期望得到什么值?还有-为什么你有这么多“exit sub”语句?我不知道它们的总体用途是什么,因为您似乎可以使用分支If/ElseIf逻辑路径干净地完成整个sub,而根本不需要任何Exit sub语句。请特别注意,永远不会有代码实际到达“…F14=Nothing”If语句的时间,因为代码总是在该行之前立即退出子语句。因此,您希望这样,更改F13或F14中的一个会自动更改另一个?此外,这似乎不是两个单元格的比率,而是它们之间的差异。“这段代码工作不正常”-这句话是什么意思?代码有错误吗?它产生的价值是否与您预期的不同?你做的测试是什么[给出变量值的具体示例],产生了什么值,你期望得到什么值?还有-为什么你有这么多“exit sub”语句?我不知道它们的总体用途是什么,因为您似乎可以使用分支If/ElseIf逻辑路径干净地完成整个sub,而根本不需要任何Exit sub语句。请特别注意,永远不会有代码实际到达“…F14=Nothing”If语句的时间,因为代码总是在该行之前立即退出子语句。因此,您希望这样,更改F13或F14中的一个会自动更改另一个?而且,与其说是两个细胞的比率,不如说是它们之间的差异。非常感谢你的帮助!代码正常工作。再次感谢!非常感谢你的帮助!代码正常工作。再次感谢!