- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在各个地方读到 API 计时器在 VBA 中存在风险,如果在计时器运行时编辑单元格,则会导致 Excel 崩溃。
此代码来自 http://optionexplicitvba.wordpress.com Jordan Goldmeier 写的似乎没有这个问题。它使用计时器淡化弹出窗口,当它淡化时,我可以单击并在单元格和编辑栏中输入文本。
API 计时器何时安全,何时不安全?有没有具体帮助我理解的原则? 崩溃的机制是什么:究竟发生了什么让 Excel 崩溃?
Option Explicit
Public Declare Function SetTimer Lib "user32" ( _
ByVal HWnd As Long, _
ByVal nIDEvent As Long, _
ByVal uElapse As Long, _
ByVal lpTimerFunc As Long) As Long
Public Declare Function KillTimer Lib "user32" ( _
ByVal HWnd As Long, _
ByVal nIDEvent As Long) As Long
Public TimerID As Long
Public TimerSeconds As Single
Public bTimerEnabled As Boolean
Public iCounter As Integer
Public bComplete As Boolean
Public EventType As Integer
Public Sub Reset()
With Sheet1.Shapes("MyLabel")
.Fill.Transparency = 0
.Line.Transparency = 0
.TextFrame2.TextRange.Font.Fill.ForeColor.RGB = RGB(0, 0, 0)
End With
Sheet1.Shapes("MyLabel").Visible = msoTrue
End Sub
Sub StartTimer()
iCounter = 1
Reset
TimerID = SetTimer(0&, 0&, 0.05 * 1000&, AddressOf TimerProc)
End Sub
Sub EndTimer()
KillTimer 0&, TimerID
bTimerEnabled = False
bComplete = True
End Sub
Sub TimerProc(ByVal HWnd As Long, ByVal uMsg As Long, _
ByVal nIDEvent As Long, ByVal dwTimer As Long)
On Error Resume Next
Debug.Print iCounter
If iCounter > 50 Then
With Sheet1.Shapes("MyLabel")
.Fill.Transparency = (iCounter - 50) / 50
.Line.Transparency = (iCounter - 50) / 50
.TextFrame2.TextRange.Font.Fill.ForeColor.RGB = _
RGB((iCounter - 50) / 50 * 224, _
(iCounter - 50) / 50 * 224, _
(iCounter - 50) / 50 * 224)
End With
End If
If iCounter > 100 Then
Sheet1.Shapes("MyLabel").Visible = msoFalse
EndTimer
End If
iCounter = iCounter + 1
End Sub
Public Function ShowPopup(index As Integer)
Sheet1.Range("Hotzone.Index").Value = index
iCounter = 1
If bTimerEnabled = False Then
StartTimer
bTimerEnabled = True
Reset
Else
Reset
End If
With Sheet1.Shapes("MyLabel")
.Left = Sheet1.Range("Hotzones").Cells(index, 1).Left + _
Sheet1.Range("Hotzones").Cells(index, 1).Width
.Top = Sheet1.Range("Hotzones").Cells(index, 1).Top - _
(.Height / 2)
End With
Sheet1.Range("a4:a6").Cells(index, 1).Value = index
End Function
最佳答案
@酷蓝:崩溃的机制是什么:究竟发生了什么让 Excel 崩溃?
我可以给你扩展 Siddarth Rout 的答案,但不是完整的解释。
API 调用不是 VBA:它们存在于 VBA 的错误处理程序之外,当出现问题时,它们要么什么都不做,要么调用内存中不存在的资源,或者尝试读取(或写入!)外部内存Excel.exe 的指定内存空间
发生这种情况时,操作系统将介入并关闭您的应用程序。我们曾经将此称为“一般保护故障”,这仍然是对该过程的有用描述。
现在了解一些细节。
当你在 VBA 中调用一个函数时,你只需写下名字——我们称之为“CheckMyFile()”——这就是你在 VBA 中需要知道的全部内容。如果没有调用 'CheckMyFile' 的东西,或者它被声明在你的调用看不到它的地方,编译器或运行时引擎将以断点的形式引发错误,或者在编译和运行之前发出警告。
在幕后,有一个与字符串 'CheckMyFile' 相关联的数字地址:我正在简化一点,但我们将该地址称为 。函数指针 - 跟随那个地址,我们会到达一个结构化的内存块,它存储函数参数的定义、存储值的空间,以及将这些参数引导到为执行 VBA 并将值返回到创建的函数结构中的地址函数输出的地址。
事情可能会出错,VBA 做了很多工作来确保所有这些在出错时都能优雅地折叠起来。
如果您将该函数指针指向不是 VBA 的东西 - 外部应用程序或(例如) API 定时器调用 - 你的函数仍然可以被调用,它仍然可以运行,一切都会正常工作。
当您将函数指针传递给 API 时,我们将此称为“回调”,因为您调用它的计时器函数,它会回调您。
但最好在那个指针后面有一个有效的函数。
如果没有,外部应用程序将调用它自己的错误处理程序,它们不会像 VBA 那样宽容。
如果 Excel 和 VBA 处于“忙碌”状态或在尝试使用该函数指针时不可用,它可能会挂断调用并且什么也不做:你可能很幸运,只有一次。但它可能会引起操作系统对 Excel.exe 进程的愤怒。
如果回调导致错误,并且您的代码未处理该错误,则 VBA 将向调用者提出错误 - 而且,由于调用者不是 VBA,它可能无法处理:和它会向操作系统寻求“帮助”。
如果是 API 调用,它是为假定已在调用代码中放置错误处理和应急管理的开发人员编写的。
这些假设是:
关于excel - 如何在 VBA 中制作安全的 API 计时器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20269844/
我想在一个页面上做一个按钮,可以在同一页面调用一个JS函数。该函数将需要创建(打开)新窗口,其 HTML 代码由 JS 函数本身提供。我该怎么做? 这样做的目的是从特定页面生成一个打印友好的页面。 请
我一直在用 php 开发这个项目。该项目的一半是使用 mysql_query 完成的,最新的模块是使用 mysqli 制作的。有很多模块,我不想更改代码。如果是这样的话会不会产生问题。或者我应该将其全
我安装了好几次 qt creator,但它从来没有像我现在的 PC 那样花钱;首先,我使用我的 Pendrive(Qt 5.8 的)上一直有的安装程序,告诉我我无法下载一些存储库,我下载了相同安装程序
我安装了 Qt Creator 5.10.1,当我构建项目时出现错误:“无法确定要运行哪个”make“命令。检查构建配置中的”make“步骤。”。 我已经在另一台 PC 上安装了 Qt,我看到了这个问
看看这个 makefile,它有某种原始的进度指示(可能是一个进度条)。 请给我建议/意见! # BUILD 最初是未定义的 ifndef 构建 # max 等于 256 个 x 十六:= x x x
这个问题会有点长,对此我很抱歉:) 我花了几天时间寻找最好的解决方案,以在 asp mvc 和 JQuery 中制作图像库。 主要问题是当用户点击拇指时显示图像。 我想让整个浏览器 View 变成黑色
我是Python方面的 super 高手。我一直在努力寻找适当的解决方案。这是列表,L = [0, 0, 0, 3, 4, 5, 6, 0, 0, 0, 0, 11, 12, 13, 14, 0, 0
让我们考虑两个简化的 CMakeLists.txt set(GTEST "/usr/local/lib/libgtest.a") set(GMOCK "/usr/local/lib/libgmock.
我如何制作 Makefile,因为这是按源代码分发程序的最佳方式。请记住,这是针对 C++ 程序的,而我是从 C 开发领域开始的。但是可以为我的 Python 程序制作 Makefile 吗? 最佳答
由于 Ord 是 Eq 的子类,我发现很难理解创建该类的新类型实例的样子。 我已经设法做到了: newtype NT1 = NT1 Integer instance Eq NT1 wh
在 PowerShell 中,我想编写一个函数,它接受不同的选项作为参数。没关系,如果它接收多个参数,但它必须接收至少一个参数。我想通过参数定义而不是之后的代码来强制执行它。我可以使用以下代码让它工作
我正在通过构建包使用 enable-ssl 在 heroku (ubuntu) 上安装 ffmpeg。我能够一直构建到这些错误: install: cannot create regular file
我是 FFmpeg 的新手,但作为一个学习一些 mysql 数据库的项目,我正在尝试创建一个视频上传网站。 当我尝试使用此代码制作缩略图时: shell_exec("/usr/local/bin/ff
我想要一个绘制可绘制对象的 Actor ,但将其剪辑为 Actor 的大小。我从 Widget 派生这个类,并使用一些硬编码的值作为一个简单的测试: public class MyWidget ext
我一直在查看 Faxien+Sinan 和 Rebar,Erlang OTP 的基本理念似乎是,在单个 Erlang 镜像实例上安装应用程序和版本。保持发布自包含的最佳实践是什么?有没有办法打包发布,
我正在尝试克隆存储库,但它应该是彼此独立的副本。这背后有什么魔法吗,或者只是使用 svn 客户端并克隆它? 谢谢 最佳答案 试试 svnadmin hotcopy .您可以在 repo mainten
我想做一个这样的菜单: Item 1 Item 2 Item 3 Subitem 1 Subitem 2 但我得到了这个:
为 Yii 创建扩展的最佳方式是什么? 这是我到目前为止所做的 我希望它可以通过 composer 安装,所以我为它创建了一个 github repo。 我在文件夹 vendor/githubname
我尝试制作一个ActionListener,但它给了我一个错误。我导入了事件,但它仍然不起作用。这是我的代码: send.addActionListener(new jj); private clas
我需要能够将 div 内的 HTML 代码恢复为页面就绪状态。我需要这个,因为我想在页面准备好后对 HTML 代码进行一些更改,然后在需要时将其恢复到页面准备好时的状态.. 我想使用克隆,但是如何只复
我是一名优秀的程序员,十分优秀!