Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 连接子节点的问题_Vba - Fatal编程技术网

Vba 连接子节点的问题

Vba 连接子节点的问题,vba,Vba,免责声明:我不是一个开发人员,只是一个试图在自己的项目中使用VBA的普通人。我第一次在stackoverflow上发帖,所以如果我违反了任何不成文的社区规则,请原谅我 大家好,我试着让一堆潜艇按顺序运行,所以下一个只有在前一个潜艇完成后才开始 问题是excel在执行过程中不断崩溃,而如果我手动运行每个子系统,它们根本就没有问题 到目前为止,我一直在使用这种方法:首先我有一个迷你子函数,它将value=1赋值给全局变量“oneclick”,然后调用链的第一个宏 然后,在每一个子段的末尾前都有一小块

免责声明:我不是一个开发人员,只是一个试图在自己的项目中使用VBA的普通人。我第一次在stackoverflow上发帖,所以如果我违反了任何不成文的社区规则,请原谅我

大家好,我试着让一堆潜艇按顺序运行,所以下一个只有在前一个潜艇完成后才开始

问题是excel在执行过程中不断崩溃,而如果我手动运行每个子系统,它们根本就没有问题

到目前为止,我一直在使用这种方法:首先我有一个迷你子函数,它将value=1赋值给全局变量“oneclick”,然后调用链的第一个宏

然后,在每一个子段的末尾前都有一小块:

sub macro1()

...macro code...

if oneclick=1 then
  call macro2
end if

end sub
依此类推,直到最后一个子模块将oneclick变量重置为零

我不知道为什么这会持续崩溃。我可以看到,实际上,直到最后一个sub的末尾,这些sub都没有真正关闭,这会不会达到任何代码限制?事实上,我会更高兴有一个单一的主潜艇来指导这个过程,而不是依赖这样的混乱!有什么建议吗

编辑: 哦,哇,已经有这么多答案了。。现在我要试试这些。回答您的一些问题:

1) 崩溃实际上是突然发生的,甚至不是错误消息,只是excel退出并重新打开,与宏链第一次启动时的状态相同


2) 我同意你们的观点,应该有一个主sub调用较小的sub,但是上次我尝试时遇到了一系列问题,因为一个宏需要处理前一个宏的结果,依此类推。如何告诉vba等待上一个子系统结束?

可能发生的情况是,
oneclick
没有使用
Dim
语句定义,因此默认情况下,它是在过程级别定义的,这意味着如果在另一个子系统中将
oneclick
设置为0,设置另一个本地/过程级变量,并且
macro1
中的变量保持不变,因此宏链永远不会停止,这会导致堆栈溢出/崩溃,如上面的一条注释所述

因此,要么将
oneclick
定义为公共变量(我建议将其定义为布尔变量,因为它基本上是一个开关….True/False),要么将变量作为参数传递到宏链中(
Sub-Macro2(ByRef oneclick as Boolean)

综上所述,正如上面的一条评论所述,您可以将所有链式sub放在主sub(
macro1
)中,因为它们只能一个接一个地执行,例如

Sub macro1()
    Dim oneclick As Boolean

    oneclick = True         'Need to get set to true to start

    If oneclick Then Call macro2(oneclick)

    If oneclick Then Call macro3(oneclick)

    ........


End Sub

Sub macro2(ByRef oneclick As Boolean)

    oneclick = False            'One of your macros has to set oneclick to false to stop the chain/execution, probably under acondition

End Sub

最好不要链接宏,而是从另一个子系统调用它们。这样,您就可以清楚地了解自己在做什么,按照什么顺序

Sub AllOfIt()
    macro1
    DoEvents

    macro2
    DoEvents

    macro3
End Sub

Sub macro1
    ...
End Sub

Sub macro2
    ...
End Sub

Sub macro3
    ...
End Sub

通常不需要担心在上一个宏结束之前是否启动了某些内容。除非您使用
应用程序之类的操作,否则不会发生这种情况。OnTime

所发生的事情是创建一个“调用堆栈”,并为每个“打开”的例程使用。可能您正在创建一个大型调用堆栈,该堆栈会使Excel内部内存(RAM)过载。也许可以尝试创建较少的个人例程,并将它们合并为一个。如果这仍然导致Excel崩溃,可能是您的代码造成的,而不是内存资源管理不足。@DeanDeVilliers或不是当前的做法,从2中调用例程3,而是从例程1中调用例程3。允许例程2关闭。是的,@Luuklag,或者你需要告诉我们“崩溃”在这里的意思。没有这一点,我们只能猜测,将整个任务分解成更小的任务是件好事。您现在可以做大多数程序员都会做的事情,创建一个“main”sub,从中一个接一个地调用当前sub。因此,您只需调用“main”即可处理其余部分。尝试了此解决方案,但excel仍然崩溃。所有单独的SUB运行时都没有出现故障,因此我认为,在将每个宏作为一个完全“隔离”的块执行时,这种结构并不是完全“中立的”。@PaoloRomano-我在上面的代码中添加了
DoEvents
。这将告诉Excel在进行下一步之前完成所有正在进行的操作。如果这没有帮助,下一件事是分离宏实际上我对这个主题做了一些研究,没有
doevents
部分,它实际上会尽可能多线程处理宏。我的两个宏实际上在同一个单元格中读/写,我想这就是崩溃的原因。我看不出其中的逻辑。我已经在项目级别定义了一个公共变量。当我在sub中指定一个值时,更改的是公共变量。同一条链适用于一组更简单的宏。您在发布问题时没有共享此信息。我很感激你这么做。。实际上,我写了“到目前为止,我一直在使用这个方法:首先我有一个迷你子,它将value=1分配给全局变量“oneclick”,然后调用链的第一个宏”。我没有把它和其他的放在一起,如果把你弄糊涂了,很抱歉。