首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >通过长期运行的过程(DoEvents或其他方式)一致地接收用户输入

通过长期运行的过程(DoEvents或其他方式)一致地接收用户输入
EN

Stack Overflow用户
提问于 2019-11-24 20:48:29
回答 1查看 55关注 0票数 0

干净利落地取消一个冗长的API过程是很糟糕的,我正试图找到最佳的方法来导航这个坏消息。

我使用的是excel 2016 (手工计算,没有屏幕更新)--我可能会花一些时间尝试在2010年运行这个过程,看看在接下来的几天里是否有任何问题解决(我知道减速了)。

随着时间的推移,我的过程LongProcedure已经失去了成功使用其取消功能的能力(大概是由于复杂性的增加)。它最初是不一致的,需要大量的垃圾邮件点击才能取消,现在它完全失败了。

下面是设置:

首先,LongProcedure位于一个类模块LongClass中,它的公共属性被检查为早期取消,允许它清理。

代码语言:javascript
运行
AI代码解释
复制
Public Sub LongProcedure()
    ' [Set up some things] '
    For Each ' [Item In Some Large Collection (Est. 300 Items)] '
        ' [Some Code (ETA 5 Seconds) Sprinkled with 3-4 DoEvents] '
        ' [Export workbook (ETA 10 Seconds)] '
        If (cancelLongProcedure) Then Exit For
    Next
    ' [Clean up some things] '
    GeneratorForm.Reset ' Let the UserForm know we're finished
End Sub

其次,我从宏中显示了一个UserForm,该宏实例化过程类并运行过程。它包含一个“运行”按钮、一个状态标签和一个“取消”按钮。

代码语言:javascript
运行
AI代码解释
复制
Private MyLong As LongClass

Public Sub ButtonRunLongProcedure_Click()
    Set myLong = New LongClass
    myLong.LongProcedure()
End Sub

因此,总体上这个问题是双重的。

ExportAsFixedFormat调用打开一个“发布.”进度条,冻结excel大约10秒-很好。在我所有的努力中,我还没有找到一种处理用户输入的方法。

最重要的是,DoEvents调用似乎不再做任何允许单击cancel按钮的操作。此过程不一致地冻结excel、选项卡到其他打开的程序中,并且(在不冻结时)更新状态标签。

我试过的

