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