如何构建引用另一个单元格作为公式但可以被手动输入覆盖的代码

How can I build a code that references another cell as a formula but can be overridden by manual inputs

提问人:Cealizar Serrano 提问时间:10/10/2023 最后编辑:Cealizar Serrano 更新时间:10/11/2023 访问量:57

问:

因此,我正在尝试构建代码,其中 AE 中的单元格可以通过手动输入进行覆盖,但会根据给定条件引用不同的范围。我已经在几个小时了,但我似乎想不通。任何帮助都是值得赞赏的。

我得到的错误是: 公式对象失败的方法范围

突出显示此代码行

** .范围(“AE”和 i)。公式 = BMformula & i **

Public Sub BedoverrideND(Bathmat As Worksheet, DSMaster As Worksheet, DSMformula As String, BMformula As String)
Dim i As Long

For i = 7 To getcostcoderange
    Select Case i
    Case 21, 22, 23, 24, 25
'        Do nothing
    Case Else
        If Bathmat.Range("B" & i).Value = 0 Or Bathmat.Range("B" & i).Value = "" Or _
            Not WorksheetFunction.IsFormula(Bathmat.Range("AE" & i)) _
            And Not IsEmpty(Bathmat.Range("AE" & i)) Then
        Else

            With Bathmat

                If Not WorksheetFunction.IsFormula(.Range("E" & i)) And Not IsEmpty(.Range("E" & i)) Then
                    .Range("AE" & i).Formula = BMformula & i
                ElseIf DSMaster.Range("T" & i).Value + DSMaster.Range("U" & i).Value <> 0 Then
                    .Range("AE" & i).Formula = DSMformula & i
                Else
                    .Range("AE" & i).Formula = BMformula & i
                End If
            End With
        End If
    End Select
Next i
End Sub

这些是触发潜艇的代码:

Public Sub BedOverrideSun()
    BedoverrideND shBathMatSun, shDSMasterSun, "='DS Master Sun'!V", "='Bath Mat Sun'!E"
End Sub



Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect(Target, Range("E:E, AE:AE, BE:BE")) Is Nothing Then
 Call BedOverrideSun

我尝试了一下,并设法找到了我正在寻找的解决方案:

    With Bathmat

        If Not WorksheetFunction.IsFormula(.Range("E" & i)) And Not IsEmpty(.Range("E" & i)) Or _
            DSMaster.Range("T" & i).Value + DSMaster.Range("U" & i).Value = 0 Then
                If .Range("AE" & i).Formula <> BMFormula & i Then
                    .Range("AE" & i).Formula = BMFormula & i
                End If
        ElseIf DSMaster.Range("T" & i).Value + DSMaster.Range("U" & i).Value <> 0 Then
            If .Range("AE" & i).Formula <> DSMaster & i Then
                .Range("AE" & i).Formula = DSMaster & i
            End If
        End If
    End With
Excel VBA 工作表

评论

1赞 vbakim 10/10/2023
发生错误时,我会检查 i 和 getcostcoderange 的值。
0赞 taller 10/10/2023
您是否将工作表对象分配给 ?shBathMatSun
0赞 Notus_Panda 10/10/2023
我认为这也可能是一个问题,但那时错误不会首先发生吗@taller_ExcelHome?Bathmat.Range("B" & i).Value
0赞 Cealizar Serrano 10/11/2023
@vbakim我已经检查了它们并且值是正确的,但是,错误似乎发生在循环中的第一个目标上。我尝试将代码修改为单个单元格以排除循环中的问题,但错误仍然发生在同一行代码中。
0赞 Cealizar Serrano 10/11/2023
@taller_ExcelHome,我对VBA还很陌生。您的意思是在工作表shBathMatSun本身中使用Dim和set吗?我没有,但我刚才尝试过,但错误仍然发生。澄清一下,这是你的意思吗? 将浴垫调暗为工作表 将 DSMaster 调暗为工作表 设置浴垫 = shBathMatSun 设置 DSMaster = shDSMasterSun

答:

0赞 Cealizar Serrano 10/11/2023 #1

将代码的 with 部分更改为 this,它按预期工作。

 With Bathmat

        If Not WorksheetFunction.IsFormula(.Range("E" & i)) And Not IsEmpty(.Range("E" & i)) Or _
            DSMaster.Range("T" & i).Value + DSMaster.Range("U" & i).Value = 0 Then
                If .Range("AE" & i).Formula <> BMFormula & i Then
                    .Range("AE" & i).Formula = BMFormula & i
                End If
        ElseIf DSMaster.Range("T" & i).Value + DSMaster.Range("U" & i).Value <> 0 Then
            If .Range("AE" & i).Formula <> DSMFormula & i Then
                .Range("AE" & i).Formula = DSMFormula & i
            End If
        End If
    End With