在button)

  • Using方法中添加doevents而不是喷洒--虽然表单仍然经常结冰,但它还是一致地更新状态标签(同时仍然不允许取消DoEvents winAPI Sleep来代替DoEvents,并且除了延迟为1、5、10、50和250 in的DoEvents之外,表单完全停止了更新而没有执行事件,而且两者都冻结了更多。

  • 使用Do While循环不断地运行DoEvents,以便第二次运行DoEvents来取消表单。这个很有帮助。由于某些原因,close x按钮可以比userform按钮更一致地单击--仍然不像我想的那样一致。问题出在哪里?在发布期间,Excel将停止响应,因此,如果您单击“关闭”按钮两次,现代窗口将结束此过程。如果没有cleanup.

  • Using,Application.OnTime就会定期调用DoEvents。似乎并没有改善整个

  • Alt-Tabbing.的情况不,真的。由于某些原因,虽然alt选项卡偶尔只会使UserForm冻结更困难,但有时它会使其停止冻结并更新。

这是我愿意做的一个重要的重构工作,包括将长过程的想法分解成单独的方法,最初执行设置,以及在类终止时进行清理。我在寻找能提供一致结果的东西。-我将接受从excel版本到excel设置再到winAPI调用的任何东西。

谢谢你对这个问题的洞察力。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-28 14:51:14

事实证明,简单地将一些有用的改进和一个新的改进结合在一起,就会产生很大的不同。

  • QueryClose取决于个人喜好。为了捕捉更多的终止,不要使用它,以确保用户使用新的解决方案
  • 坚持在您认为符合逻辑的地方喷洒doEvents (而不仅仅是当状态栏更新时-比如在Application.Calculate调用之前和之后)
  • 尽可能地优化长期运行的过程,避免excel调用

而且,最重要的是

  • 集成取消键功能(默认情况下是CTRL+Break)比UserForm按钮和窗体关闭按钮反应更快,不会意外地结束excel任务。

,这是对成品进行抛光的过程

首先,设置一个debugMode或逆handleErrors模块级变量,以控制是否实现中断到取消和错误处理。(错误处理将使您的代码更难调试,因此您将欣赏此开关)

如果您的进程正在处理错误,则将Application.EnableCancelKey设置为xlErrorHandlerOn Error GoTo [ErrorHandlingLabel]。错误处理标签应该在清理之前直接设置,并立即将EnableCancelKey设置为xlDisabled以避免错误。在继续执行清理步骤之前,您的处理程序应该检查存储的Err.Number并采取相应的措施。

确保如果您遵从脚本中的任何其他复杂的vba (例如在带UDF的工作表上使用Application.Calculate ),则先设置On Error GoTo 0,然后设置On Error GoTo [ErrorHandlingLabel],以避免捕获单元格绑定错误。

不幸的是,要使UX始终可读,就必须在xlDisabled上保留cancel键,直到表单关闭。

和代码:

代码语言:javascript
运行
AI代码解释
复制
Public Sub LongProcedure()
    If handleErrors Then
        On Error GoTo ErrorHandler
        Application.EnableCancelKey = xlErrorHandler
    End If
    ' [Set up some things] '
    For Each ' [Item In Some Large Collection (Est. 300 Items)] '
        ' [Some Code (ETA 5 Seconds) Sprinkled with 3-4 DoEvents] '
        ' [Export workbook (ETA 10 Seconds)] '
    Next
ErrorHandler:
    If handleErrors Then
        Application.EnableCancelKey = xlDisabled
        If (Err.Number <> 0 And Err.Number <> 18) Then
            MsgBox Err.Description, vbOKOnly, "Error " & CStr(Err.Number)
        End If
        Err.Clear
        On Error GoTo 0
    End If
    ' [Clean up some things] '
    GeneratorForm.Reset ' Let the UserForm know we're finished
End Sub

在UserForm中

代码语言:javascript
运行
AI代码解释
复制
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If MyLong.handleErrors Then Application.EnableCancelKey = xlInterrupt
End Sub

请注意,这个方法可能会产生一些错误--您没有预料到,因为执行直接跳转到指定的标签。您的清理代码需要从一开始就实例化所需的变量。

总之,一旦解决了这些问题,此设置确保用户可以尽可能多地单击CTRL+Break,而不会导致崩溃或弹出窗口。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59025389

复制
相关文章
Tcp连接建立与连接释放
1)客户端给服务器发送了一条将其SYN标志位置1的请求连接建立报文,然后其状态由closed转变为SYN-SENT(同步已发送)。
你的益达
2020/08/25
3.8K0
Tcp连接建立与连接释放
建立JDBC数据库连接实例解析
  连接(Connection)是一个代表与数据库进行的程序连接的对象。通过连接,可以执行SQL语句、返回数据库操作结果等。 创建指定数据库的URL     要建立与数据库的连接,首先要创建指定数据库的URL。连接通常是通过数据库的URL对象,利用DriverManager的getConnection方法建立的。数据库URL对象与网络资源的统一资源定位类似,其构成格式如下:    jdbc:subProtocol:subName://hostname:port; DatabaseName=XXX  
