我有一个多年来遇到的奇怪问题。我有一个包含大量代码的工作簿,用于验证用户数据并且已经使用了很多年。用户报告该文件的最新版本崩溃了excel并给了他一个"自动化错误"。据我所知,对最新文件所做的更改很小,不应该造成这种情况。分析问题的原因是直截了当的,但它是如何发生的,为什么会发生以及如何解决它,我不知道。 出现问题的原因是下面的代码行,它需要一个数字,但是用户提供了一个字符串:
Ltrim(Str(Usersdata(UsersDataRow,UUID_Col)))
注意str上的大写字母S.以前版本的工作簿具有相同的行,但str是全部小写,并且不会崩溃excel。 两种文件语法检查完美。但最奇怪的是,当我在VBA编辑器中打开旧版本和新版本的文件时。 如果我编辑旧文件中的行并将str更改为Str,则编辑器会将其自动更正回所有小写str。 如果我编辑新工作簿并将Str更改为str,则编辑器会将其自动更新回init cap Str。 因此,我无法更正新文件。 这种行为很奇怪,我希望有人能告诉我它是如何发生的,可能还有如何解决它?
答案 0 :(得分:1)
关于修复主要问题,我建议更换行
Ltrim(Str(Usersdata(UsersDataRow,UUID_Col)))
具有更彻底的输入验证,可以处理字母数字值
正如Siddharth Rout在评论中所说:
您描述的症状表明 VBA名称空间已损坏
最常见的来源是变量名称,例如&#34; str &#34;,&#34; val &#34;,&#34; < strong>名称&#34;,&#34; 文件&#34;,&#34; 计数&#34;,&#34; 单元&#34;,&#34; 行&#34;等
检查名称冲突的快捷方法是在变量名称内单击并按 F1 ;
下面的实验可以证明问题:打开一个新的Excel,并为VBA Alt + F11
Sub test1()
Dim txt As String 'valid variable name
txt = Str("123") 'Str() remains with a capital S
End Sub
Sub test2()
Dim str As String 'invalid variable name
str = str("123") 'Str() is converted to lower case "s"
End Sub
VBA现已损坏,以下是修复它的一种方法:
在所有VBA模块中为&#34; str&#34;执行搜索和替换 (替换&#34; str&#34;用&#34; Str&#34;)
替换操作只会执行一次,因为VBA会自动转换&#34; str&#34;的所有其他实例。到&#34; Str&#34;在任何其他替换之前
下次打开文件时,名称空间现已恢复
(该程序强制重新编译为所有模块生成的P代码)
重新生成干净的P代码的另一种方法是将每个单独的标准模块导出为* .bas文件,将* .cls导出为类模块,将* .frm导出为用户表单代码,并将所有标准模块导入新的Excel文件