ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: sheffield

[求助] 一个导致Excel崩溃的VBA Bug??

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-7-11 15:28 | 显示全部楼层
lujkhua 发表于 2019-7-11 15:16
说明
使用 IsMissing 函数来检测在调用一个程序时是否提供了可选 Variant 参数。如果对特定参数没有传递 ...

抱歉我没有看到你把这个未初始化的数组,改成了Integer,这样可以正常通过检测。可是不符合我的要求了。我要的是另外一个需求,用户把任何一个变量嵌套到另一个数组或字典中,我都能识别是什么类型的变量。我需要检测这个数组或字典,我的最终目的是构造另外一个debug函数,打印输出一个数组或字典的内容。

TA的精华主题

TA的得分主题

发表于 2019-7-11 15:28 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
zhanglei1371 发表于 2019-7-11 15:25
我的Excel2016,也会崩溃。

随便将数组声明一个具体类型即可,比如:
  1. Sub test1()
  2.     Dim arr() As String, var
  3.     var = arr()
  4.     test2 var
  5. End Sub

  6. Sub test2(Optional a)
  7.     If IsMissing(a) Then
  8.         Debug.Print "你是否运行了我说的代码??"
  9.     Else
  10.         Debug.Print "无论如何Excel都会崩溃??"
  11.     End If
  12. End Sub
复制代码


TA的精华主题

TA的得分主题

 楼主| 发表于 2019-7-11 15:38 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
qingc0221 发表于 2019-7-11 15:20
arr()都没初始化就赋值给别的变量?

是的,比如你正好要检测这样的一个行为:用户有没有对指定的变量进行初始化,怎么操作?我知道iserror也可以类似ismissing使用,但是这样就无法检测Error类型本身了。我现在搞不明白的是,这是不是一个bug。要知道,没有初始化的数组是可以赋值给别的变量的(比如var),此时vartype(var)是8204,typename(var)是“Variant(),一切都很正常,但是就是不能进行ismissing检测。WHYYYYYY?

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-7-11 19:28 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
lujkhua 发表于 2019-7-11 15:28
随便将数组声明一个具体类型即可,比如:

请问有答案吗?在保持为Variant的情况下,出现Excel崩溃的原因?

TA的精华主题

TA的得分主题

发表于 2019-7-11 23:13 | 显示全部楼层
判断一个变量 是数组还是 字典,这和 ismissing有啥关系呢 ?

TA的精华主题

TA的得分主题

发表于 2019-7-12 07:50 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-7-12 08:03 | 显示全部楼层
zopey 发表于 2019-7-11 23:13
判断一个变量 是数组还是 字典,这和 ismissing有啥关系呢 ?

这句话,请楼主好好回味儿...

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-7-12 12:38 | 显示全部楼层
zopey 发表于 2019-7-11 23:13
判断一个变量 是数组还是 字典,这和 ismissing有啥关系呢 ?

你的一个非常开放的函数,需要接收任意类型的变量,——这个变量是optional的,需要看它是不是IsMissing了

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-7-12 12:38 | 显示全部楼层
lujkhua 发表于 2019-7-12 08:03
这句话,请楼主好好回味儿...

你的一个非常开放的函数,需要接收任意类型的变量,——这个变量是optional的,必须判断它是不是IsMissing了

TA的精华主题

TA的得分主题

发表于 2019-7-12 13:45 | 显示全部楼层
sheffield 发表于 2019-7-11 19:28
请问有答案吗?在保持为Variant的情况下,出现Excel崩溃的原因?

日志名称:          Application
来源:            Application Error
日期:            2019/7/12 8:56:13
事件 ID:         1000
任务类别:          (100)
级别:            错误
关键字:           经典
用户:            暂缺
计算机:           jason-pc
描述:
错误应用程序名称: EXCEL.EXE,版本: 16.0.4873.1000,时间戳: 0x5cffdabb
错误模块名称: VBE7.DLL,版本: 7.1.10.56,时间戳: 0x57e4bc6a
异常代码: 0xc0000005
错误偏移量: 0x0011a02e
错误进程 ID: 0x1e84
错误应用程序启动时间: 0x01d5384c78728513
错误应用程序路径: C:\Program Files\Microsoft Office\Office16\EXCEL.EXE
错误模块路径: C:\Program Files\Common Files\Microsoft Shared\VBA\VBA7.1\VBE7.DLL
报告 ID: d80879a7-a43f-11e9-a080-00269e9b5a6f
事件 Xml:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
    <Provider Name="Application Error" />
    <EventID Qualifiers="0">1000</EventID>
    <Level>2</Level>
    <Task>100</Task>
    <Keywords>0x80000000000000</Keywords>
    <TimeCreated SystemTime="2019-07-12T00:56:13.000000000Z" />
    <EventRecordID>230972</EventRecordID>
    <Channel>Application</Channel>
    <Computer>jason-pc</Computer>
    <Security />
  </System>
  <EventData>
    <Data>EXCEL.EXE</Data>
    <Data>16.0.4873.1000</Data>
    <Data>5cffdabb</Data>
    <Data>VBE7.DLL</Data>
    <Data>7.1.10.56</Data>
    <Data>57e4bc6a</Data>
    <Data>c0000005</Data>
    <Data>0011a02e</Data>
    <Data>1e84</Data>
    <Data>01d5384c78728513</Data>
    <Data>C:\Program Files\Microsoft Office\Office16\EXCEL.EXE</Data>
    <Data>C:\Program Files\Common Files\Microsoft Shared\VBA\VBA7.1\VBE7.DLL</Data>
    <Data>d80879a7-a43f-11e9-a080-00269e9b5a6f</Data>
  </EventData>
</Event>

从异常代码 0xc0000005 来说说一位 C 初学者的猜测:
IsMissing() 需要对参数(应该是指针值)进行解引用操作,以对某些标记作出判断,
但此时该参数未初始化,其初值为全 0,
进行解引用操作时,IsMissing() 又没有对 0 指针值进行判断,所以就非法访问了。

虽然这是一个 Bug(即使是一个Bug,M$也不会修正了),但也给那些不定义不初始化变量
就使用的代码编写者上了一堂印象深刻的教育课!从这个意义上来说,我们得感谢M$!

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-16 05:40 , Processed in 0.034235 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表