You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GOTO语句标签无法使用变量的替代方案与分段执行表达式求助

问题描述

我有1到10号相互依赖的数学表达式,需要根据不同条件从指定位置开始计算:比如Case 0时执行1到10号表达式,Case 4时执行4到10号,以此类推。我尝试用下面的代码实现,但因为GOTO语句的标签不能是变量的限制失败了,求可行的解决方案。

尝试的代码

Private Sub XYZ(sender As Object, e As EventArgs) Handles SOME handle
    Dim ABCD As Integer = 0

    Select Case ABCD
        Case 0
            CallLineCalculations(1, "G0")
        Case 4
            CallLineCalculations(1, "G4")
        Case 5
            CallLineCalculations(1, "G5")
    End Select

End Sub


Private Sub CallLineCalculations(ByVal nRow As Integer, ByVal gotoLable As String)

    GoTo gotolable

G0:
    DGVItemDetail(8, nRow).Value = Val(DGVItemDetail(6, nRow).Value) * Val(DGVItemDetail(7, nRow).Value) / 100
    DGVItemDetail(9, nRow).Value = Val(DGVItemDetail(6, nRow).Value) - DGVItemDetail(8, nRow).Value
G4:
    DGVItemDetail(10, nRow).Value = DGVItemDetail(4, nRow).Value * DGVItemDetail(9, nRow).Value
G5:
    DGVItemDetail(12, nRow).Value = DGVItemDetail(10, nRow).Value * DGVItemDetail(11, nRow).Value / 100
    DGVItemDetail(13, nRow).Value = DGVItemDetail(10, nRow).Value + DGVItemDetail(12, nRow).Value
    ' ... 剩余表达式省略
End Sub
解决方案

方案1:用Select Case替代GOTO

把每个代码块的执行逻辑用条件判断控制,根据传入的起始标记决定是否执行前置块,再依次执行后续计算:

Private Sub CallLineCalculations(ByVal nRow As Integer, ByVal startFrom As String)
    ' 执行G0对应的计算(仅当起始标记为G0时)
    If startFrom = "G0" Then
        DGVItemDetail(8, nRow).Value = Val(DGVItemDetail(6, nRow).Value) * Val(DGVItemDetail(7, nRow).Value) / 100
        DGVItemDetail(9, nRow).Value = Val(DGVItemDetail(6, nRow).Value) - DGVItemDetail(8, nRow).Value
    End If

    ' 执行G4对应的计算(起始为G0或G4时都需要执行)
    If startFrom = "G0" Or startFrom = "G4" Then
        DGVItemDetail(10, nRow).Value = DGVItemDetail(4, nRow).Value * DGVItemDetail(9, nRow).Value
    End If

    ' 执行G5及后续的计算(所有起始标记都需要执行)
    DGVItemDetail(12, nRow).Value = DGVItemDetail(10, nRow).Value * DGVItemDetail(11, nRow).Value / 100
    DGVItemDetail(13, nRow).Value = DGVItemDetail(10, nRow).Value + DGVItemDetail(12, nRow).Value
    ' ... 剩余表达式依次按此逻辑补充
End Sub

方案2:拆分计算步骤为独立方法

把每个阶段的计算拆成独立Sub,通过Case判断调用对应的方法链,逻辑更清晰易维护:

' 对应原G0块(1-2号表达式)
Private Sub CalcStep1To2(ByVal nRow As Integer)
    DGVItemDetail(8, nRow).Value = Val(DGVItemDetail(6, nRow).Value) * Val(DGVItemDetail(7, nRow).Value) / 100
    DGVItemDetail(9, nRow).Value = Val(DGVItemDetail(6, nRow).Value) - DGVItemDetail(8, nRow).Value
End Sub

' 对应原G4块(4号表达式)
Private Sub CalcStep4(ByVal nRow As Integer)
    DGVItemDetail(10, nRow).Value = DGVItemDetail(4, nRow).Value * DGVItemDetail(9, nRow).Value
End Sub

' 对应原G5块(5-10号表达式)
Private Sub CalcStep5To10(ByVal nRow As Integer)
    DGVItemDetail(12, nRow).Value = DGVItemDetail(10, nRow).Value * DGVItemDetail(11, nRow).Value / 100
    DGVItemDetail(13, nRow).Value = DGVItemDetail(10, nRow).Value + DGVItemDetail(12, nRow).Value
    ' ... 剩余步骤补充
End Sub

Private Sub CallLineCalculations(ByVal nRow As Integer, ByVal startCase As Integer)
    Select Case startCase
        Case 0
            CalcStep1To2(nRow)
            CalcStep4(nRow)
            CalcStep5To10(nRow)
        Case 4
            CalcStep4(nRow)
            CalcStep5To10(nRow)
        Case 5
            CalcStep5To10(nRow)
        ' 其他Case补充对应逻辑
    End Select
End Sub

' 调用时直接传入Case编号,无需传递标签字符串
Private Sub XYZ(sender As Object, e As EventArgs) Handles SOME handle
    Dim ABCD As Integer = 0
    CallLineCalculations(1, ABCD)
End Sub

方案3:用布尔变量控制执行流程

用一个标记变量判断是否到达起始位置,一旦到达就执行后续所有计算:

Private Sub CallLineCalculations(ByVal nRow As Integer, ByVal startLabel As String)
    Dim shouldExecute As Boolean = False

    ' 检查是否从G0开始
    If startLabel = "G0" Then
        shouldExecute = True
    End If
    If shouldExecute Then
        DGVItemDetail(8, nRow).Value = Val(DGVItemDetail(6, nRow).Value) * Val(DGVItemDetail(7, nRow).Value) / 100
        DGVItemDetail(9, nRow).Value = Val(DGVItemDetail(6, nRow).Value) - DGVItemDetail(8, nRow).Value
    End If

    ' 检查是否到达G4起始点
    If startLabel = "G4" Or shouldExecute Then
        shouldExecute = True
    End If
    If shouldExecute Then
        DGVItemDetail(10, nRow).Value = DGVItemDetail(4, nRow).Value * DGVItemDetail(9, nRow).Value
    End If

    ' 检查是否到达G5起始点
    If startLabel = "G5" Or shouldExecute Then
        shouldExecute = True
    End If
    If shouldExecute Then
        DGVItemDetail(12, nRow).Value = DGVItemDetail(10, nRow).Value * DGVItemDetail(11, nRow).Value / 100
        DGVItemDetail(13, nRow).Value = DGVItemDetail(10, nRow).Value + DGVItemDetail(12, nRow).Value
    End If
    ' ... 剩余步骤按此逻辑补充
End Sub

内容的提问来源于stack exchange,提问作者Kirti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:36:23