在VB.net中替代GoSub

时间:2018-11-16 02:53:25

标签: vba vb.net vb6-migration

我被分配了一个项目,以替换基于GoSubs的应用程序中的所有VBA,因为此应用程序正在切换到VB.net,并且那里不支持GoSubs 。这是原始代码的简化版本:

Sub Main ()
  Dim A As String
  ...
  If ConditionX Then A = "Black"
  Else A = "White"
  End If
  ...
  GoSub Execute
  ...
  Execute:
    Call BuiltInSub1 (A)
    Call BuiltInSub2 (A)
    'where BuiltInSubs are some predefined procedures within the application
    ...
  Return

End Sub

我正在考虑使用Call替换GoSub,如下所示:

Sub Main ()
  Dim A As String

  If ConditionX Then A = "Black"
  Else A = "White"
  End If
  ...
  Call Execute
  ...

End Sub

Sub Execute ()
   ...
   Call BuiltInSub1 (A)
   Call BuiltInSub2 (A)
   ...
End Sub

上面修改后的版本明显的错误是A中没有声明变量Sub Execute。我可以想到的一个选择是在A中重新定义Sub Execute,但是要做到这一点,我将需要重新声明Main中用于定义A的所有变量。几个。

在我的情况下,替换GoSub的最佳/最有效方法是什么?

2 个答案:

答案 0 :(得分:4)

根据我上面的评论,您的代码应如下所示:

Sub Main ()
  Dim A As String

  If ConditionX Then A = "Black"
  Else A = "White"
  End If
  ...
  Execute(A)
  ...

End Sub

Sub Execute(A As SomeType)
   ...
   BuiltInSub1(A)
   BuiltInSub2(A)
   ...
End Sub

如果确实发现需要声明参数ByRef,则可能希望将重构作为更长期的解决方案。

答案 1 :(得分:3)

我相信lamda函数可能在VB.net中具有嵌套变量范围)

Dim A
Dim B
Dim xecute = function()
    BuiltInSub1(A)
    BuiltInSub2(A)
End Sub
A = 1
B=xecute()
A=2
B=xecute()