Excel 如何将两个过程的输出合并为不同过程的一个输出?

Excel 如何将两个过程的输出合并为不同过程的一个输出?,excel,vba,Excel,Vba,我有两个名为validateChar和EndingSpace的过程。我对这两个过程的输出都是在MsgBox中显示的值 我想将两个消息框的值合并为一个值,显示在MsgBox中。我创建了一个新的过程tempValidate来处理MsgBox中的所有过程 有没有一种方法可以让我不仅可以组合2个MsgBox,还可以组合多个消息框 在下面的代码中,msg1和msgSpaces是两个过程(validateChar和EndingSpace)中的变量 在子过程中声明并为其赋值的变量不能被其他子过程引用 Opti

我有两个名为validateChar和EndingSpace的过程。我对这两个过程的输出都是在MsgBox中显示的值

我想将两个消息框的值合并为一个值,显示在MsgBox中。我创建了一个新的过程tempValidate来处理MsgBox中的所有过程

有没有一种方法可以让我不仅可以组合2个MsgBox,还可以组合多个消息框

在下面的代码中,msg1和msgSpaces是两个过程(validateChar和EndingSpace)中的变量


在子过程中声明并为其赋值的变量不能被其他子过程引用

Option Explicit

Public Sub tempValidate()

    Dim msg As String

    msg = ActiveSheet.Name & vbLf

    validateChar msg
    endingSpaces msg

    MsgBox msg, Title:="Call-outs"

End Sub

Sub validateChar(ByRef msg1 As String)

    'don't try to redeclare msg1 here
    'if you have Dim msg1 as string then get rid of it

    msg1 = msg1 & "The stuff from validateChar." & vbLf

End Sub

Sub endingSpaces(ByRef msgSpaces As String)

    'don't try to redeclare msgSpaces here
    'if you have Dim msgSpaces as string then get rid of it

    msgSpaces = msgSpaces & "The stuff from endingSpaces." & vbLf

End Sub
您需要可以在多个子过程中共享的公共变量,或者需要将一个var byRef从主子过程传递到伴随子过程

在下面的示例中,在主tempValidate子过程中声明了一个msg字符串类型var,并给出了活动工作表名称的初始值。var被传递给validateChar和EndingSpace,每个伴随子元素都会在同一个字符串中附加附加附加信息。退出过程之前,最终结果将显示在tempValidate的msgbox中

Option Explicit

Public Sub tempValidate()

    Dim msg As String

    msg = ActiveSheet.Name & vbLf

    validateChar msg
    endingSpaces msg

    MsgBox msg, Title:="Call-outs"

End Sub

Sub validateChar(ByRef msg1 As String)

    'don't try to redeclare msg1 here
    'if you have Dim msg1 as string then get rid of it

    msg1 = msg1 & "The stuff from validateChar." & vbLf

End Sub

Sub endingSpaces(ByRef msgSpaces As String)

    'don't try to redeclare msgSpaces here
    'if you have Dim msgSpaces as string then get rid of it

    msgSpaces = msgSpaces & "The stuff from endingSpaces." & vbLf

End Sub


另一种选择是生成那些返回字符串的伴随subs函数。也许另一个贡献者可以介绍这个场景。

下面是一个示例,说明如何使用公共变量(这里称为message)来完成您想要的操作。一般来说,公共变量是不受欢迎的,但它们有一些用途。在这种情况下,它将允许您的其余代码几乎不受影响(只需将任意一行
Msgbox s
替换为
logmessages
):


当然,您可以用其他一些分隔符来替换
vbCrLf
,“”

我不知道您所说的“合并消息框”是什么意思。当然,您可以组合字符串并首先运行几个sub/函数,将必要的数据收集到单个字符串中,完成后显示。另外:消息框实际上不是“输出”——它是运行subs的副作用。如果要结合实际输出,请重构代码,使其具有一个全局字符串变量,可以跟踪不断增长的消息(这不是最好的主意),或者具有一些输出生成函数,而不是SUB(更好的主意),稍后SUB/函数可以使用它。@John Coleman,在我提到的2个过程中,输出是消息框。现在我想把它放到新程序下的一条消息中。如何创建全局变量以及如何使用它?但是消息框根本不会输出,因为它不是返回值。对用户的反馈与某些代码的输出不同。SUB没有输出。实际上,该脚本只用于验证单元格上的值。仅用于检查,我希望输出为msgbox,以列出或显示所有不正确的值。我知道您需要一个消息框,但我的意见是,消息框中的消息是供用户查看的,而不是供VBA使用的。再次感谢。。这是我的预期输出,但是有没有一种方法可以为“thestuff from endingSpaces.”声明一个变量,并且validateCarthe var的内容从最初声明的tempValidate传递到每个validateChar和endingSpaces子组件。这是一个很好的解决方案(看起来有点像C)。我认为默认值是
ByRef
。在这种情况下需要它吗?@JohnColeman,是的,这是默认值,但由于这是op的第一次学习经验,我想在冗长的方面出错。@Jeeped,我出错了。“检测到不明确的名称:validateChar。”
Public message As String

Sub LogMessage(s As String)
    message = message & IIf(Len(message) > 0, vbCrLf, "") & s
End Sub

Sub test1()
    LogMessage "Hello"
End Sub

Sub test2()
    LogMessage "World"
End Sub

Sub main()
    message = ""
    test1
    test2
    MsgBox message 'prints "Hello World" on two lines
End Sub