01 定义结构 目标是要把customUI.xml解析为二维数组,数组的第0行记录的是属性,第一列记录的是元素,其他地方存储的是属性的值。...02 状态机解析 要从Ribbon xml中解析元素、属性、属性的值,需要逐个去读取xml中的字符,判断状态,然后执行相应的操作。...XML '记录XML.Nodes的下一个位置 Private pNodeNext As Long '记录当前正在处理的Node在XML.Nodes中的Index Private pNode As Long...'记录状态 Private state As Long 'Stack中记录的是XML.Nodes的Index,方便处理父子关系 Private s As CStack 'XML文本长度 Private...state = VBA.CallByName(Me, "S" & VBA.CStr(state), VbMethod) '99作为出错情况 If state
通过前面的文章能够知道,每一个模块的代码,在VBAProject中也就是一个数据流,这个数据流经过了run length encoding的算法进行压缩。...前面介绍的是自己使用VBA代码来解压缩,其实也有现成的API RtlDecompressBuffer可以使用,具体用法可以网上找找。 所以,只要能找到模块的数据流,然后进行解压缩就可以还原模块的代码。...模块的数据流也就是在复合文档中读取一个数据流,另外要注意的是,这样读取出来的模块数据流并不都是我们写的VBA代码,还需要结合解析dir流时候得到的模块信息进行截取,再进行解压缩: '读取某个模块的代码...'ModuleName 模块的名称 'StrCode 返回模块的代码 'Return 返回出错信息 Function GetModuleCode(ModuleName As String,...[" & ModuleName & "]" Exit Function End If Dim i As Long, j As Long '跳过前面不需要的部分
注意return false;表示阻止超链接跳转的默认行为;让我们了解一下DOM1中的事件处理函数的工作机制。在给某个元素添加了事件处理函数后,一旦事件发生,相应的JavaScript代码就会被执行。...DOM1中适用;所以这段代码只会在支持DOM1标准的浏览器中才会有效,其他的浏览器任然会被带到目标窗口!...的元素是否存在,如果不存在的话网页任能正常运行 if (document.getElementById("imagegallery")) { var gallery = document.getElementById...的元素是否存在,如果不存在的话网页任能正常运行 if (document.getElementById("imagegallery")) { var gallery = document.getElementById...的元素是否存在,如果不存在的话网页任能正常运行 if (document.getElementById("imagegallery")) { var gallery = document.getElementById
出错:获取HTML元素集合,循环给元素添加事件。在事件响应函数中(event handler)获取对应的索引。但每次获取的都是最后一次循环的索引。...出错原因:初学者并未理解JavaScript的闭包特性。通过element.onclick=function(){alert(i);}方式给元素添加点击事件。...响应函数function(){alert(i);}中的 i 并非每次循环时对应的 i(如0,1,2,3,4)而是循环后最后 i 的值5。...) { (function(arg){ pAry[i].onclick=function(){ alert(arg); }; })(i);//调用时参数 }; } //加一层闭包,i 以局部变量形式传递给内层函数...init();"> 产品 0 产品 1 产品 2 产品 3 产品 4 往期精选文章 ES6中一些超级好用的内置方法
在VBA中,运行时错误发生的时候,会直接中断程序的运行,如果仅仅是程序的使用者,可能完全不会代码,那么出现这种中断程序的运行的状况,使用者就会不知所措了。...比如用VBA代码激活一个工作表,但这个工作表不存在的情况下: Worksheets("ErrTest").Activate ? 程序被中断了,不懂VBA的人碰上这个肯定就不知道如何去处理了。...1、On Error语句: 在VBA里处理错误使用的是On Error语句: Sub TestErr() '出错的时候,程序跳转到标签ErrTest处 On Error GoTo ErrTest...: Function HasSht2(sht_name As String) As Boolean On Error Resume Next '尝试激活工作表,不存在的工作表情况下会出错...因为作为写程序的人,必须要考虑到使用者的情况,给使用者出现运行时错误是不应该的,所以写程序的过程中,一定要非常严谨,尽量在所有的程序中都加上错误捕获的代码。
VBA用到一定的时候,就会发现有些功能实现不了,被限制束缚了,这个时候一旦接触到了Windows API,就感觉又有了一片新天地。...其实很多系统的操作,像文件的操作等,都是要调用Windows API的,就算是VBA里的文件操作语句: Open pathname For mode [ Access access ] [ lock...2、参数传递 值参数 很多参数API中只是使用,所以VBA里传递是按值传递还是按照地址传递其实都是一样的,这个和VBA里的Function是一样的。...传递了,而数字没有初始的时候是0,API函数去操作指针地址0的时候,必然会出错造成Excel的崩溃。...Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long 'lpBuffer 用来接收从文件中读出的数据的缓冲区指针
As String = "customUI/customUI.xml" '从ZIP文件中读取customUI.xml Sub ReadCustomUI() If VBA.Len(FileName...End If Dim b() As Byte Dim bucs2() As Byte Dim sXML As String '尝试读取文件中的...customUI.xml ret = zip.UnZipFile(CUSTOMUI_NAME, b) If ret = "zip: ZIP文件中不存在的文件:customUI/customUI.xml..." Then '不存在的时候插入一个默认模板 If MsgBox("文件中没有customUI.xml,是否插入一个模板?"...(ret) Then MsgBox "编码转换出错:" & vbNewLine & ret Exit Sub End If
尝试访问不存在的数组元素是一个常见的示例。例如: Dim MyArray(100) As Single … MyArray(150) = 1.2 ‘导致错误!...良好的编程习惯可以帮助防止由代码引起的错误,但是某些错误显然是程序员无法控制的。这是VBA程序应始终包含错误处理的原因之一。 错误和Excel对象模型 某些Excel对象内置了自己的错误处理。...一个示例是Workbook对象,如果尝试打开磁盘上不存在的工作簿,或者尝试将工作簿保存到不存在的磁盘上,则Workbook对象会捕获错误并显示其自己的对话框(如图26-2所示))。...image.png 图26-2:一些Excel对象在内部处理错误并显示自已的对话框 避免错误 有一些好的编程习惯可以帮助避免程序中的错误,这些类似于第24课中建议的防止错误的实践,但是值得重复: 总是使用...延迟错误处理 另一种错误处理技术是延迟对错误的处理。换句话说,VBA不会捕获错误,而是将其忽略。然后,你的代码可以检查Err对象,以查看是否发生的错误类型。
类似地,如果 T[A] 和 T[B] 之间不存在父子类关系,那么这种型变就是「不变」1。...也就是说,给协变的数组的单元赋值的时候出错了。这个错误本来应该由编译器发现并指出,但 Java 将对这一错误的防止延后到了运行时期,错过了编译期的检查。...,防止了出现刚刚数组那样的问题。...而 get 方法的类型显然是 () => T。所以从单元中获取元素这个操作上来看,数组在其元素的类型上协变。...在 Scala 中,如果进行了协变或者逆变的标记,编译器就会对这个类型参数的使用进行检查,如果它出现在了错误的位置上,编译器就会提示错误,防止了开发者因此而犯错。
标签:VBA 在某些情形下,可能希望将加载项中的代码合并到其他VBA过程中,或者允许其他人访问你的加载项。...此时,为了防止加载项卸载或未安装而导致出错,可以使用VBA代码确保加载项正确加载到你正在使用的任一Microsoft Office程序中。...VBA代码如下(注:代码来源于www.thespreadsheetguru.com,供参考): Sub InstallCheckAddIn() '目的:如果当前没有安装则从加载项文件夹中装载加载项...TestAddin = Workbooks(AddIns(AddInName).Name) StoreError = Err On Error GoTo 0 '如果没安装加载项, 在加载项文件夹中查找并装载...MsgBox "没要找到要安装的加载项: " & AddInName End If ExitSub: End Sub 注意,上面的代码仅在系统默认的加载项文件夹中搜索你想要的加载项,如果你在自己的文件夹中存储加载项
1、对象模型 上一讲说了Range对象,这一次我们从总体方面来说一下Excel VBA的对象模型。 你真正想了解Excel VBA里的对象的话,看官方文档是最好的,没有比官方文档更准确的了。...Range("A1").Value看看,出错了吧,为什么呢? 这个时候最好自己先好好想一下,然后看看那个错误的提示框上什么意思,多想想。 ? 对象定义错误:为什么会有这个错误?...Range("A1"),因为这个Range对象根本不存在,我们通过ThisWorkBook.Close False这句代码,已经关闭了工作簿,当前根本没有了单元格了,操作根本不存在的东西,当然出错。...我以自己非专业的认识讲一下,可能有不对的地方: 你双击一个Excel文件 windows操作系统根据后缀找到注册表里对应文件后缀的可执行文件,也就是EXCEL.EXE EXCEL.EXE首先运行起来...然后EXCEL.EXE读取那个文件在硬盘上的数据,并解析数据放到了内存中 解析过程也就是去创建1个树形的对象模型 解析过程会根据文件的情况创建Workbook、Worksheet对象,其实所谓的创建也只是在内存中按一些规则来组织数据
写入custom.xml步骤: 从Excel中读取数据并转换为xml格式的文本 然后转换编码 使用类模块CPKZip的功能,将custom.xml写入(CPKZip的写入功能下次介绍) 这里需要注意的是...(sXML) = 0 Then MsgBox "请在单元格中设置customUI" Exit Sub End If Dim bucs2() As Byte...(ret) Then MsgBox "编码转换出错:" & vbNewLine & ret Exit Sub End If '检查是否设置了目标文件...End If '判断是否存在CUSTOMUI_NAME,不存在的情况下还要更新rel Dim fs() As String fs = zip.Files()...(ret) Then MsgBox ret Exit Sub End If '将最后的替换为
可以使用ContansKey属性防止值的替换或错误的产生。...可以使用ContainsValue属性来防止将某个值连接到2个不同的键。...第一个元素的索引号为0。如果元素不存在,则结果值为-1。...如果键不存在,则不会发生任何事情;VBA不会产生错误。...如果索引号不存在,VBA将产生一条错误消息。第一个元素的索引号为0。
,如果你已经知道了可以跳过去。...XML信息体是由树状元素组成。每个XML文档都有一个文档元素,也就是树的根元素,所有其它的元素和内容都包含在根元素中。 3....>>> root.nodeType 1 >>> root.ELEMENT_NODE 1 四、子元素、子结点的访问 访问子元素、子结点的方法很多,对于知道元素名字的子元素,可以使用getElementsByTagName...由于本例比较简单,只涉及文本结点和元素结点。 getElementsByTagName可以搜索当前元素的所有子元素,包括所有层次的子元素。childNodes只保存了当前元素的第一层子结点。...,而上一种结果则不存在这一问题。
于是本着玩的心态,开了个店。很快第一单就上门了: 词频统计: A列是关键词的组合,关键词之间以空格连接。 在B列竖向输出A列所有的关键词,去重。 C列输出对应B列关键词的出现频率。...后来在某鱼还遇到了很多好玩的事儿: 某大叔嫌之前人写的自动打印不智能不能批量找我加; 一个主要工作就是填表的小妹妹因为跨表总出错让我帮忙做检查功能; 工厂大叔因为技术离职了VBA没人维护找我修改之前我没接触的功能...; 一个小哥让我写彩票统计工具还问我“你们大学生有文化能不能帮我分析一下彩票到底能不能赚钱”; 一个已经用python把微博数据爬到excel中但是不会处理的神奇小哥; 一堆给我提英文需求让我帮忙做作业的海外留学生...,所以当我游走在这繁杂的都市中,此刻想到的…… ---- 你也一定有写VBA的需求!...检查上方菜单栏,如果有“开发工具”,跳过此步骤;如果没有,则点击文件,选项,自定义功能区,将右侧的“开发工具”勾选。(放心,以后不会再让你设置了) ? ?
在js开发中,调试错误是一个比较头疼的事,又不像java的debug那么方便,定位错误往往不是那么容易,除非对代码熟悉无比,但即使是自己写的代码,功能一复杂,时间一长,再想快速定位问题,至少我现在是比较头疼的...js中抛出错误的方法有两种:throw new Error()抛出错误和try...catch..捕获错误。...先来看throw new Error(): function getDiv(el){ if(el && el.getElementsByTagName){ return el.getElementsByTagName...当以这种方式抛出错误时,如果没有经try-catch语句来捕获的话,浏览器通常直接在控制台显示错误消息字符串。 通常在抛出的错误提示字符串中,应尽量写清错误目标和原因。...:期望的对象不存在时抛出,如试图在一个null对象引用上调用一个函数。
dom伪数组 //需要改变得就是在获取元素的上下文做相应的更改 /*对浏览器能力检测模块B*/ var support ={}; support.getElementsByClassName = (...if(fn.call(arr[i],i,arr[i])===false){ break } } } /*遍历for(){}E*/ /*单个的获取元素的方法...results = results || []; context = context ||document; results.push.apply(results,context.getElementsByTagName...results.push(arr[i]) } } } //console.log(results) return results } /*单个的获取元素的方法...,为了防止出错,将其两端的空格去掉 each(newselector,function(i,v){ //遍历,分别调用基本选择器函数,追加到results数组中 results.push.apply
使用getElementsByTagName获取元素 可以使用内置对象document上的getElementsByTagName方法来获取页面上的某一种标签,获取的是一个选择集,不是数组,但是可以用下标的方式操作选择集里面的标签元素... window.onload = function(){ var aLi = document.getElementsByTagName...('li'); // aLi.style.backgroundColor = 'gold'; // 出错!...练习 使用循环操作列表中的每个元素。 ? window.onload = function(){ var aLi = document.getElementsByTagName
CDATA 部分中的所有内容都会被解析器忽略。CDATA 部分以 "" 结束: 元素:y = xmlDoc.getElementsByTagName("book")[0];xmlDoc.documentElement.removeChild...示例: removeAttribute('category')此代码将删除第一个 元素中的 "category" 属性:x = xmlDoc.getElementsByTagName("book
通过DOM接口,可以改变网页的内容,结构和样式 DOM树 ---- 文档:一个页面就是一个文档,DOM中使用document表示 元素:页面中所有的标签都是元素,DOM中使用element表示 节点:网页中的所有内容都是节点...由于元素的 ID 在大部分情况下要求是独一无二的,这个方法自然而然地成为了一个高效查找特定元素的方法。...如果当前文档中拥有特定ID的元素不存在则返回null. id是大小写敏感的字符串,代表了所要查找的元素的唯一ID....> 返回: 返回的是获取过来元素对象的集合,以伪数组的形式存储的 也就是说我们可以通过提取数组元素的方法得到其中一个元素的内容。...: for(var i = 0 ;i < tag.length;i++){ console.log(tag[i]); } 得到: 得到元素里面的某些标签 element.getElementsByTagName
领取专属 10元无门槛券
手把手带您无忧上云