阿新
2018/04/11
2.2K0
如何与 Zappos 建立 EDI 连接?
Zappos 是一家享誉全球的知名在线鞋类和服饰零售商,经营范围涵盖各类时尚品牌的鞋类、服饰及配饰等,使命是为广大消费者提供方便、愉悦、优质的购物体验,让每一位顾客都能找到心仪的产品。多年来,Zappos 卖场凭借卓越的服务与产品质量,积累了众多荣誉和成就。
知行软件EDI
2023/07/28
2520
如何与 Zappos 建立 EDI 连接?
如何与 MACOM 建立 EDI 连接?
MACOM提供高性能射频,微波和毫米波器件,其产品广泛应用于通信,航空航天,国防和工业市场。近年来MACOM在中国地区的业务一直高速增长。
知行软件EDI
2023/04/17
1.3K0
如何与 MACOM 建立 EDI 连接?
如何与GHSP 建立 EDI 连接?
GHSP是全球领先的汽车、运输和电器行业机械和机电系统供应商。最初成立于1924年,此后已扩展到世界各地。如果GHSP向我们发来EDI连接邀请,我们应该如何应对呢?
知行软件EDI
2022/10/31
1.3K0
如何与GHSP 建立 EDI 连接?
如何与Kostal 建立EDI连接?
Kostal是一家德国公司,主要从事汽车电子和工业电子产品的研发、生产和销售,是全球领先的电子元器件和系统供应商之一。其产品包括电气系统、传感器、电动驱动系统、电池管理系统等方面,被广泛应用于汽车、工业、家用电器等领域。
知行软件EDI
2023/05/09
6220
在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误
在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接)
星哥玩云
2022/08/16
5.7K0
在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误
速读原著-TCP/IP(连接的建立与终止)
T C P是一个面向连接的协议。无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。本章将详细讨论一个 T C P连接是如何建立的以及通信结束后是如何终止的。这种两端间连接的建立与无连接协议如 U D P不同。我们在第 11章看到一端使用 U D P向另一端发送数据报时,无需任何预先的握手。
cwl_java
2020/03/11
5480
如何与宜家IKEA建立EDI连接?
宜家IKEA是来自瑞典的全球知名家具和家居零售商,在全球拥有223个商场,其中有36家商场位于中国大陆。如今宜家在全球53个国家有大约1300个供应商,在16个国家的28个分销中心负责为宜家商场供货。如此庞大的供应链体系和业务数据量使得宜家的业务数据处理流程面临巨大挑战。究竟如何处理大批量的业务数据呢?答案是:使用EDI(电子数据交换)技术。EDI专攻于大批量的业务数据处理,助力宜家提升其自动化水平。
知行软件EDI
2021/05/24
9630
如何与宜家IKEA建立EDI连接?
Linux下与github建立ssh连接
3.当你看到 “Enter a file in which to save the key,” 的提示后,按Enter键.意思就是使用默认路径.
LogicPanda
2018/08/30
6.8K0
Linux下与github建立ssh连接
Linux下与github建立ssh连接
前期准备 设置用户: git config --global user.name "your name" git config --globa user.email "your email.com" 全局使用该用户名及用户邮箱 创建目录: mkdir new_folder_name 创建一个用于跟踪的新文件夹或者使用系统自带的文件管理系统创建一个新的文件夹 可以参看 git常用命令及含义[http://blog.csdn.net/autuan_liu/article/details/5
zenRRan
2018/04/10
6.5K0
Linux下与github建立ssh连接
浅谈TCP协议(建立与断开连接)
TCP是面向连接的,可靠的进程到进程通信的协议。 TCP提供全双工服务,即数据可在同一时间双向传输,每一个TCP都有发送缓存,用来临时存储数据。 TCP将若干个字节构成一个分组,成为报文段(segment) TCP报文段封装在IP数据报中:
小手冰凉
2019/09/10
2.7K0
浅谈TCP协议(建立与断开连接)
如何与 Boot Barn 建立 EDI 连接?
Boot Barn 大力鼓励其供应商使用 EDI,计划与其供应商一起使用 EDI 技术,从而转换采购订单、发票和提前发货通知 (ASN) 的人工处理方式。
知行软件EDI
2023/08/04
2550
如何与 Boot Barn 建立 EDI 连接?
MariaDB 建立连接
上面给出的代码连接到MariaDB并提供一个命令提示符来执行SQL命令。 输入代码后,将显示一条欢迎消息,指示连接成功,并显示版本号。
用户9042463
2021/09/29
1.7K0
建立技术连接的思维
从工作计划的角度来说,我们是罗列出一些工作的清单,标明任务权重,当然从我们的角度来说,我们更多会从系统,技术的角度来进行描述和权衡。
jeanron100
2019/05/13
7650
Mysql连接建立与thread cache唤醒原理
Thread 1 监听socket,协议栈的连接上来后,使用现有的或新建线程处理连接。
mingjie
2022/05/12
1.1K0
一、Django连接与建立数据库
如果没有修改django默认数据库连接,那么会自动生产一个sqlite3的数据库。
Dreamy.TZK
2020/04/09
2.8K0
如何与劳氏 Lowe's 建立EDI连接?
劳氏Lowe's(以下简称:Lowe's)是专门从事家庭装修的美国零售公司,而 EDI 则是电子数据交换的缩写,是指通过计算机网络进行企业间电子数据交换的一种标准化方式。
知行软件EDI
2023/05/10
3690
如何与劳氏 Lowe's 建立EDI连接?
【说站】python中socket建立客户连接
以上就是python中socket建立客户连接的方法,希望对大家有所帮助。更多Python学习指路:python基础教程
很酷的站长
2022/11/23
5380
【说站】python中socket建立客户连接
如何与安森美Onsemi建立EDI连接?
安森美半导体(ON Semiconductor)是应用于高能效电子产品的首要高性能硅方案供应商。其产品包括电源和信号管理、逻辑、分立及定制器件,帮助客户解决他们在汽车、通信、计算机、消费电子等领域的独特设计挑战。近期我们帮助客户成功与安森美Onsemi建立EDI连接,实现自动化地业务数据传输。
知行软件EDI
2022/10/25
5050
如何与安森美Onsemi建立EDI连接?

相似问题

当大小文件较大时,$_FILE为空,代码点火器

12

当字段为空时,验证无效

10

当字段为空时删除行

15

当字段为空时获取"null“

15

当字段为空时触发变更

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档