1VisualBasic6.0常见错误及解决方案以下“解决方案”中的内容对应的是“错误分析”中内容的解决方法。1.无效的过程调用或参数(错误5)错误原因有些调用操作不能完成。错误分析⑴参数值可能超出了允许的范围。例如,Sin函数只接受特定范围的值。正的参数小于2,147,483,648的是可接受的,而等于2,147,483,648则会产生错误。⑵如果所要调用的过程不适于当前平台的话,也会发生此错误。例如,有些程序可能只应用到MicrosoftWindows或Macintosh等。解决方案⑴检查参数的许可范围。⑵检查过程的特定平台信息。2.溢出(错误6)错误原因当赋值超出目标的限制时,就会发生溢出。错误分析⑴赋值、计算或数据类型的结果的转换太大,以致于不能在变量类型所允许的范围内表示出来。⑵给属性的赋值超过属性能接受的最大值。⑶试图在计算中使用一个数字,并且该数字被强制为一个整数,但是结果超过了整数的范围,例如:DimxAsLongx=2000*365'错误:溢出解决方案⑴赋值给足够表示值的范围的类型的变量上。2⑵确保赋值适合属性的范围。⑶要解决这个问题,请按如下方式键入该数字:DimxAsLongx=CLng(2000)*3653.内存溢出(错误7)错误原因需要更多的内存空间,或是遇到64K段边界限制。错误分析⑴打开了太多的、文档或资源文件。⑵模块或过程太大了。⑶在MicrosoftWindows标准模式下执行。⑷在MicrosoftWindows增强方式下执行,但超出了虚拟内存的空间。⑸一些驻留程序在运行。⑹设备驱动程序装载的太多。⑺Public变量超出了空间。解决方案⑴关闭不需要的应用程序、文档或资源文件。⑵将庞大的模块或过程分成几个。虽然这样不能节省内存空间,但可避免64K段边界限制。⑶按增强方式重新启动MicrosoftWindows。⑷空出一些磁盘空间以增加虚拟内存,或至少确保有空馀的空间。⑸减少一些驻留程序。⑹减少一些不需要的设备驱动程序。⑺减少Public变量的数量。4.下标越界(错误9)错误原因只能在定义的范围内访问数组元素和集合成员。错误分析⑴引用了不存在的数组元素。⑵声明数组时没有指定元素的数目。例如,下列的代码就会导致此错误:3DimMyArray()AsIntegerMyArray(8)=234'导致错误9。⑶引用了不存在的集合成员。⑷使用速写形式的下标,结果指定了错误的元素。解决方案⑴下标比可能下标范围大或小,或是在应用程序中这一边的数组没有指定范围。检查数组的声明以确认其上界和下界。若使用的是重新指定范围的数组,应使用UBound和LBound函数来决定数组访问。如果索引指定为变量,应检查变量名的拼写。⑵VisualBasic并不会将没有指定范围的数组自动设为0–10。相反必须使用Dim或ReDim来指定数组中元素的数目。⑶试着使用ForEach...Next结构代替指定元素下标。⑷例如,当在集合上使用!运算子时,!自动指定了一个键。例如object!keyname.value和object.item(keyname).value是一样的。在此例中,集合中如果keyname表示一个错误键,错误就会产生。若要改进此错误,在集合对象中使用正确的键名称或索引。5.数组长度固定或临时被锁定(错误10)错误原因并非所有数组都可重设大小。即使数组声明成动态,或者数组是在Variant变量中,也会被临时锁定。错误分析⑴使用ReDim来改变固定大小数组的元素数。例如,在下列的代码中,在NextOne过程中SomeArr接收了固定大小的数组FixedArr,然后试图调整SomeArr的大小:SubFirstOneDimFixedArr(25)AsInteger'创建一个固定大小的数组并NextOneFixedArr()'将之传给其它过程。EndSubSubNextOne(SomeArr()AsInteger)ReDimSomeArr(35)'发生错误10。...EndSub⑵对模块层次动态数组,要重新确定大小,而某一个元素已经作为参数传给了过程。例如,在下列的代码中,ModArray是模块层次动态数组,却将其第56个元素以按引用传给Test过程:4DimModArray()AsInteger'创建一个模块层次动态数组。...SubAliasError()ReDimModArray(1To73)AsIntegerTestModArray(45)'传模块层次动态数组的元素'给Test过程。EndSubSubTest(SomeIntAsInteger)ReDimModArray(1To40)AsInteger'错误在这里发生。EndSub⑶赋一个值给包含数组的Variant变量,但Variant当前被锁定。例如,如果代码使用了ForEach...Next循环,对包含数组的variant执行操作的话,在进入循环后数组将会被锁定,在循环退出后释放:SomeArray=Array(9,8,7,6,5,4,3,2,1)ForEachXInSomeArraySomeArray=301'因为数组锁定导致错误。NextX解决方案⑴将数组用ReDim(如果是在过程内声明数组)声明为动态的而非固定大小,或在声明时不指定元素数(如果是在模块级别中声明数组)。⑵此例并不需要传递模块层次动态数组元素,因为在模块中所有过程都可看到它。然而,如果传递元素,在过程内引用参数,数组会被锁定以避免内存的配置释放,因此,当过程返回时,会导致不能预测的情况出现。⑶使用For...Next代替ForEach...Next循环来执行迭代。当数组是ForEach...Next循环的对象时,可以读入数组,但不能写入。6.除数为零(错误11)错误原因除数为零是不允许的。错误分析表达式的值作除数使用,但其为零。5解决方案检查在表达式中变量的拼写。拼写错误的变量名会被当成数值变量并且初始值为零。检查表达式中变量的前一个操作,尤其是从其他过程传送给过程的参数。7.串空间溢出(错误14)错误原因VisualBasic允许使用非常大的字符串。然而,其他程序的需求和处理字符串的方法可能导致这种错误。错误分析⑴使用的表达式为计算所创建的临时字符串,可能产生此错误。例如,下列的代码在一些操作系统上将产生Outofstringspace的错误:MyString=HelloForCount=1To100MyString=MyString&MyStringNextCount⑵系统内存溢出,致使不能给字符串分配空间。解决方案⑴将字符串赋值给其他名称的变量。⑵删除不需要的应用程序以增加可用的内存空间。8.不能执行所需的操作(错误17)错误原因如果此操作会导致工程的当前状态无效,则操作将不能执行。错误分析⑴所要求的操作不能作用在工程当前的状态。例如,当程序正处于中断模式时,使用“引用”对话框来添加一个对工程或对象库的新引用时,就会发生此错误。⑵试图修改正在执行的代码。例如,试图从文件读出代码然后加到正在执行的模块中。解决方案⑴停止执行当前的代码,然后重试此操作。⑵虽然可以修改工程中当前并非真正执行的模块,但不能修改正在运行的模块。如要要做这样的修改,必须停止当前正在运行的模块,再添加或修改,然后重新执行。69.出现用户中断(错误18)错误原因进程的中断执行是很有用的,如果不进行处理则会使应用程序中止。错误分析用户按CTRL+BREAK或其他中断键。解决方案在开发环境中可继续执行。避免在运行时出现这种情况,应使用合适的方法处理此错误。10.未发生错误而出现Resume(错误20)错误原因Resume语句只能在错误处理程序内出现,而且只能在活动的错误处理程序中执行。错误分析⑴将Resume语句放在错误处理程序的代码之外。⑵代码即使没有错误也跳到了错误处理程序之中。解决方案⑴将此语句移到错误处理程序之内,或删除它。⑵也许拼错了行标签。不能经过过程跳到标签,所以搜寻过程中注明错误处理程序的标签。如果找到了重复的GoTo语句的目标标签,而不是属于OnErrorGoTo语句的目标标签的话,修改行标签使与所要的目标标签一致。11.堆栈空间溢出(错误28)错误原因堆栈是内存的一个工作区,会随着程序运行的需要而增长或缩小错误分析⑴有太多活动的Function、Sub或Property过程调用。⑵本地变量需要更多可用的本地变量空间。⑶有太多定长字符串。⑷DoEvents函数调用的嵌套太多。⑸代码引起了事件层叠。7解决方案⑴检查过程的嵌套是否太深,尤其是递归过程,即自己调用自己的过程。确保递归能终止,使用“调用”对话框来查看活动的过程(在堆栈上)。⑵试着在模块级别中声明某些变量。可以在静态过程,即在Property、Sub或Function关键字前加上Static,声明所有变量,或可以在过程内使用Static语句来声明各个Static变量。⑶定长字符串在过程中可快速访问,比可变长度字符串使用更多堆栈空间,因为字符串数据本身要放在堆栈上。可试着重新定义一些定长字符串成为变长字符串。当声明一变长字符串时,只有字符串描述符(非数据本身)会放在堆栈上。可以在没有堆栈空间的模块层次上定义字符串。在模块层次申明变量是缺省为Public,所以在模块上所有过程皆可见到字符串。⑷利用“调用”对话框,在堆栈上查看正在活动的过程。⑸所谓事件层叠就是引起一个事件,此事件会调用已在堆栈上的事件过程。事件层叠和不能中止的递归过程调用是相似的,但不太明显,因为是由VisualBasic所调用,而不是在代码中调用。使用“调用”对话框来查看那些正在活动的过程(在堆栈上)。12.DLL应用程序客户太多(错误47)错误原因VisualBasic中动态链接库(DLL)一次只能容纳50个主机应用程序访问。错误分析应用程序和其他VisualBasic主应用程序(一些可能是应用程序访问的)都同时访问VisualBasicDLL。解决方案减少访问VisualBasic的打开的应用程序数。13.加载DLL时的错误(错误48)错误原因动态链接库(DLL)就是在Declare语句的Lib子句中所指定的库。错误分析⑴此文件并非可执行的DLL。⑵此文件并非MicrosoftWindowsDLL。⑶此文件是早期的MicrosoftWindowsDLL,而且和MicrosoftWindows保护方式不兼8容。⑷此DLL引用到其他不存在的DLL。⑸此DLL或所引用的DLL并不在所指定的目录中。解决方案⑴如果此文件是正文源文件,它必须编译并链接成可执行的DLL形式。⑵取得此文件相应的MicrosoftWindowsDLL版。⑶取得更新的版本。⑷取得此被引用的DLL并让它能提供其他DLL使用。⑸移动DLL到所引用的目录或将DLL所在的目录添加到路径中。14.内部错误(错误51)错误原因确保此错误不是由Error语句或Raise方法所产生。错误分析在VisualBasic中发生了内部出错。解决方案除非此调用不是由Error语句或Raise方法所产生,不然请与Microsoft产品支持服务联系,告知所发生的情况。15.错误的文件名或号(错误52)错误原因此错误发生在访问某指定文件时。错误分析⑴语句引用到如下的文件号或文件名:①Open语句中没有指定或虽有指定但已经关闭。②超出文件号范围(1–511)。⑵无效的文件名或文件号。解决方案⑴解决方案:①用Open语句中指定此文件名。注意,如果调用Close语句时没有参数,就会不小心关闭当前所有打开的文件,使所有的文件号无效。9②如果代码中会产生文件号的话,请确保产生的文件号应正确。⑵文件名必须遵循操作系统约定。在MicrosoftWindows中,可使用以下的约定:①文件或目录名称可以有两部分:文件名和任选性的扩展名。两部分以圆点隔开,例如,myfile.new。②文件名可达255字符。③文件名必须以字母或数字开头。它可以包含大小写字符(文